17.05 - 例: マルチレベルのパーティション テーブルのためのパーティションの変更 - Advanced SQL Engine - Teradata Database

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

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

次のCREATE TABLEリクエストを使用してordersという名前のテーブルを作成したとします。

     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)
     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バイトのパーティション化を持っています。ordersが空の場合、次のALTER TABLE ... MODIFYリクエストを実行して、単一レベルの行パーティション プライマリ インデックスを持つように変更できます。

     ALTER TABLE orders 
       MODIFY
       PARTITION BY RANGE_N(
                    o_orderdate BETWEEN DATE '2000-01-01' 
                                AND     DATE '2006-12-31' 
                                EACH INTERVAL '1' MONTH);

すでにordersにはCREATE TABLEが定義されているとします。日付が2000-01-01から2000-12-31の間のo_orderdateの行がない場合、次の同等のALTER TABLEリクエストの1つを実行して、レベル2のパーティション式を変更できます。

     ALTER TABLE orders 
       MODIFY
       DROP RANGE#L2  BETWEEN DATE '2000-01-01' 
                      AND     DATE '2000-12-31'
       ADD RANGE      BETWEEN DATE '2007-01-01' 
                      AND     DATE '2007-12-31' 
                      EACH INTERVAL '1' MONTH;

または

     ALTER TABLE orders 
       MODIFY
       DROP RANGE#L2 
       WHERE orders.PARTITION#L2 BETWEEN 1 
                                 AND    12
       ADD RANGE#L2              BETWEEN DATE '2007-01-01' 
                                 AND     DATE '2007-12-31' 
                                 EACH INTERVAL '1' MONTH;

または

     ALTER TABLE orders 
       MODIFY
       DROP RANGE#L2 
       WHERE PARTITION#L2 IN (1,2,3,4,5,6,7,8,9,10,11,12)
       ADD RANGE BETWEEN DATE '2007-01-01' 
                 AND     DATE '2007-12-31' 
                 EACH INTERVAL '1' MONTH;

すでにordersにはCREATE TABLEが定義されているとします。2000-01-01から2000-12-31の間のo_orderdateの行が0、1、またはそれ以上ある場合、次のALTER TABLE ... MODIFYリクエストを実行して、行パーティションを変更できます。この場合、システムは削除された範囲から行を削除します。

     ALTER TABLE orders 
       MODIFY
       DROP RANGE#L2  BETWEEN DATE '2000-01-01' 
                      AND     DATE '2000-12-31'
       ADD RANGE      BETWEEN DATE '2007-01-01' 
                      AND     DATE '2007-12-31' 
                      EACH INTERVAL '1' MONTH
       WITH DELETE;

以前に定義したordersのCREATE TABLE定義を使用して1つのテーブルを作成していて、次のCREATE TABLEリクエストを使用して別のテーブルを作成したとします。

     CREATE TABLE old_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)
     UNIQUE PRIMARY INDEX (o_orderkey);

次のALTER TABLEリクエストは、2000-01-01から2000-12-31の間のo_orderdateの行が0、1、またはそれ以上である場合に、行パーティションを変更する1つの方法です。この場合、システムはordersから行を削除する前に、その行をold_ordersに保存します。

     ALTER TABLE orders 
       MODIFY
       DROP RANGE#L2  BETWEEN DATE '2000-01-01' 
                      AND     DATE '2000-12-31'
       ADD RANGE#L2   BETWEEN DATE '2007-01-01' 
                      AND     DATE '2007-12-31' 
                      EACH INTERVAL '1' MONTH
       WITH INSERT INTO old_orders;

レベル2にパーティションをさらに追加すると、レベル2で定義された最大値を超えるため、次のALTER TABLE ... MODIFYリクエストは入力されたテーブルに対して無効です。これは、レベル2に対するADDオプションがなく、超過している組み合わせパーティションは、デフォルトのADDオプションとしてレベル1に割り当てられていることが原因です。

     ALTER TABLE orders
       MODIFY
       DROP RANGE#L2  BETWEEN DATE '2000-01-01' 
                      AND     DATE '2000-12-31'
       ADD RANGE      BETWEEN DATE '2007-01-01' 
                      AND     DATE '2008-12-31'
                      EACH INTERVAL '1' MONTH
       WITH DELETE;

すでにorders_cpにはCREATE TABLEが定義されているとします。次のALTER TABLE … MODIFYリクエストを実行して、両方のレベルで行パーティション式を変更できます。

     ALTER TABLE orders_cp 
       MODIFY PRIMARY INDEX
       DROP RANGE BETWEEN     0 
                  AND        99
       ADD RANGE  BETWEEN 50000 
                  AND     50199 
                  EACH 100,
       DROP RANGE WHERE PARTITION#L2 = 1
       WITH DELETE;

レベル1でのパーティション数は2ずつ増加し、レベル2でのパーティション数は1ずつ減少します。同時に、レベル2のADD値は、0から1に増加します。