文字パーティションの行パーティションの変更に関するルール - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ定義言語 詳細トピック

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
17.00
Published
2020年6月
ft:locale
ja-JP
ft:lastEdition
2021-03-30
dita:mapPath
ja-JP/jpx1556733107962.ditamap
dita:ditavalPath
ja-JP/jpx1556733107962.ditaval
dita:id
B035-1184
Product Category
Software
Teradata Vantage

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する場合にのみ変更可能です。

変更可能な行パーティション テーブルの属性

ALTER TABLE文を使用して、行パーティション テーブルの次の属性を変更できます。
  • テーブル名
  • プライマリ インデックスまたは基本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の使用

マルチレベル パーティションでADD RANGEオプションまたはDROP RANGEオプションを使用して文字パーティションを変更できるのは、追加または削除の対象になっているパーティション レベルが以下のルールのいずれか1つまたはすべてに合致している場合です。
  • RANGE_Nパーティションのみを使用している。
  • 文字データの比較をしていない。
  • 以下の特別なパーティションの任意のまたは両方が指定されている。
    • NO RANGE
    • UNKNOWN

次のルールが適用されます。

条件 結果
セッションの照合がテーブルの照合と一致しない リクエストがアボートし、システムはリクエスト側にエラーを返します。
テーブルの照合がMULTINATIONALで、テーブルの作成後に、インストールされているMULTINATIONAL照合が変更された
テーブルの照合がCHARSET_COLLで、テーブルの作成後に、DBC.Translationの文字セットの定義が変更された
セッションのモードが、テーブルの定義時に有効だったモードと一致しない

これらのエラーのいずれかが発生した場合は、ALTER TABLE … REVALIDATEリクエストを実行して、パーティションを再検証する必要があります。