以下の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;