ALTER
TABLE
文のSPLIT
PARTITION
およびSPLIT
SUBPARTITION
句を使用して、1つのパーティションまたはサブパーティションのコンテンツを複数のパーティションまたはサブパーティションに再分散できます。複数のパーティションに分割すると、現在のパーティションに関連付けられているセグメントが破棄されます。それぞれの新しいパーティションは新しいセグメントを取得し、現在のソース・パーティションから指定されていない物理属性をすべて継承します。複数のパーティションに分割する場合、高速分割を使用することもできます。
拡張分割構文を使用して、AT
またはVALUES
句を指定せずにパーティション表の作成のSQL文と似ている新しいパーティションの説明のリストを指定できます。また、最新パーティションの説明のレンジまたはリスト値句は、ソース・パーティションの上限、および分割結果の最初(N-1)の新しいパーティションに指定されたバウンド値に基づいて導出されます。
次のSQL文は、パーティションを複数のパーティションに分割する例です。
ALTER TABLE SPLIT PARTITION p0 INTO (PARTITION p01 VALUES LESS THAN (25), PARTITION p02 VALUES LESS THAN (50), PARTITION p03 VALUES LESS THAN (75), PARTITION p04); ALTER TABLE SPLIT PARTITION p0 INTO (PARTITION p01 VALUES LESS THAN (25), PARTITION p02);
2番目のSQLの例では、パーティションp02
が元のパーティションp0
の上限を持ちます。
レンジ・パーティションをNパーティションに分割するには、パーティション化キー列の(N-1)値は、パーティションを分割するパーティションの範囲内で指定する必要があります。指定される新しい上限値(最上限値は含まない)は、昇順にする必要があります。N番目の新しいパーティションの上限には、分割されるパーティションの上限の値が割り当てられます。分割の結果のN番目の新しいパーティションの名前および物理属性は、オプションで指定できます。
リスト・パーティションをNパーティションに分割するには、リテラル値の(N-1)リストを指定する必要があり、それぞれで対応するパーティション・キー値を持つ行を挿入する最初(N-1)のパーティションを定義します。元のパーティションのその他の行は、元のパーティションの残りのリテラル値が値リストに含まれるN番目の新しいパーティションに挿入されます。2つの値リストを同じパーティション値に含むことはできません。指定される(N-1)値リストは、N番目の新しいパーティションが空であるため、現在のパーティションのすべてのパーティション値を含むことはできません。また、(N-1)値リストは、現在のパーティションに存在しないパーティション値を含むことはできません。
DEFAULT
リスト・パーティションまたはMAXVALUE
レンジ・パーティションを複数のパーティションに分割する場合、分割結果のN番目の新しいパーティションにDEFAULT
値またはMAXVALUE
がありますが、指定されたリテラル値リストまたは上限値を使用して最初(N-1)の新しいパーティションが作成されます。コンポジット・パーティション表のパーティションを複数のパーティションに分割する場合、分割結果の新しいパーティションのサブパーティションに関する数値、名前、バウンドおよび物理プロパティの継承について既存の動作を想定しています。SPLIT_TABLE_SUBPARTITION
句が同様に拡張され、レンジまたはリスト・サブパーティションをN番目の新しいサブパーティションに分割できます。
ローカルおよびグローバル索引に関するSQL文の動作は、変更されないままです。対応するローカル索引パーティションは、複数のパーティションに分割されます。パーティション表にLOB列が含まれる場合、SPLIT
PARTITION
句の既存のセマンティックが拡張された構文で適用されます。つまり、現在のパーティションのLOBデータおよび索引セグメントが削除され、新しいパーティションごとに各LOB列の新しいセグメントが作成されます。必要な条件が満たされると、高速分割の最適化が複数パーティションの分割操作に適用されます。
たとえば、次のSQL文は、レンジ・パーティション化されている表sales
のsales_Q4_2007
パーティションを次の年の四半期に対応する5つのパーティションに分割します。この例では、パーティションsales_Q4_2008
は、暗黙的に分割されたパーティションの上限になります。
ALTER TABLE sales SPLIT PARTITION sales_Q4_2007 INTO ( PARTITION sales_Q4_2007 VALUES LESS THAN (TO_DATE('01-JAN-2008','dd-MON-yyyy')), PARTITION sales_Q1_2008 VALUES LESS THAN (TO_DATE('01-APR-2008','dd-MON-yyyy')), PARTITION sales_Q2_2008 VALUES LESS THAN (TO_DATE('01-JUL-2008','dd-MON-yyyy')), PARTITION sales_Q3_2008 VALUES LESS THAN (TO_DATE('01-OCT-2008','dd-MON-yyyy')), PARTITION sales_Q4_2008);
リスト・パーティション化されているサンプル表customers
の場合、次の文はパーティションEuropeを3つのパーティションに分割します。
ALTER TABLE list_customers SPLIT PARTITION Europe INTO (PARTITION western-europe VALUES ('GERMANY', 'FRANCE'), PARTITION southern-europe VALUES ('ITALY'), PARTITION rest-europe);