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

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

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Release Date
2021年7月
Content Type
プログラミング リファレンス
Publication ID
B035-1184-171K-JPN
Language
日本語 (日本)

Vantageは、パーティション化されたテーブルのパーティション式からテーブル レベルのパーティションCHECK制約を導出します。テーブル制約、パーティション制約、および名前付き制約に対して導出されるこの制約のテキストは、16,000文字以内にする必要があります。

次の図は、単一レベル パーティションに対して派生されたこのパーティションCHECK制約の2つの形式を示しています。形式は、パーティション式のデータ型がINTEGERかどうかによって異なります。
  • 1番目の形式は、INTEGERデータ型を持たず、RANGE_N関数だけで構成されてはいない、単一レベルの2バイト パーティション式に適用されます。

    このケースでは、式のデータ型をINTEGERにキャストする必要があります。

    CHECK (
      ( CAST ( partitioning_expression ) AS INTEGER )
    ) BETWEEN 1 AND max
  • 2番目の形式は、INTEGER型を持つ、シングルレベルの2バイト パーティション式に適用されます。
    CHECK ( partitioning_expression ) BETWEEN 1 AND max
    partitioning_expression
    単一レベル パーティション式から返されるパーティション数。
    max
    partitioning_expressionで定義された最大パーティション数。
    RANGE_N関数またはCASE_N関数以外のものでパーティション式を定義した場合、maxの値は65,535です。
    RANGE_N関数またはCASE_N関数だけを指定してパーティション式を定義した場合、maxの値は、パーティション式によって定義されるパーティションの数です。

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

  • 3番目の形式は、複数レベルの2バイト パーティション式に適用されます。

    次の図は、2バイト パーティションのマルチレベル パーティション プライマリ インデックスに対してVantageが導出する、このパーティションCHECK制約の形式を示しています。

    CHECK (
      /* nn */ partitioning_expression_1 IS NOT NULL
      AND partitioning_expression_2 IS NOT NULL
      [ partitioning_expression_n IS NOT NULL ] [...]
    )
    nn
    マルチレベル パーティションのレベルの数、またはパーティション式の数。nnには02~15の範囲の値(両端を含む)を指定できます。
    partitioning_expression_1
    1番目のマルチレベル パーティション式から返されるパーティション数
    partitioning_expression_2
    2番目のマルチレベル パーティション式から返されるパーティション数
    partitioning_expression_n
    n番目のマルチレベル パーティション式から返されるパーティション番号。
    パーティションに3つのレベルがある場合、暗黙的に指定される制約には3つのNOT NULLパーティション式が必要です。パーティションに10個のレベルがある場合、暗黙的に指定される制約には10個のNOT NULLパーティション式が必要です。以下、同様です。

例えば、以下のテーブルを作成するとします。

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_orderpriority CHARACTER(21),
  o_clerk         CHARACTER(16),
  o_shippriority  INTEGER,
  o_comment       VARCHAR(79))
PRIMARY INDEX (o_orderkey)
PARTITION BY (RANGE_N(o_custkey BETWEEN 0
                                AND 49999
                                EACH  100),
              RANGE_N(o_orderdate BETWEEN DATE '2000-01-01'
                                  AND     DATE '2006-12-31'
                                  EACH INTERVAL '1' MONTH))
UNIQUE INDEX (o_orderkey);

この2バイト パーティションによるマルチレベル パーティション プライマリ インデックスのDBC.TableConstraintsに格納されるパーティションCHECK制約のSQLテキストは、次のとおりです。

CHECK (/*02*/ RANGE_N(o_custkey   BETWEEN 0
                                  AND 49999
                                  EACH  100)
              IS NOT NULL
          AND RANGE_N(o_orderdate BETWEEN DATE '2000-01-01'
                                  AND     DATE '2006-12-31'
                                  EACH INTERVAL '1' MONTH)
              IS NOT NULL )

次のSELECT文を使用すると、マルチレベル パーティション オブジェクトのそれぞれについてインデックスの制約情報を取得できます。

SELECT *
FROM DBC.TableConstraints
WHERE ConstraintType = 'Q'
AND   SUBSTRING(TableCheck FROM 1 FOR 13) >= 'CHECK (/*02*/'
AND   SUBSTRING(TableCheck FROM 1 FOR 13) <= 'CHECK (/*15*/';