CASE_NまたはRANGE_N文字列を使用したパーティション式 も参照してください。
この操作に関するルールと制約事項を以下にまとめます(このほかに、ALTER TABLEリクエストを使用して行パーティション テーブルを変更する操作に関する他のすべてのルールも当てはまります)。
ALTER TABLE文を使用して文字パーティションを変更できるのは、以下の場合に限られます。
行のないテーブルでのPARTITION BY式
テーブルに行がなく、新しいPARTITION BY式を指定してパーティションを変更する場合。
文字データ比較を指定しないパーティション レベル
文字パーティションがマルチレベルで、文字データの比較が指定されていないパーティション レベルが少なくとも1つ(可能であればいくつか)存在する場合。
RANGE_N関数だけで構成されている非文字式パーティション レベルは、非文字パーティションの場合と同じように、ADD RANGEオプションまたはDROP RANGEオプションを使用して変更できます。
セッションの照合は、テーブルの照合と同じでなければなりません。セッション モードも、テーブルまたは結合インデックスが作成された時点で有効だったモードと同じでなければなりません。
例えば、ASCII照合を使用して、データベースdf2に、Teradataセッション モードで以下のような行パーティション テーブルordersを作成したとします。
CREATE SET TABLE df2.orders, NO FALLBACK, NO BEFORE JOURNAL, NO AFTER JOURNAL, CHECKSUM = DEFAULT ( o_orderkey INTEGER NOT NULL, o_custkey INTEGER, o_orderstatus CHARACTER(1) CHARACTER SET UNICODE NOT CASESPECIFIC, o_totalprice DECIMAL(13,2) NOT NULL, o_orderdate DATE FORMAT 'yyyy-mm-dd' NOT NULL, o_orderpriority CHARACTER(21) CHARACTER SET UNICODE NOT CASESPECIFIC, o_comment VARCHAR(79) CHARACTER SET UNICODE NOT CASESPECIFIC) PRIMARY INDEX OrdPI ( o_orderkey ) PARTITION BY (RANGE_N(o_orderpriority BETWEEN 'high' AND 'highest', 'low' AND 'lowest', 'medium' AND 'medium', NO RANGE OR UNKNOWN) ) UNIQUE INDEX (o_orderkey);
次の例では、このテーブルのDBC.IndexConstraintsビューに対して、BTEQを使ってリクエストを実行した場合の出力を示します。このビューの定義については、<Teradata Vantage™ - データ ディクショナリ、B035-1092>を参照してください。
SELECT * FROM DBC.IndexConstraints WHERE TableName = 'Orders' AND DatabaseName = 'DF2'; *** Query completed. One row found. 11 columns returned. *** Total elapsed time was 1 second.
DBC.IndexConstraints.CharSetID列には、DBC.CharTranslationsにある同じ列名のコードが含まれています。これが、対応するテーブルでCHARSET_COLL照合が使用されている場合に照合として使用される文字セットになります。
DBC.IndexConstraints.SessionMode列には、関連する文字パーティションの作成時または最終変更時に有効だったセッション モード(ANSIまたはTeradata)が組み込まれています。
DBC.IndexConstraintsに対して、BTEQを使用して前のSELECT例のリクエスト実行した場合に表示されるレポートの例を以下に示します。
DatabaseName DF2 TableName Orders IndexName OrdPI IndexNumber 1 ConstraintType Q ConstraintText CHECK ( (RANGE_N(o_orderpriority BETWEEN 'high' AND 'hi ConstraintCollation A CollationName ASCII CreatorName DF2 CreateTimeStamp 2015-08-20 13:02:30 CharSetID 127 SessionMode T
RANGE_N関数のみを使用するパーティション レベル
パーティションで、RANGE_N関数だけで構成されている文字行パーティション レベルが指定されている場合。これらのレベルは、特別なNO RANGEおよびUNKNOWNパーティションをADDまたはDROPする場合にのみ変更可能です。
変更可能な行パーティション テーブルの属性
- テーブル名
- プライマリ インデックスまたは基本AMPインデックスの構成要素になっている列(テーブルにプライマリ インデックスがある場合)、およびパーティション式(テーブルにデータが入っていない場合のみ)
- テーブルにプライマリ インデックスがある場合は、UPIをNUPIに変更できます。
- テーブルにプライマリ インデックスがある場合は、NUPIをUPIに変更できることもあります。
テーブルは空である必要がある
ALTER TABLE … MODIFY PARTITION BY文を使って、テーブルの文字パーティションを変更するには、テーブルに行がない状態になっている必要があります。
変更されたテーブルのセッションの照合
新しいパーティション式でも文字パーティションを指定する場合は、ALTER TABLE文の実行時に有効だったセッションの照合が、変更後のテーブルの照合になります。
パーティション関連の最適化(文字行パーティション レベルにかかわる遅延行パーティション削除や行パーティション排除など)は、テーブルの作成時に有効だった照合とセッションの照合が同じSQLリクエストだけに制限されます。
Teradata Databaseは、照合が一致しない場合でも、文字複数レベル パーティションの非文字行パーティション レベルで行パーティション排除を使用します。
パーティションCHECK制約
Teradata Databaseは、パーティション式からパーティションCHECK制約を取り込みます。2バイト パーティションでパーティション化されたテーブルに対するパーティションCHECK制約と8バイト パーティションでパーティション化されたテーブルに対するパーティションCHECK制約を参照してください。このインデックスCHECK制約のテキストは、16,000文字(約2,000パーティション)を超えてはなりません。
通常、文字パーティションの場合は、定義できるパーティションの数が非文字パーティションの場合よりもかなり少なくなるという制限があります。
パーティションのCHECK制約の制限が16,000文字であることからすると、文字パーティションで有効な制限は約2,000パーティションになります。非常に大きいテーブルで文字パーティションが大抵、最も効果的なのは、マルチレベル パーティション式の一部になっている場合です。複数のパーティション レベルで述部を組み合わせると、読み込む必要がある組み合わせパーティションの比率を、1つのシングルレベル文字パーティションのおおまかな制限値である
から、1つのテーブルで定義できるパーティションの最大数まで減らせる場合があります。マルチレベル パーティションでのADD RANGEまたはDROP RANGEの使用
- RANGE_Nパーティションのみを使用している。
- 文字データの比較をしていない。
- 以下の特別なパーティションの任意のまたは両方が指定されている。
- NO RANGE
- UNKNOWN
次のルールが適用されます。
条件 | 結果 |
---|---|
セッションの照合がテーブルの照合と一致しない | リクエストがアボートし、システムはリクエスト側にエラーを返します。 |
テーブルの照合がMULTINATIONALで、テーブルの作成後に、インストールされているMULTINATIONAL照合が変更された | |
テーブルの照合がCHARSET_COLLで、テーブルの作成後に、DBC.Translationの文字セットの定義が変更された | |
セッションのモードが、テーブルの定義時に有効だったモードと一致しない |
これらのエラーのいずれかが発生した場合は、ALTER TABLE … REVALIDATEリクエストを実行して、パーティションを再検証する必要があります。