16.20 - WITH DELETE - Teradata Database - Teradata Vantage NewSQL Engine

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

Product
Teradata Database
Teradata Vantage NewSQL Engine
Release Number
16.20
Release Date
2019年3月
Content Type
プログラミング リファレンス
Publication ID
B035-1144-162K-JPN
Language
日本語 (日本)

パーティション番号がNULLまたは有効な範囲外の値であると評価された行をすべて削除します。

WITH DELETE句は、NULLパーティション ハンドラとして参照されることがあります。結合インデックスに対するNULLパーティション ハンドラを指定することはできません。

例: 行パーティションの変更

この例では、現行パーティションおよび履歴パーティションが、パーティション式で解決されたCURRENT_TIMESTAMP関数またはCRRENT_DATE関数に関して定義されている場合、データを1つ以上の現行行パーティションおよび1つ以上の履歴行パーティションとしてパーティション化しなければならないときに、CURRENT_TIMESTAMP関数またはCURRENT_DATE関数をパーティション式で使用する最も適切な方法を示しています。

例は、ALTER TABLE DROP RANGEまたはALTER TABLE ADD RANGEリクエストを実行するたびに決定しなければならない明示的な日付を使用してテーブルに対して行パーティションを再定義するのではなく、ALTER TABLE TO CURRENTリクエストを使用して定期的にテーブルを調整し、古いデータを現在の行パーティションから1つ以上の履歴パーティションに移動させる方法を示しています。パーティション式でCURRENT_DATEおよびCURRENT_TIMESTAMP関数を使用する場合は、式をテーブルまたは結合インデックスに定義する前に、関数の使用目的について慎重に評価する必要があります。

次のテーブルの定義が2009年(その時点でのCURRENT年)に作成されたと仮定します。

     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_comment       VARCHAR(79))
     PRIMARY INDEX(o_orderkey)
     PARTITION BY RANGE_N(o_orderdate BETWEEN DATE '2004-01-01'
                                      AND     DATE '2010-12-31' 
                                      EACH INTERVAL '1' MONTH)
     UNIQUE INDEX(o_orderkey);

5年分の履歴データ、現行年のデータ、および次年のデータを記録するように、テーブルが行パーティション化されているとします。

次年に、注文に対する行パーティションを変更して、5年分の履歴データ、現行年のデータ、および次の年のデータを維持する場合、以下のようなALTER TABLEリクエストを2011年に実行できます。

     ALTER TABLE orders 
     MODIFY PRIMARY INDEX(o_orderkey)
     DROP RANGE WHERE PARTITION BETWEEN 1 AND 12
     ADD  RANGE BETWEEN DATE '2011-01-01' 
                AND     DATE '2011-12-31' 
                EACH INTERVAL '1' MONTH
     WITH DELETE;

この場合、新しい日付を計算し、それをリクエストのADD RANGE句で明示的に指定する必要があります。これには、リクエストを実行する年ごとに手動での介入が必要です。

最初に作成した方法でordersを作成する代わりに、パーティション式にCURRENT_DATE関数を使用して作成し、パーティションの変更を簡素化するとします。このリクエストは、CREATE TABLE日付時点で、直近の5年間の履歴データ、現行年のデータ、および翌年のデータが、全部で7年間のテーブルに保管されることを想定しており、これは前の事例と同じです。

この場合のCREATE TABLE DDLは次のようになります。

     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_comment       VARCHAR(79))
     PRIMARY INDEX (o_orderkey)
     PARTITION BY RANGE_N(o_orderdate BETWEEN 
                                       CAST(((EXTRACT(YEAR FROM                                        CURRENT_DATE)-5-1900)*10000+0101)                                        AS DATE)
                                      AND 
                                       CAST(((EXTRACT(YEAR FROM
                                       CURRENT_DATE)+1-1900)*10000+1231)
                                       AS DATE)
                                      EACH INTERVAL '1' MONTH)
     UNIQUE INDEX (o_orderkey);

次のALTER TABLE TO CURRENTリクエストを毎年実行するようにスケジュールすることができます。このリクエストは、パーティションを効率的に削除および追加することにより、行パーティション ウィンドウをずらしていきます。

     ALTER TABLE orders TO CURRENT WITH DELETE;

CURRENT_DATE関数を使用して行パーティション式を指定しなかった場合には、新しい日付に基づいたデータの再パーティション化が必要になるたびに文を変更する必要がありましたが、この文は変更する必要がありません。

