次の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 MODIFYリクエストは、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に増加します。