17.05 - PARTITION BY - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ定義言語 構文規則および例

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

テーブルを1つ以上のパーティション レベルでパーティションすることを指定します。

組み合わせパーティションの数だけ多種多様なパーティションを定義できます。ただし、特定のパーティションを定義することによる利便性およびそれがパフォーマンスと記憶域に及ぼすプラスとマイナスの両方の影響を考慮する必要があります。

行レベル セキュリティ制約列を含むパーティション レベルを指定することはできません。

文字パーティション レベルは、Kanji1またはKanjiSJISサーバー文字セットを使用する列または定数に指定できません。

以下のいずれのテーブル タイプにも、列パーティションを定義できません。
  • グローバル一時
  • 揮発

パーティションNoPIテーブルまたはPAテーブルは、列パーティション化される必要があり、行パーティション化される場合もあります。

パーティション式は外部またはSQL UDF、あるいは次のデータ型のいずれかを持つ列を指定することはできません。
  • UDT
  • ARRAY/VARRAY
  • BLOB
  • CLOB
  • Period
  • XML
  • Geospatial
  • JSON
  • DATASET

ただし、BEGINバウンド関数とENDバウンド関数を使用すると、間接的にPeriod列を参照できます。 例: ENDバインド関数を使用したCASE_Nパーティション式を参照してください。

例: CURRENT_DATE関数で定義されたパーティションNUPIの指定

この例は、パーティション式でCURRENT_DATE関数を使用して、生命保険の顧客テーブルを履歴(期限切れ)ポリシーおよび現行ポリシーにパーティション化します。

     CREATE TABLE customer (
       cust_name              CHARACTER(8),
       policy_number          INTEGER,
       policy_expiration_date DATE FORMAT 'YYYY/MM/DD')
     PRIMARY INDEX (cust_name, policy_number)
     PARTITION BY CASE_N(policy_expiration_date>= CURRENT_DATE, 
                                                  NO CASE);

例: 同じ列セットでUSIを定義した、RANGE_N関数によってパーティション化されるパーティションNUPIの指定

この例は、o_orderkey上でPPIを、また同じ列セット上でUSIを作成します。リクエストは、o_orderdate上のRANGE_N関数をパーティション式の基礎とします。

パーティション式がo_orderdateに基づいており、その列がプライマリ インデックス列セットに含まれていないため、PPIを固有として定義することはできません。

    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_orderdate BETWEEN DATE '1992-01-01' 
                                     AND     DATE '1998-12-31' 
                                     EACH INTERVAL '1' MONTH)
    UNIQUE INDEX (o_orderkey);

例: RANGE_N関数で定義された狭い範囲でのパーティション固有PIの指定

この例は、store_id、product_id、およびsales_dateに固有PIを作成し、そのパーティション式をsales_dateのRANGE_N関数に基づくようにします。セカンダリ インデックスは定義されません。

この例は、5ヶ月分の1日ごとのパーティションを提供します。

パーティション式がsales_dateに基づいており、その列がプライマリ インデックス列セットに含まれているため、PIを固有として定義することができます。

    CREATE TABLE sales (
      store_id      INTEGER NOT NULL,
      product_id    INTEGER NOT NULL,
      sales_date    DATE FORMAT 'yyyy-mm-dd' NOT NULL,
      total_revenue DECIMAL(13,2),
      total_sold    INTEGER,
      note          VARCHAR(256))
    UNIQUE PRIMARY INDEX (store_id, product_id, sales_date)
    PARTITION BY RANGE_N(sales_date BETWEEN DATE '2001-01-01' 
                                    AND     DATE '2001-05-31' 
                                    EACH INTERVAL '1' DAY);

例: USIを使用せず、RANGE_N関数でパーティション化されるパーティションNUPIの指定

この例は、非固有PIをl_orderkeyに作成し、そのパーティション式をl_shipdateのRANGE_N関数に基づくようにします。セカンダリ インデックスは定義されません。

    CREATE TABLE lineitem (
      l_orderkey      INTEGER NOT NULL,
      l_partkey       INTEGER NOT NULL,
      l_suppkey       INTEGER,
      l_linenumber    INTEGER,
      l_quantity      INTEGER NOT NULL,
      l_extendedprice DECIMAL(13,2) NOT NULL,
      l_discount      DECIMAL(13,2),
      l_tax           DECIMAL(13,2),
      l_returnflag    CHARACTER(1),
      l_linestatus    CHARACTER(1),
      l_shipdate      DATE FORMAT 'yyyy-mm-dd',
      l_commitdate    DATE FORMAT 'yyyy-mm-dd',
      l_receiptdate   DATE FORMAT 'yyyy-mm-dd',
      l_shipinstruct  VARCHAR(25),
      l_shipmode      VARCHAR(10),
      l_comment       VARCHAR(44))
    PRIMARY INDEX (l_orderkey)
    PARTITION BY RANGE_N(l_shipdate BETWEEN DATE '1992-01-01' 
                                    AND     DATE '1998-12-31' 
                                    EACH INTERVAL '1' MONTH);