前述のすべての事例では、行パーティションは年が変わるときに開始します。

最初の事例では、年の境目で毎回開始するようにパーティション化の変更が行なわれますが、ALTER TABLEリクエストで希望の日付を指定することにより、開始月をずらして年の途中の月で開始するように変更することも可能です。

2番目の例は、年の境目でのみ開始するように作成されています。

次のCREATE TABLEリクエストを使用して、月の初めにパーティション化を開始するようにできます。この場合、CREATE TABLE日付の時点で、直近の71ヶ月分の履歴、現行月のデータ、および今後の12ヶ月のデータが、全部で84ヶ月のテーブルに保管されます。

     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_comment       VARCHAR(79))
     PRIMARY INDEX (o_orderkey)
     PARTITION BY RANGE_N(o_orderdate BETWEEN 
                                       CAST(((EXTRACT(YEAR FROM
                                       CURRENT_DATE)-1900)*10000 +
                                       EXTRACT(MONTH FROM
                                        CURRENT_DATE)*100+01) AS DATE) -
                                        INTERVAL '71' MONTH
                                      AND 
                                       CAST(((EXTRACT(YEAR FROM
                                       CURRENT_DATE)+1-1900)*10000 +
                                       EXTRACT(MONTH FROM
                                        CURRENT_DATE)*100+01) AS DATE)+
                                        INTERVAL '13' MONTH - 
                                        INTERVAL '1' DAY
                                      EACH INTERVAL '1' MONTH)
     UNIQUE INDEX (o_orderkey);

次のALTER TABLE TO CURRENTリクエストを、毎月またはもっと期間を空けて(ただし、今後の月数が終わりになる前のいつかに)実行するようにスケジュールできます。

このリクエストは、パーティションを効率的に削除および追加することにより、ALTER TABLE TO CURRENT日付時点で直近の71ヶ月分の履歴データ、現行月のデータ、およびそれからの12ヶ月のデータを、合計84ヶ月のテーブルに含めることができるように、パーティション ウィンドウをずらします。

     ALTER TABLE orders TO CURRENT WITH DELETE;

次の例ではより単純な行パーティションを使用していますが、ユーザーが行パーティションを変更するためにALTER TABLE TO CURRENTリクエストを実行するとき、行を調整するためにテーブル全体のスキャンが必要な場合があるため、これが最適とは言えない可能性があります。この例では、CREATE TABLE日付の時点で、およそ2191日間分の履歴データ、現行日のデータ、およびおよそ365日の今後のデータを、合計でほぼ7年のテーブルに含めることができると仮定しています。

     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_comment       VARCHAR(79))
     PRIMARY INDEX (o_orderkey)
     PARTITION BY RANGE_N(o_orderdate BETWEEN CURRENT_DATE -
                                               INTERVAL '6' YEAR
                                      AND     CURRENT_DATE + 
                                               INTERVAL '1' YEAR
                                      EACH INTERVAL '1' MONTH)
     UNIQUE INDEX (o_orderkey);

次のALTER TABLE TO CURRENTリクエストを、毎日またはもっと期間を空けて(ただし、今後の日数が終わりになる前のいつかに)実行するようにスケジュールできます。このリクエストは、CURRENT_DATEと、最後にCREATE TABLEまたはALTER TABLE TO CURRENTリクエストが実行された日付が同じ場合にのみ、行パーティションの削除と追加を実行してパーティションのウィンドウを前進させます。それ以外の場合は、行を調整するためにテーブル全体をスキャンする必要があります。

     ALTER TABLE orders TO CURRENT WITH DELETE;

このリクエストは、最新のCREATE TABLEリクエストまたはALTER TABLE TO CURRENTリクエストが実行されたのと同じ日にALTER TABLE TO CURRENTリクエストを実行しない場合、非常に非効率的になる可能性があります。

移動しなければならない行数が増えるため、最後に解決された日付と新しく解決された日付との間の日数の増加に応じて、パフォーマンスが低下します。例えば、最後に解決された日付が2010年1月1日であり、次のALTER TABLE TO CURRENTリクエストが2010年2月2日に実行される場合、Teradata Databaseはorders表のすべての行を新しいパーティションに移動しなければなりません。

また、この例で指定されたパーティションを使用すると、CREATE TABLEまたはALTER TABLE TO CURRENTリクエストが2月29日に実行された場合に、システムは無効日エラーを報告するエラー メッセージを返します。