例: RANGE_N関数とNO RANGEパーティションを使用してパーティションが定義されている場合の、行の範囲のパーティションの削除 - Advanced SQL Engine - Teradata Database

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

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Published
2021年7月
Language
日本語
Last Update
2021-09-23
dita:mapPath
ja-JP/spp1591731285373.ditamap
dita:ditavalPath
ja-JP/wrg1590696035526.ditaval
dita:id
B035-1144
Product Category
Software
Teradata Vantage

以下のPPI基本テーブル定義があるとします。

     CREATE SET TABLE sales_table, NO FALLBACK, CHECKSUM = DEFAULT ,
                                   NO BEFORE JOURNAL, NO AFTER JOURNAL (
       product_code  CHARACTER(8) CHARACTER SET LATIN NOT CASESPECIFIC
                                  NOT NULL,
       sales_date    DATE FORMAT 'YYYY-MM-DD' NOT NULL NOT NULL,
       agent_id      CHARACTER(8) CHARACTER SET LATIN NOT CASESPECIFIC
                                  NOT NULL,
       quantity_sold INTEGER,
       product_desc  VARCHAR(50) CHARACTER SET LATIN NOT CASESPECIFIC)
     PRIMARY INDEX (product_code, sales_date, agent_id)
     PARTITION BY RANGE_N(sales_date BETWEEN DATE '2001-01-01'
                                     AND     DATE '2003-12-31'
                                     EACH INTERVAL '1' MONTH ,
                    NO RANGE);

次に、1つ以上の行パーティションをsales_tableから削除するALTER TABLEリクエストに対して保存テーブルとして動作するように、以下のPPI基本テーブルを定義します。

     CREATE SET TABLE sales_table_1, NO FALLBACK,
       NO BEFORE JOURNAL, NO AFTER JOURNAL, CHECKSUM = DEFAULT (
        product_code  CHARACTER(8) CHARACTER SET LATIN NOT CASESPECIFIC
                                   NOT NULL,
        sales_date    DATE FORMAT 'YYYY-MM-DD' NOT NULL,
        agent_id      CHARACTER(8) CHARACTER SET LATIN NOT CASESPECIFIC,
        quantity_sold INTEGER,
        product_desc  VARCHAR(50)  CHARACTER SET LATIN NOT CASESPECIFIC
                                   NOT NULL)
     PRIMARY INDEX (product_code, sales_date, agent_id)
     PARTITION BY RANGE_N(sales_date
                          BETWEEN DATE '2001-01-01' 
                          AND     DATE '2001-12-31' 
                          EACH INTERVAL '1' MONTH , NO RANGE);

sales_tableに以下の行のデータを入れます。

     INSERT INTO sales_table 
       VALUES ('PC2',DATE '2001-01-10','AG2',5,'PC'); 
     INSERT INTO sales_table 
       VALUES ('PC3',DATE '2001-03-10','AG2',5,'PC'); 
     INSERT INTO sales_table 
       VALUES ('PC4',DATE '2002-05-10','AG2',5,'PC'); 
     INSERT INTO sales_table 
       VALUES ('PC5',DATE '2003-07-10','AG2',5,'PC'); 
     INSERT INTO sales_table 
       VALUES ('PC5',DATE '2004-07-10','AG2',5,'PC');

次のSELECTリクエストは、意図した5行がsales_tableに正常に挿入されたことを示します。

     SELECT partition, product_code, sales_date, agent_id,
            quantity_sold, product_description 
     FROM sales_table 
     ORDER BY 1;
PARTITION product_code sales_date agent_id quantity_sold product_desc
--------- ------------ ---------- -------- ------------- ------------
       1 PC2          2001-01-10 AG2                  5 PC
       3 PC3          2001-03-10 AG2                  5 PC
      17 PC4          2002-05-10 AG2                  5 PC
      31 PC5          2003-07-10 AG2                  5 PC
      37 PC5          2004-07-10 AG2                  5 PC

行パーティションの範囲をsales_tableから削除して、削除された行をsales_table1に保存するために、WITH INSERT INTO sales_table1句を指定したALTER TABLE MODIFY要求を使用します。

     ALTER TABLE sales_table
       MODIFY 
       DROP RANGE BETWEEN DATE '2001-01-01' 
                  AND     DATE '2001-12-31' 
       WITH INSERT INTO sales_table1;
       *** Table has been modified.
       *** Total elapsed time was 1 second.

sales_tableの内容を選択して、削除した行パーティション内の行がテーブルから削除されているかどうかを確認します。

     SELECT PARTITION, product_code, sales_date, agent_id,
                       quantity_sold, product_desc
     FROM sales_table 
     ORDER BY 1;
*** Query completed. 5 rows found. 6 columns returned.
*** Total elapsed time was 1 second.
PARTITION product_code sales_date agent_id quantity_sold product_desc
--------- ------------ ---------- -------- ------------- ------------
        5 PC4          2002-05-10 AG2                  5 PC
       19 PC5          2003-07-10 AG2                  5 PC
       25 PC2          2001-01-10 AG2                  5 PC<<<<< 
       25 PC3          2001-03-10 AG2                  5 PC<<<<<
       25 PC5          2004-07-10 AG2                  5 PC<<<<<

基本テーブルsales_tableにはNO RANGEパーティションが含まれているため、行パーティションの範囲を削除しても行は削除されません。これらの行は、パーティション番号25番として識別されるNO RANGEパーティションに移動され、sales_table.に保持されます。

意図したとおりにするには、NO RANGEパーティションを指定しないでsales_tableを定義するか、ALTER TABLEリクエストを実行する前に行を削除しておく必要があります。

別のデータベースでsales_table、sales_table_cpの列パーティションのバージョンを作成し、同じデータベースでsales_table1、sales_table1_cpの列パーティションのバージョンも作成したとします。sales_table1_cpで削除された任意の行の保存、およびこれを実行するためのWITH INSERT INTO sales_table1_cp句の指定を目的とする場合、ALTER TABLE MODIFYリクエストを実行して、sales_table_cpから一定の範囲のパーティションを削除します。

     ALTER TABLE sales_table_cp
       MODIFY 
       DROP RANGE BETWEEN DATE '2001-01-01' 
                  AND     DATE '2001-12-31' 
       WITH INSERT INTO sales_table1_cp;
       *** Table has been modified.
       *** Total elapsed time was 1 second.

PPIバージョンのsales_tableに使用したリクエストと同じSELECT PARTITIONリクエスト(ただし、sales_table1ではなくsales_table1_cpから行を取得する)を実行して、削除したパーティション内の行が表から削除されていて、このリクエストが同一の結果セットを返していることを確認します。

     SELECT PARTITION, product_code, sales_date, agent_id,
                       quantity_sold, product_desc
     FROM sales_table_cp 
     ORDER BY 1;