例: EXTRACT関数で定義されたパーティションUPIの指定

この例は、store_id、product_id、およびsales_dateに固有PIを作成し、そのパーティション式をsales_dateのEXTRACT関数に基づくようにします。sales_by_monthにセカンダリ インデックスは定義されません。

    CREATE TABLE sales_by_month (
      store_id      INTEGER NOT NULL,
      product_id    INTEGER NOT NULL,
      sales_date    DATE FORMAT 'yyyy-mm-dd' NOT NULL,
      total_revenue DECIMAL(13,2),
      total_sold    INTEGER,
      note          VARCHAR(256))
    UNIQUE PRIMARY INDEX (store_id, product_id, sales_date)
    PARTITION BY EXTRACT(MONTH FROM sales_date);

例: RANGE_N関数で定義された広い範囲でのパーティションUPIの指定

次の例では、4年分の1週ごとのパーティションを提供します。

     CREATE TABLE sales_history (
      store_id      INTEGER NOT NULL,
      product_id    INTEGER NOT NULL,
      sales_date    DATE FORMAT 'yyyy-mm-dd' NOT NULL,
      total_revenue DECIMAL(13,2),
      total_sold    INTEGER,
      note          VARCHAR(256))
    UNIQUE PRIMARY INDEX (store_id, product_id, sales_date)
    PARTITION BY RANGE_N(sales_date BETWEEN DATE '1997-01-01' 
                                    AND     DATE '2000-12-31' 
                                    EACH INTERVAL '7' DAY);

例: CASE_Nパーティションで定義されたPI指定

次の例はstore_id、product_id、およびsales_date上にNUPIを作成し、total_revenueをそのCASE_Nパーティション式の基礎にします。total_revenueはプライマリ インデックス列セットで定義されていないので、このテーブルのプライマリ インデックスを固有として定義することはできません。

    CREATE TABLE store_revenue (
      store_id      INTEGER NOT NULL,
      product_id    INTEGER NOT NULL,
      sales_date    DATE FORMAT 'yyyy-mm-dd' NOT NULL,
      total_revenue DECIMAL(13,2),
      total_sold    INTEGER,
      note          VARCHAR(256))
    PRIMARY INDEX (store_id, product_id, sales_date)
    PARTITION BY CASE_N(total_revenue <   10000, 
                        total_revenue <  100000,
                        total_revenue < 1000000, 
                        NO CASE, UNKNOWN);

列セット(store_id、product_id、sales_date)の固有性を確認する場合、そのセットでUSIを定義します。

例: すべてのパーティション列がプライマリ インデックス定義に含まれないUPIの無効な指定

次の例ではstore_id、product_id、およびsales_date上に固有PIを作成しようとしますが、テーブルがパーティション化されるtotal_revenueが固有PI定義に含まれていないため、失敗します。すべてのパーティション列がインデックス定義に含まれていない限り、PIを固有にすることはできません。

    CREATE TABLE store_revenue (
      store_id      INTEGER NOT NULL,
      product_id    INTEGER NOT NULL,
      sales_date    DATE FORMAT 'yyyy-mm-dd' NOT NULL,
      total_revenue DECIMAL(13,2)
      total_sold    INTEGER
      note          VARCHAR(256))
    UNIQUE PRIMARY INDEX (store_id, product_id, sales_date)
    PARTITION BY CASE_N(total_revenue <   10000, 
                        total_revenue <  100000, 
                        total_revenue < 1000000, 
                        NO CASE, UNKNOWN);

例: 単純な算術式を使用するパーティションUPIの指定

次の例は、store_id、product_id、およびsales_dateに固有PPIを作成します。そのパーティション式をstore_idおよびproduct_idの単純な算術式に基づくようにします。セカンダリ インデックスは定義されません。

    CREATE TABLE store_product (
      store_id      INTEGER NOT NULL BETWEEN 0 AND 64,
      product_id    INTEGER NOT NULL BETWEEN 0 and 999,
      sales_date    DATE FORMAT 'yyyy-mm-dd' NOT NULL,
      total_revenue DECIMAL(13,2),
      total_sold    INTEGER,
      note          VARCHAR(256))
    UNIQUE PRIMARY INDEX (store_id, product_id, sales_date)
    PARTITION BY store_id*1000 + product_id + 1;