8バイト パーティションでパーティション化されたテーブルに対するパーティションCHECK制約 - Advanced SQL Engine - Teradata Database

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

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

2バイトのパーティション プライマリ インデックスと同じように、Teradata Databaseは、パーティションCHECK制約を8バイト パーティションのパーティション式から導出します。

テーブル制約、パーティション制約、および名前付き制約に対して導出されるこのCHECK制約のテキストは16,000文字以下でなければなりません。

Teradata Databaseは、テーブルまたは結合インデックスのパーティション式について以下の条件のいずれか1つが当てはまる場合に、この形式のパーティションCHECK制約を使用します。
  • 少なくとも1つのレベルのパーティション式が、BIGINTデータ型のRANGE_N関数によってのみ定義されている。
  • 少なくとも1つのパーティション レベルのパーティション式で、ADD句が指定されている。
  • テーブルまたは結合インデックスが8バイト パーティションを持っている。
  • テーブルまたは結合インデックスが列パーティション化されている。
  • データの入っているテーブルで、レベル1以外の少なくとも1つのパーティション レベルのパーティション数が、ALTER TABLE文で変更された。
  • データの入っていないテーブルがALTER TABLE文で変更されたときに、レベル1以外の少なくとも1つのパーティション レベルのパーティション数が減少した。

8バイト パーティションによる複数レベル パーティションに対するこの形式のパーティションCHECK制約のテキストは、次のとおりです。これは、行パーティションと列パーティションの両方についてテーブルおよび結合インデックスに当てはまります。

CHECK ( /*nn bb cc*/ partitioning_constraint_1 [ AND partitioning_constraint_n ][...] )

ここで、nは、パーティション式に定義された最も高いパーティション レベルの数です。例えば、テーブルのパーティション式に18個のパーティション レベルがある場合、nは18です。パーティションCHECK制約では、18個のパーティション式が記述されます。

パーティションCHECK制約の個々のパーティション制約は、それぞれ、テーブルに対して定義された順番でパーティションのレベルに対応します。

説明

構文の要素 指定内容
nn パーティション レベルの数
  • 2バイト パーティションでは、nnは01以上、15以下です。
  • 8バイト パーティションでは、nnは01以上、62以下です。
bb 内部パーティション番号を行ヘッダーに格納するために使用されるバイト数
  • 2バイト パーティションでは、bb = 02。
  • 8バイト パーティションでは、bb = 08。
cc 列パーティション テーブルの列パーティション レベル。
  • 列パーティション化されていないテーブルでは、cc = 00。
  • 列パーティション テーブルでは、ccの範囲は01以上、nn以下。ここで、nnはテーブルのパーティション レベルの数。
partitioning_constraint_i パーティション レベルiのパーティション式。
  • テーブルまたは結合インデックスがパーティション レベルiで行パーティション化されている場合、partitioning_constraint_iの形式は次のとおりです。

    partitioning_expression_i /*i d+a*/ IS NOT NULL

  • テーブルまたは結合インデックスがパーティション レベルiで列パーティション化されている場合、partitioning_constraint_iの形式は次のとおりです。

    PARTITION#Li /*i d+a*/=1

説明

  • partitioning_expression_iは、レベルiのパーティション式です。
  • iは、テーブルまたは結合インデックスのパーティション式のパーティション レベルです。

    値の範囲は1以上、nnです。

    Teradata Databaseは、iの値について先行ゼロを格納しません。

  • dは、パーティション レベルiで定義されているパーティションの数です。

    列パーティション レベルでは、この値は、内部使用のために予約された2つの列パーティションを含みます。

    Teradata Databaseは、dの値について先行ゼロを格納しません。

  • aは、そのパーティション レベルに追加できるパーティションの数(0の場合あり)です。

    Teradata DatabaseがパーティションCHECK制約のこの形式を使用する場合、またはパーティション レベルが1の場合、aの値はINTEGERの数です。

    Teradata Databaseは、aの値について先行ゼロを格納しません。

ALTER TABLE文の詳細については、ALTER TABLE (テーブルの基本的なパラメータ)を参照してください。

以下の例では、Teradata Databaseが8バイト パーティションの場合に使用するパーティションCHECK制約の形式を示します。次のようなテーブルを作成します。

     CREATE TABLE orders (
       o_orderkey      INTEGER NOT NULL,
       o_custkey       INTEGER,
       o_orderstatus   CHARACTER(1) CASESPECIFIC,
       o_totalprice    DECIMAL(13,2) NOT NULL,
       o_orderdate     DATE FORMAT 'yyyy-mm-dd' NOT NULL,
       o_comment       VARCHAR(79))
     NO PRIMARY INDEX
     PARTITION BY (RANGE_N(o_custkey BETWEEN  0
                                     AND 100000
                                     EACH     1),
                   COLUMN)
     UNIQUE INDEX (o_orderkey);

各パーティション レベルのパーティション数の積は100,000です(100,000 * 1)。これは65,535より大きいので、このテーブルは8バイト パーティションになります。この8バイト パーティションに対するテーブル レベルのパーティションCHECK制約テキストは次のとおりです。

     CHECK (/*02 08 02*/ RANGE_N(o_custkey BETWEEN  0
                                           AND 100000
                                           EACH     1
            /*1 100001+485440633518572409*/
            IS NOT NULL AND PARTITION#L2 /*2 9+10*/=1)

次のSELECT文を使用すると、システム内で列パーティションを持つオブジェクトそれぞれについて、列パーティションのレベルを取得できます。

     SELECT DBaseId, TVMId, ColumnPartitioningLevel
            (TITLE ‘Column Partitioning Level’)
     FROM DBC.TableConstraints
     WHERE ConstraintType = 'Q'
     AND   ColumnPartitioningLevel >= 1
     ORDER BY DBaseId, TVMId;

2バイト パーティションによるシングルレベルおよびマルチレベルのパーティション テーブルおよび結合インデックスに対してTeradata Databaseが作成するテーブル レベルのパーティションCHECK制約については、パーティション化されたテーブルのルールと使用上の注意および複数レベル パーティションの制限を参照してください。