4.4 パーティション表および索引のメンテナンス操作
パーティション表および索引で実行できる、様々なメンテナンス操作があります。
次の各トピックで、表と索引の両方に対するパーティションおよびサブパーティション・メンテナンスを実行する操作について説明します。
ノート:
メンテナンス操作に影響される索引または索引パーティションの使用性が説明されている箇所では、次のことを考慮してください。
-
UNUSABLE
とマークできるのは、空ではない索引と索引パーティションのみです。空の場合には、USABLE
/UNUSABLE
のステータスは変更されません。 -
ステータスが
USABLE
の索引または索引パーティションは、後続のDMLで更新されます。
関連項目:
-
表の管理の詳細は、『Oracle Database管理者ガイド』を参照してください
-
パーティション表や索引を変更するためのパーティション化句の正確な構文、その使用に関する制限、および表の作成や変更に必要な特定の権限の詳細は、『Oracle Database SQL言語リファレンス』を参照してください
4.4.1 パーティションおよびサブパーティションの追加について
この項では、パーティション表に新しいパーティションを手動で追加する方法、および多くのパーティション索引に明示的にパーティションを追加できない理由を説明します。
この項では、次の項目について説明します。
4.4.1.1 レンジ・パーティション表へのパーティションの追加
表の最後の既存パーティションの後、あるいは表の最初または表の中間にパーティションを追加できます。
ハイエンド(既存の最後のパーティションの後ろのポイント)に新しいパーティションを追加するには、ALTER
TABLE
ADD
PARTITION
文を使用します。表の最初または中間にパーティションを追加するには、SPLIT
PARTITION
句を使用します。
たとえば、前の12か月分に加え、今月のデータも含む表sales
があるとします。1999年1月1日を基準に、表領域tsx
に格納される1月用のパーティションを追加します。
ALTER TABLE sales ADD PARTITION jan99 VALUES LESS THAN ( '01-FEB-1999' ) TABLESPACE tsx;
レンジ・パーティション表に関連付けられているローカルおよびグローバル索引は、使用可能なままです。
4.4.1.2 ハッシュ・パーティション表へのパーティションの追加
ハッシュ・パーティション表にパーティションを追加すると、データベースにより、新しいパーティションに既存のパーティション(データベースが選択)から再度ハッシュされた行が、ハッシュ関数で決定されたとおりに移入されます。
その結果、表にデータが含まれる場合、ハッシュ・パーティションの追加に時間がかかる場合があります。
次の文では、表scubagear
にハッシュ・パーティションを追加する2つの方法を示します。最初の文では、パーティション名がシステム生成される新しいハッシュ・パーティションが追加され、デフォルトの表領域に配置されます。2番目の文でも、新しいハッシュ・パーティションが追加されますが、そのパーティションには明示的にp_named
という名前が付けられ、表領域gear5
に作成されます。
ALTER TABLE scubagear ADD PARTITION; ALTER TABLE scubagear ADD PARTITION p_named TABLESPACE gear5;
次の表で説明するように、索引はUNUSABLE
とマークされます。
表のタイプ | 索引の動作 |
---|---|
通常(ヒープ) |
|
索引構成 |
|
4.4.1.3 リスト・パーティション表へのパーティションの追加
このトピックの例は、パーティションをリスト - パーティション表に追加する方法を示します。
次の文で、リスト・パーティション表に新しいパーティションを追加する方法を示します。この例では、追加されるパーティションに物理属性およびNOLOGGING
が指定されています。
ALTER TABLE q1_sales_by_region ADD PARTITION q1_nonmainland VALUES ('HI', 'PR') STORAGE (INITIAL 20K NEXT 20K) TABLESPACE tbs_3 NOLOGGING;
追加するパーティションを説明する一連のリテラル値は、表のどのパーティションにも存在していない必要があります。
デフォルトのパーティションがあるリスト・パーティション表にはパーティションを追加できませんが、デフォルトのパーティションを分割することはできます。分割することで、指定した値で定義された新しいパーティションと、デフォルトのパーティションとして残る2つ目のパーティションを効率的に作成できます。
リスト・パーティション表に関連付けられているローカルおよびグローバル索引は、使用可能なままです。
4.4.1.4 時間隔パーティション表へのパーティションの追加
時間隔パーティション表には、明示的にパーティションを追加できません。ある時間隔のデータが挿入されると、データベースによってその時間隔のパーティションが自動的に作成されます。
ただし、データ・ディクショナリのマテリアライズ化されていない時間隔パーティション表のパーティションの交換、つまり時間隔定義を超えてデータ・ディクショナリの明示的なエントリを持つ場合、ALTER
TABLE
LOCK
PARTITION
コマンドを使用して、パーティションを手動でマテリアライズ化する必要があります。
後続のパーティションの時間隔を変更するには、ALTER TABLE
文のSET INTERVAL
句を使用します。SET INTERVAL
句は、既存の時間隔パーティションをレンジ・パーティションに変換し、定義済レンジ・パーティションの上限を決定し、その上限を超えるデータのために必要な場合は指定された時間隔のパーティションを自動的に作成します。副次的作用として、時間隔パーティション表にはMAXVALUES
の表記がありません。
既存のレンジ・パーティションまたはレンジ - *コンポジット・パーティション表を、時間隔または時間隔 - *パーティション表に移行するには、SET INTERVAL
句も使用します。後続の時間隔パーティションの作成を無効化し、効率的にレンジ・パーティション表に戻すには、SET INTERVAL
句に空の値を使用します。作成された時間隔パーティションは、現在の上限値を使用してレンジ・パーティションに変換されます。
日付レンジの時間隔を増加するには、新しい時間隔の関連する上限値を指定していることを確認する必要があります。たとえば、1日単位の時間隔パーティション表トランザクションの時間隔パーティションの上限値が2007年1月30日で、月単位の時間隔パーティションに変更する場合、次の文ではエラーが発生します。
ALTER TABLE transactions SET INTERVAL (NUMTOYMINTERVAL(1,'MONTH'); ORA-14767: Cannot specify this interval with existing high bounds
月単位の時間隔に正常に変更するには、上限値が2007年2月1日の日付単位の別のパーティションを作成する必要があります。
LOCK TABLE transactions PARTITION FOR(TO_DATE('31-JAN-2007','dd-MON-yyyy') IN SHARE MODE; ALTER TABLE transactions SET INTERVAL (NUMTOYMINTERVAL(1,'MONTH');
時間隔パーティション表の下位パーティションはレンジ・パーティションです。時間隔パーティション表のレンジ部分にさらにパーティションを追加するには、レンジ・パーティションを分割します。
transactions
表の時間隔パーティション化を無効化するには、次の文を使用します。
ALTER TABLE transactions SET INTERVAL ();
4.4.1.5 コンポジット* - ハッシュ・パーティション表へのパーティションの追加について
パーティションは、パーティション・レベルとハッシュ・サブパーティション・レベルの両方で追加できます。
4.4.1.5.1 * - ハッシュ・パーティション表へのパーティションの追加
このトピックの例は、新規パーティションを[レンジ | リスト | 時間隔] - ハッシュ・パーティション表に追加する方法を示します。
時間隔 - ハッシュ・パーティション表の場合、時間隔パーティションは自動的に作成されます。指定した数のサブパーティションを追加できるSUBPARTITIONS
句を指定することも、特定のサブパーティションに名前を付けるSUBPARTITION
句を指定することも可能です。SUBPARTITIONS
またはSUBPARTITION
句が指定されていない場合、パーティションはサブパーティションの表レベルのデフォルトを継承します。時間隔 - ハッシュ・パーティション表の場合、マテリアライズ化されたレンジまたは時間隔パーティションに追加できるのはサブパーティションのみです。
この例では、2000年の第1四半期のデータが移入されるレンジ・パーティション q1_2000
を、レンジ - ハッシュ・パーティション表sales
に追加しています。表領域tbs5
に格納される8つのサブパーティションがあります。サブパーティションを、表圧縮を使用するように明示的に設定することはできません。サブパーティションはパーティション・レベルから圧縮属性を継承し、この例では圧縮された形式で格納されます。
ALTER TABLE sales ADD PARTITION q1_2000 VALUES LESS THAN (2000, 04, 01) COMPRESS SUBPARTITIONS 8 STORE IN tbs5;
4.4.1.5.2 * - ハッシュ・パーティション表へのサブパーティションの追加
ハッシュ・サブパーティションを[レンジ | リスト | 時間隔] - ハッシュ・パーティション表に追加するには、ALTER
TABLE
文のMODIFY
PARTITION
ADD
SUBPARTITION
句を使用します。
新しく追加されたサブパーティションには、同じパーティションのその他のサブパーティションから再度ハッシュされた行が、ハッシュ関数で決定されたとおりに移入されます。時間隔 - ハッシュ・パーティション表の場合、マテリアライズ化されたレンジまたは時間隔パーティションに追加できるのはサブパーティションのみです。
次の例では、表diving
のレンジ・パーティションlocations_us
に、表領域us1
に格納される新しいハッシュ・サブパーティションus_loc5
が追加されています。
ALTER TABLE diving MODIFY PARTITION locations_us ADD SUBPARTITION us_locs5 TABLESPACE us1;
UPDATE
INDEXES
を指定しない場合は、追加および再度ハッシュされたサブパーティションに対応する索引サブパーティションを再作成する必要があります。
4.4.1.6 コンポジット* - リスト・パーティション表へのパーティションの追加について
パーティションは、パーティション・レベルとリスト・サブパーティション・レベルの両方で追加できます。
4.4.1.6.1 * - リスト・パーティション表へのパーティションの追加
このトピックの例は、新規パーティションを[レンジ | リスト | 時間隔] - リスト・パーティション表に追加する方法を示します。
特定の時間隔のデータが挿入されると、データベースにより時間隔パーティションが自動的に作成されます。サブパーティションに名前を付け、値リストを提供するには、SUBPARTITION
句を指定できます。SUBPARTITION
句が指定されていない場合、パーティションはサブパーティション・テンプレートを継承します。サブパーティション・テンプレートがない場合には、単一のデフォルトのサブパーティションが作成されます。
例4-28の文では、レンジ - リスト・メソッドでパーティション化されたquarterly_regional_sales
表に、新しいパーティションを追加しています。指定されていないパーティションでは表レベルのデフォルトが継承されますが、この新しいパーティションにはいくつかの新しい物理属性が指定されています。
例4-28 レンジ - リスト・パーティション表へのパーティションの追加
ALTER TABLE quarterly_regional_sales ADD PARTITION q1_2000 VALUES LESS THAN (TO_DATE('1-APR-2000','DD-MON-YYYY')) STORAGE (INITIAL 20K NEXT 20K) TABLESPACE ts3 NOLOGGING ( SUBPARTITION q1_2000_northwest VALUES ('OR', 'WA'), SUBPARTITION q1_2000_southwest VALUES ('AZ', 'UT', 'NM'), SUBPARTITION q1_2000_northeast VALUES ('NY', 'VM', 'NJ'), SUBPARTITION q1_2000_southeast VALUES ('FL', 'GA'), SUBPARTITION q1_2000_northcentral VALUES ('SD', 'WI'), SUBPARTITION q1_2000_southcentral VALUES ('OK', 'TX') );
4.4.1.6.2 * - リスト・パーティション表へのサブパーティションの追加
リスト・サブパーティションを[レンジ | リスト | 時間隔] - リスト・パーティション表に追加するには、ALTER
TABLE
文のMODIFY
PARTITION
ADD
SUBPARTITION
句を使用します。
時間隔 - リスト・パーティション表の場合、マテリアライズ化されたレンジまたは時間隔パーティションに追加できるのはサブパーティションのみです。
次の文では、レンジ - リスト・パーティション表quarterly_regional_sales
の一連の既存のサブパーティションに、新しいサブパーティションを追加します。新しいサブパーティションは、表領域ts2
に作成されます。
ALTER TABLE quarterly_regional_sales MODIFY PARTITION q1_1999 ADD SUBPARTITION q1_1999_south VALUES ('AR','MS','AL') tablespace ts2;
4.4.1.7 コンポジット* - レンジ・パーティション表へのパーティションの追加について
パーティションは、パーティション・レベルとレンジ・サブパーティション・レベルの両方で追加できます。
4.4.1.7.1 * - レンジ・パーティション表へのパーティションの追加
このトピックの例は、新規パーティションを[レンジ | リスト | 時間隔] - レンジ・パーティション表に追加する方法を示します。
特定の時間隔のデータが挿入されると、データベースにより時間隔 - レンジ・パーティション表に時間隔パーティションが自動的に作成されます。特定のサブパーティションに名前を付け、レンジを指定するには、SUBPARTITION
句を指定します。SUBPARTITION
句が指定されていない場合、パーティションは、表レベルに指定されたサブパーティション・テンプレートを継承します。サブパーティション・テンプレートがない場合には、最大値がMAXVALUE
の単一のサブパーティションが作成されます。
例4-29では、2007年1月に注文された出荷品に関するデータが移入されるレンジ・パーティションp_2007_jan
を、レンジ - レンジ・パーティション表shipments
に追加します。3つのサブパーティションがあります。サブパーティションはパーティション・レベルから圧縮属性を継承し、この例では圧縮された形式で格納されます。
例4-29 レンジ - レンジ・パーティション表へのパーティションの追加
ALTER TABLE shipments ADD PARTITION p_2007_jan VALUES LESS THAN (TO_DATE('01-FEB-2007','dd-MON-yyyy')) COMPRESS ( SUBPARTITION p07_jan_e VALUES LESS THAN (TO_DATE('15-FEB-2007','dd-MON-yyyy')) , SUBPARTITION p07_jan_a VALUES LESS THAN (TO_DATE('01-MAR-2007','dd-MON-yyyy')) , SUBPARTITION p07_jan_l VALUES LESS THAN (TO_DATE('01-APR-2007','dd-MON-yyyy')) ) ;
4.4.1.7.2 * - レンジ・パーティション表へのサブパーティションの追加
レンジ・サブパーティションを[レンジ | リスト | 時間隔] - レンジ・パーティション表に追加するには、ALTER
TABLE
文のMODIFY
PARTITION
ADD
SUBPARTITION
句を使用します。
時間隔 - レンジ・パーティション表の場合、パーティションを追加できるのは、マテリアライズ化されたレンジまたは時間隔パーティションのみです。
次の例では、order_date
が2007年1月で、delivery_date
が2007年4月1日以降のすべての値が含まれるshipments
表に、レンジ・サブパーティションを追加します。
ALTER TABLE shipments MODIFY PARTITION p_2007_jan ADD SUBPARTITION p07_jan_vl VALUES LESS THAN (MAXVALUE) ;
4.4.1.8 参照パーティション表へのパーティションまたはサブパーティションの追加について
レンジ、ハッシュ、リストまたはコンポジット・パーティション表にパーティションやサブパーティションを追加できるのと同じように、参照パーティション定義の親表にもパーティションまたはサブパーティションを追加できます。
追加操作は、子参照パーティション表に自動的にカスケードされます。マスター表へのパーティションまたはサブパーティションの追加時に、DEPENDENT TABLES
句により、依存表に特定のプロパティを設定できます。
4.4.1.9 索引パーティションの追加
ローカル索引には、明示的にパーティションを追加できません。かわりに、基礎となる表にパーティションを追加する場合にのみ、ローカル索引に新しいパーティションが追加されます。
特に、表にローカル索引が定義されていて、パーティションを追加するALTER
TABLE
文を発行する場合には、一致するパーティションがローカル索引にも追加されます。データベースにより、新しい索引パーティションに名前とデフォルトの物理記憶域属性が割り当てられますが、ADD
PARTITION
操作が完了した後にそれらを変更できます。
ADD
PARTITION
操作で、最初に索引のデフォルト属性を変更することにより、索引パーティションの新しい表領域を事実上指定できます。たとえば、リスト・パーティション表q1_sales_by_region
に、ローカル索引q1_sales_by_region_locix
を作成したとします。「リスト・パーティション表へのパーティションの追加」に示されているように、新しいパーティションq1_nonmainland
を追加する前に次の文を発行した場合、対応する索引パーティションは表領域tbs_4
に作成されます。
ALTER INDEX q1_sales_by_region_locix MODIFY DEFAULT ATTRIBUTES TABLESPACE tbs_4;
それ以外の場合は、追加した後に、次の文を使用して索引パーティションをtbs_4
に移動する必要があります。
ALTER INDEX q1_sales_by_region_locix REBUILD PARTITION q1_nonmainland TABLESPACE tbs_4;
ALTER
INDEX
のADD
PARTITION
構文を使用して、ハッシュ・パーティション・グローバル索引にパーティションを追加できます。データベースによりハッシュ・パーティションが追加され、索引の既存のハッシュ・パーティションから再度ハッシュされた索引エントリが、ハッシュ関数で決定されたとおりに移入されます。次の文では、「ハッシュ・パーティション・グローバル索引の作成」に示されている索引hgidx
に、パーティションを追加します
ALTER INDEX hgidx ADD PARTITION p5;
最高位パーティションにはMAXVALUE
というパーティション・バウンドがあるため、レンジ・パーティション・グローバル索引にはパーティションを追加できません。新しい最高位パーティションを追加するには、ALTER
INDEX
SPLIT
PARTITION
文を使用します。
4.4.1.10 複数のパーティションの追加
ALTER
TABLE
文のADD
PARTITION
およびADD
SUBPARTITION
句を使用して、複数の新しいパーティションおよびサブパーティションを追加できます。
複数のパーティションを追加する場合、ローカルおよびグローバル索引操作は、単一のパーティションを追加する場合と同じ操作です。複数のパーティションおよびサブパーティションの追加は、レンジ、リストおよびシステムのパーティションまたはサブパーティションにのみサポートされています。
MAXVALUE
パーティションが定義されていない場合、レンジ・パーティションまたはコンポジット・レンジ・パーティション表の最高位(既存の最後のパーティションの後)に上限値の昇順で示される複数のレンジ・パーティションを追加できます。同様に、DEFAULT
パーティションが存在しない場合、一連の新しいパーティション値を使用して、複数のリスト・パーティションを表に追加できます。
個々のパーティションを指定することで、単一のSQL文を使用して複数のシステム・パーティションを追加できます。たとえば、次のSQL文は、複数のパーティションを例4-1で作成されたレンジ・パーティション表sales
に追加します。
ALTER TABLE sales ADD PARTITION sales_q1_2007 VALUES LESS THAN (TO_DATE('01-APR-2007','dd-MON-yyyy')), PARTITION sales_q2_2007 VALUES LESS THAN (TO_DATE('01-JUL-2007','dd-MON-yyyy')), PARTITION sales_q3_2007 VALUES LESS THAN (TO_DATE('01-OCT-2007','dd-MON-yyyy')), PARTITION sales_q4_2007 VALUES LESS THAN (TO_DATE('01-JAN-2008','dd-MON-yyyy')) ;
BEFORE
句を使用して、1つの既存のパーティションのみとの関係で複数の新しいシステム・パーティションを追加できます。次のSQL文は、BEFORE
句を使用して複数の個々のパーティションを追加する例を示します。
CREATE TABLE system_part_tab1 (number1 integer, number2 integer) PARTITION BY SYSTEM ( PARTITION p1, PARTITION p2, PARTITION p3, PARTITION p_last); ALTER TABLE system_part_tab1 ADD PARTITION p4, PARTITION p5, PARTITION p6 BEFORE PARTITION p_last; SELECT SUBSTR(TABLE_NAME,1,18) table_name, TABLESPACE_NAME, SUBSTR(PARTITION_NAME,1,16) partition_name FROM USER_TAB_PARTITIONS WHERE TABLE_NAME='SYSTEM_PART_TAB1'; TABLE_NAME TABLESPACE_NAME PARTITION_NAME ------------------ ------------------------------ ---------------- SYSTEM_PART_TAB1 USERS P_LAST SYSTEM_PART_TAB1 USERS P6 SYSTEM_PART_TAB1 USERS P5 SYSTEM_PART_TAB1 USERS P4 SYSTEM_PART_TAB1 USERS P3 SYSTEM_PART_TAB1 USERS P2 SYSTEM_PART_TAB1 USERS P1
4.4.2 パーティションおよびサブパーティションの結合について
パーティションの結合は、ハッシュ・パーティション表または索引のパーティション数や、* - ハッシュ・パーティション表のサブパーティション数を減らす方法の1つです。
ハッシュ・パーティションを結合すると、そのコンテンツはハッシュ関数で決定された1つ以上の残りのパーティションに再配布されます。結合される特定のパーティションはデータベースにより選択され、コンテンツの再配布後に削除されます。参照パーティション表定義の親表のハッシュ・パーティションまたはサブパーティションを結合すると、参照パーティション表は新しいパーティション化定義を自動的に継承します。
次の表で説明するように、索引パーティションはUNUSABLE
とマークされます。
表のタイプ | 索引の動作 |
---|---|
通常(ヒープ) |
|
索引構成 |
|
この項では、次の項目について説明します。
4.4.2.1 ハッシュ・パーティション表でのパーティションの結合
ハッシュ・パーティション表でパーティションを結合する場合には、ALTER
TABLE
COALESCE
PARTITION
文が使用されます。
次の文では、パーティションを結合することにより、表のパーティション数が1つ削減されています。
ALTER TABLE ouu1 COALESCE PARTITION;
4.4.2.2 * - ハッシュ・パーティション表でのサブパーティションの結合
ALTER
TABLE
COALESCE
SUBPARTITION
文は、ハッシュ・パーティション表内のサブパーティションの結合に使用されます。
次の文により、パーティションus_locations
のサブパーティションのコンテンツが、同じパーティションの1つ以上の残りのサブパーティション(ハッシュ関数で決定)に分散されます。時間隔パーティション表の場合、結合できるのは、マテリアライズ化されたレンジまたは時間隔パーティションのハッシュ・サブパーティションのみです。基本的に、この操作は、「* - ハッシュ・パーティション表へのサブパーティションの追加」で説明したMODIFY
PARTITION
ADD
SUBPARTITION
句の逆の操作です。
ALTER TABLE diving MODIFY PARTITION us_locations COALESCE SUBPARTITION;
4.4.2.3 ハッシュ・パーティション・グローバル索引の結合
ALTER
INDEX
のCOALESCE
PARTITION
句を使用して、ハッシュ・パーティション・グローバル索引の索引パーティション数を1つ減らすようにデータベースに指示できます。
データベースにより、ハッシュ・パーティションの要件に基づいて、結合するパーティションが選択されます。次の文では、「ハッシュ・パーティション・グローバル索引の作成」で作成されたhgidx
索引のパーティション数が1つ削減されます。
ALTER INDEX hgidx COALESCE PARTITION;
4.4.3 パーティションおよびサブパーティションの削除について
レンジ、時間隔、リストまたはコンポジット* - [レンジ | リスト]パーティション表からパーティションを削除できます。
時間隔パーティション表の場合は、マテリアライズ化されたレンジまたは時間隔パーティションのみ削除できます。ハッシュ・パーティション表またはコンポジット* - ハッシュ・パーティション表のハッシュ・サブパーティションの場合は、かわりに、結合操作を実行する必要があります。
参照パーティション表からパーティションを削除することはできません。かわりに、親表での削除操作がすべての子表にカスケードされます。
この項では、次の項目について説明します。
4.4.3.1 表パーティションの削除
表パーティションを削除するには、ALTER
TABLE
SQL文でDROP
PARTITION
またはDROP
SUBPARTITION
を使用します。
次の文を使用して、表、パーティションまたはサブパーティションを削除できます。
-
ALTER
TABLE
DROP
PARTITION
: 表パーティションを削除する場合 -
ALTER
TABLE
DROP
SUBPARTITION
: コンポジット* - [レンジ | リスト]パーティション表のサブパーティションを削除する場合
パーティション内のデータを保持するには、DROP
PARTITION
文ではなくMERGE
PARTITION
文を使用します。
パーティションを削除せずにパーティションのデータを削除するには、TRUNCATE
PARTITION
文を使用します。
表にローカル索引が定義されている場合、この文では、ローカル索引からも一致するパーティションまたはサブパーティションが削除されます。次のいずれかが当てはまる場合、すべてのグローバル索引またはパーティション・グローバル索引のすべてのパーティションがUNUSABLE
とマークされます。
-
UPDATE
INDEXES
を指定する(索引構成表には指定できません。かわりにUPDATE
GLOBAL
INDEXES
を使用してください)。 -
削除するパーティションまたはそのサブパーティションが空である。
ノート:
-
表にパーティションが1つだけ含まれる場合、そのパーティションは削除できません。かわりに表を削除する必要があります。
-
時間隔パーティション表または時間隔 - *コンポジット・パーティション表のレンジ・パーティション・セクションにある最高位のレンジ・パーティションは削除できません。
-
非同期グローバル索引メンテナンスでは、パーティション削除の索引更新操作はメタデータのみで、すべてのグローバル索引が有効なままです。
-
Oracle Databaseのごみ箱の設定にかかわらず、パーティションの削除によってそのパーティションがごみ箱に入れられることはありません。削除したパーティションは、ただちにシステムから削除されます。
次の項では、表パーティションの削除に関するいくつかのシナリオを示します。
関連項目:
-
パーティションのマージの詳細は、「パーティションおよびサブパーティションのマージについて」を参照してください
-
パーティションの切捨ての詳細は、「パーティションおよびサブパーティションの切捨てについて」を参照してください
-
パーティションを削除する非同期グローバル索引メンテナンスの詳細は、「パーティションを削除および切り捨てる非同期グローバル索引メンテナンス」を参照してください
4.4.3.1.1 データおよびグローバル索引を含む表からのパーティションの削除
いくつかの方法を使用して、データおよびグローバル索引を含む表からパーティションを削除できます。
パーティションにデータが含まれている場合や、表に1つ以上のグローバル索引が定義されている場合には、次のいずれかの方法(方法1、2または3)を使用して表パーティションを削除します。
方法1
グローバル索引をメンテナンスせずにALTER
TABLE
DROP
PARTITION
文を発行します。その後、索引(または索引パーティション)がUNUSABLE
とマークされるため、(パーティション化されているかどうかに関係なく)すべてのグローバル索引を再作成する必要があります。次の文で、sales
表からパーティションdec98
を削除し、パーティション化されていないグローバル索引を再作成する例を示します。
ALTER TABLE sales DROP PARTITION dec98; ALTER INDEX sales_area_ix REBUILD;
索引sales_area_ix
がレンジ・パーティション・グローバル索引の場合には、その索引のすべてのパーティションを再作成する必要があります。さらに、1文で索引のすべてのパーティションを再作成することはできません。索引の各パーティションに対して、別々にREBUILD
文を発行する必要があります。次の文では、索引パーティションjan99_ix
からdec99_ix
を再作成します。
ALTER INDEX sales_area_ix REBUILD PARTITION jan99_ix; ALTER INDEX sales_area_ix REBUILD PARTITION feb99_ix; ALTER INDEX sales_area_ix REBUILD PARTITION mar99_ix; ... ALTER INDEX sales_area_ix REBUILD PARTITION dec99_ix;
これは、削除されるパーティションに表の合計データの大部分が含まれる大規模な表に最適な方法です。非同期グローバル索引メンテナンスは、索引メンテナンスを必要とせずにグローバル索引を有効なまま保持しますが、UPDATE
INDEXES
句を使用してこの新しい機能を有効にする必要があります。この動作によって、下位互換性が保証されます。
方法2
ALTER
TABLE
DROP
PARTITION
文を発行する前に、DELETE
文を発行してパーティションからすべての行を削除します。DELETE
文により、グローバル索引が更新されます。
たとえば、最初のパーティションを削除するには、次の文を発行します。
DELETE FROM sales partition (dec98); ALTER TABLE sales DROP PARTITION dec98;
これは、小規模な表、または削除されるパーティションに含まれる表の合計データの割合が少ない場合に、大規模な表に最適な方法です。
方法3
ALTER
TABLE
文にUPDATE
INDEXES
を指定します。実行すると、新しい非同期グローバル索引メンテナンスが利用されます。索引は有効なまま変化しません。
ALTER TABLE sales DROP PARTITION dec98 UPDATE INDEXES;
4.4.3.1.2 データおよび参照整合性制約を含むパーティションの削除
いくつかの方法を使用して、データおよび参照整合性制約を含むパーティションを削除できます。
パーティションにデータが含まれ、表に参照整合性制約がある場合には、次のいずれかの方法(方法1または2)を選択して表パーティションを削除します。この表にあるのはローカル索引のみであるため、索引を再作成する必要はありません。
方法1
削除するパーティションのデータを参照しているデータがない場合は、参照表の整合性制約を無効化してALTER
TABLE
DROP
PARTITION
文を発行し、整合性制約を再度有効化します。
これは、削除されるパーティションに表の合計データの大部分が含まれる大規模な表に最適な方法です。削除するパーティションのデータを参照するデータがある場合には、参照元のすべてのデータを削除して、参照整合性制約を再度有効化できるようにしてください。
方法2
参照表にデータがある場合は、ALTER
TABLE
DROP
PARTITION
文を発行する前に、DELETE
文を発行してパーティションからすべての行を削除できます。DELETE
文によって、参照整合性制約が施行されます。また、トリガーが起動されて、REDOログとUNDOログが生成されます。ON DELETE CASCADE
オプションを指定して制約を作成すると削除が成功し、参照表からもすべての行が削除されます。
DELETE FROM sales partition (dec94); ALTER TABLE sales DROP PARTITION dec94;
これは、小規模な表、または削除されるパーティションに含まれる表の合計データの割合が少ない場合に、大規模な表に最適な方法です。
4.4.3.2 時間隔パーティションの削除
時間隔パーティション表の時間隔パーティションを削除できます。
この操作により、その時間隔のデータのみが削除され、時間隔定義はそのまま残ります。削除されたばかりの時間隔にデータが挿入された場合は、データベースにより時間隔パーティションが再度作成されます。
時間隔パーティション表のレンジ・パーティションも削除できます。時間隔パーティション表のレンジ・パーティションを削除するルールは、レンジ・パーティション表のレンジ・パーティションの削除ルールと同じです。一連のレンジ・パーティションの中間にあるレンジ・パーティションを削除すると、次のレンジ・パーティションの下限が、削除したレンジ・パーティションの下限に切り替わります。時間隔パーティション表のレンジ・パーティション・セクションにある最高位のレンジ・パーティションは削除できません。
次の例では、sales
表から2007年9月の時間隔パーティション表を削除します。ローカル索引しかないため、索引は無効化されません。
ALTER TABLE sales DROP PARTITION FOR(TO_DATE('01-SEP-2007','dd-MON-yyyy'));
4.4.3.3 索引パーティションの削除
ローカル索引のパーティションは明示的に削除できません。かわりに、基礎となる表からパーティションを削除した場合にのみ、ローカル索引パーティションが削除されます。
グローバル索引パーティションが空の場合は、ALTER
INDEX
DROP
PARTITION
文を発行することでそのパーティションを明示的に削除できます。ただし、グローバル索引パーティションにデータが含まれる場合は、パーティションを削除すると次の最高位パーティションがUNUSABLE
とマークされる原因になります。たとえば、索引パーティションP1を削除する必要があり、P2が次の最高位パーティションであるとします。次の文を発行する必要があります。
ALTER INDEX npr DROP PARTITION P1; ALTER INDEX npr REBUILD PARTITION P2;
ノート:
グローバル索引では、最高位パーティションを削除できません。
4.4.3.4 複数のパーティションの削除
SQL ALTER
TABLE
文のDROP
PARTITION
およびDROP
SUBPARTITION
句を使用して、レンジまたはリスト・パーティション表から複数のパーティションまたはサブパーティションを削除できます。
たとえば、次のSQL文は、レンジ・パーティション表sales
から複数のパーティションを削除します。
ALTER TABLE sales DROP PARTITION sales_q1_2008, sales_q2_2008, sales_q3_2008, sales_q4_2008;
表のすべてのパーティションを削除できません。複数のパーティションを削除する場合、ローカルおよびグローバル索引操作は、単一のパーティションを削除する場合と同じ操作です。
4.4.4 パーティションおよびサブパーティションの交換について
データ・セグメントを交換することで、パーティションまたはサブパーティションを非パーティション表に、非パーティション表をパーティション表のパーティションまたはサブパーティションに変換できます。
ハッシュ・パーティション表をコンポジット* - ハッシュ・パーティション表のパーティションに変換することも、コンポジット* - ハッシュ・パーティション表のパーティションをハッシュ・パーティション表に変換することも可能です。同様に、レンジ - リスト・パーティション表をコンポジット* - レンジまたはリスト・パーティション表のパーティションに変換することも、コンポジット* - レンジまたはリスト・パーティション表のパーティションをレンジ - リスト・パーティション表に変換することも可能です。
表パーティションの交換は、パーティション表の内外で迅速にデータを取得するのに便利です。たとえば、データ・ウェアハウス環境で、パーティションの交換を行うと、新しい増分データの既存のパーティション表への高速データ・ローディングが容易になります。
交換プロセスでは、ソースのデータがターゲットに移動され、ターゲットのデータがソースに移動されることに注意してください。
OLTP環境やデータ・ウェアハウス環境では、パーティション表の古いデータ・パーティションを交換することで利点が得られます。実際には削除されずにパーティション表からデータがパージされ、後から個別にアーカイブできます。
パーティションを交換すると、ロギング属性が保持されます。INCLUDING
INDEXES
句でローカル索引も交換するかどうか、およびWITH
VALIDATION
句で行が適切にマッピングされていることを検証するかどうかをオプションで指定できます。
ノート:
パーティションの交換操作にWITHOUT
VALIDATION
を指定する場合、これに関連するのはデータ・ディクショナリの更新のみであるため、通常は高速な操作です。ただし、交換操作に関連する表またはパーティション表に主キーがある場合や一意制約が有効化されている場合には、制約の整合性を維持するため、交換操作はWITH
VALIDATION
が指定されているように実行されます。
この検証アクティビティのオーバーヘッドを避けるには、パーティションの交換操作を実行する前に、各制約に対して次の文を発行します。
ALTER TABLE table_name DISABLE CONSTRAINT constraint_name KEEP INDEX
交換後に制約を有効化します。
WITHOUT
VALIDATION
を指定する場合は、交換するデータが交換するパーティションに含まれることを確認する必要があります。間違ったパーティションに不正に挿入されたレコードを識別するには、ORA_PARTITION_VALIDATION
SQL関数を使用できます。
UPDATE
INDEXES
を指定しないかぎり、パーティションをUNUSABLE
として交換する表のグローバル索引またはすべてのグローバル索引パーティションが、Oracle Databaseによりマークされます。交換が行われる表のグローバル索引またはグローバル索引パーティションは、無効化されたままになります。
索引構成表にはUPDATE
INDEXES
は使用できません。かわりにUPDATE
GLOBAL
INDEXES
を使用してください。
DBMS_STATS
表プリファレンスのINCREMENTAL
がtrueに設定され、INCREMENTAL_LEVEL
がTABLE
に設定されると、統計が非パーティション表で収集された場合にパーティション表の増分統計がパーティション交換操作でメンテナンスされます。
ノート:
仮想列の列統計が不適当な場合、その古い統計を保持するのではなく、列統計は削除されます。この削除についての情報は、アラート・ログ・ファイルに書き込まれます。
この項では、次の項目について説明します。
関連項目:
-
パーティションのコンテンツの検証の詳細は、パーティション化キーを参照してください
-
パーティション表および索引の詳細を監視するビューの詳細は、「パーティション表および索引の情報の表示」を参照してください
-
増分統計の詳細は、『Oracle Database SQLチューニング・ガイド』を参照してください
-
DBMS_STATS
パッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください
4.4.4.1 パーティション表と交換するための表の作成
FOR
EXCHANGE
WITH
句を使用すると、パーティション表の形状と完全に一致し、パーティション交換コマンドに適するように表を作成できます。ただし、索引はこのコマンドの操作としては作成されません。
CREATE
TABLE
のFOR
EXCHANGE
WITH
句は、非パーティション表とパーティション表の完全一致を提供するため、CREATE
TABLE
AS
SELECT
文が改善されます。
次のリストは、CREATE
TABLE
FOR EXCHANGE WITH
DDL操作の効果をまとめたものです。
-
このDDL操作のユースケースにより、パーティション交換DDLで使用される表の作成が容易になります。
-
この操作により、列の順序および列のプロパティの点で交換対象の表のクローンが作成されます。
-
列の名前は変更できません。作成される表は、交換対象の表から名前を継承します。
-
DDL操作中に指定できる論理プロパティのみが、表のパーティション化指定です。
パーティション化句は、コンポジット・パーティション表のパーティションとの交換にのみ関連します。この場合、nサブパーティションを含むパーティションは、サブパーティションと一致するnパーティションを含むパーティション表と交換されます。このシナリオのこの交換には、パーティション化句の定義が必要です。
サブパーティション化は、パーティション間で非対象となります。パーティション化句は、交換対象のパーティションのサブパーティション化と完全に一致する必要があります。
-
指定できる物理プロパティは、主な表セグメント属性です。
-
このDDL操作でコピーされる列プロパティには、使用不可の列、非表示の列、仮想式の列、関数索引式の列、他の内部設定や属性などが含まれます。
次に、列の順序付けとプロパティについて既存の表の形式を模倣する表を作成するには、CREATE
TABLE
文でFOR
EXCHANGE
WITH
句を使用する例を示します。
例4-30 CREATE TABLEのFOR EXCHANGE WITH句の使用
CREATE TABLE sales_by_year_table ( prod_id NUMBER NOT NULL, cust_id NUMBER NOT NULL, time_id DATE NOT NULL, channel_id NUMBER NOT NULL, promo_id NUMBER NOT NULL, quantity_sold NUMBER(10,2) NOT NULL, amount_sold NUMBER(10,2) NOT NULL ) PARTITION BY RANGE (time_id) (PARTITION sales_2016 VALUES LESS THAN (TO_DATE('01-01-2017','dd-mm-yyyy')), PARTITION sales_2017 VALUES LESS THAN (TO_DATE('01-01-2018','dd-mm-yyyy')), PARTITION sales_2018 VALUES LESS THAN (TO_DATE('01-01-2019','dd-mm-yyyy')), PARTITION sales_2019 VALUES LESS THAN (TO_DATE('01-01-2020','dd-mm-yyyy')), PARTITION sales_future VALUES LESS THAN (MAXVALUE) ); DESCRIBE sales_by_year_table Name Null? Type ----------------------------------------- -------- ---------------------------- PROD_ID NOT NULL NUMBER CUST_ID NOT NULL NUMBER TIME_ID NOT NULL DATE CHANNEL_ID NOT NULL NUMBER PROMO_ID NOT NULL NUMBER QUANTITY_SOLD NOT NULL NUMBER(10,2) AMOUNT_SOLD NOT NULL NUMBER(10,2) CREATE TABLE sales_later_year_table FOR EXCHANGE WITH TABLE sales_by_year_table; DESCRIBE sales_later_year_table Name Null? Type ----------------------------------------- -------- ---------------------------- PROD_ID NOT NULL NUMBER CUST_ID NOT NULL NUMBER TIME_ID NOT NULL DATE CHANNEL_ID NOT NULL NUMBER PROMO_ID NOT NULL NUMBER QUANTITY_SOLD NOT NULL NUMBER(10,2) AMOUNT_SOLD NOT NULL NUMBER(10,2)
4.4.4.2 レンジ、ハッシュまたはリスト・パーティションの交換
レンジ、ハッシュまたはリスト・パーティション表のパーティションを非パーティション表と交換する場合、またはその逆を行う場合は、ALTER
TABLE
EXCHANGE
PARTITION
文を使用します。
次に、レンジ・パーティションを非パーティション表と交換する例を示します。
例4-31 レンジ・パーティションの交換
CREATE TABLE sales_future_table ( prod_id NUMBER NOT NULL, cust_id NUMBER NOT NULL, time_id DATE NOT NULL, channel_id NUMBER NOT NULL, promo_id NUMBER NOT NULL, quantity_sold NUMBER(10,2) NOT NULL, amount_sold NUMBER(10,2) NOT NULL ) PARTITION BY RANGE (time_id) (PARTITION s_2020 VALUES LESS THAN (TO_DATE('01-01-2021','dd-mm-yyyy')), PARTITION s_2021 VALUES LESS THAN (TO_DATE('01-01-2022','dd-mm-yyyy')), PARTITION s_2022 VALUES LESS THAN (TO_DATE('01-01-2023','dd-mm-yyyy')) ); CREATE TABLE sales_exchange_table FOR EXCHANGE WITH TABLE sales_future_table; INSERT INTO sales_exchange_table VALUES (1002,110,TO_DATE('19-02-2020','dd-mm-yyyy'),12,18,150,4800); INSERT INTO sales_exchange_table VALUES (1001,100,TO_DATE('12-03-2020','dd-mm-yyyy'),10,15,400,6500); INSERT INTO sales_exchange_table VALUES (1001,100,TO_DATE('31-05-2020','dd-mm-yyyy'),10,15,600,8000); INSERT INTO sales_exchange_table VALUES (2105,101,TO_DATE('25-06-2020','dd-mm-yyyy'),12,19,100,3000); INSERT INTO sales_exchange_table VALUES (1002,120,TO_DATE('31-08-2020','dd-mm-yyyy'),10,15,400,6000); INSERT INTO sales_exchange_table VALUES (2105,101,TO_DATE('25-10-2020','dd-mm-yyyy'),12,19,250,7500); ALTER TABLE sales_future_table EXCHANGE PARTITION s_2020 WITH TABLE sales_exchange_table; SELECT * FROM sales_future_table PARTITION(s_2020); PROD_ID CUST_ID TIME_ID CHANNEL_ID PROMO_ID QUANTITY_SOLD AMOUNT_SOLD ---------- ---------- --------- ---------- ---------- ------------- ----------- 1002 110 19-FEB-20 12 18 150 4800 1001 100 12-MAR-20 10 15 400 6500 1001 100 31-MAY-20 10 15 600 8000 2105 101 25-JUN-20 12 19 100 3000 1002 120 31-AUG-20 10 15 400 6000 2105 101 25-OCT-20 12 19 250 7500 6 rows selected. REM Note that all records have been removed from the sales_exchange_table SELECT * FROM sales_exchange_table; no rows selected INSERT INTO sales_exchange_table VALUES (1002,110,TO_DATE('15-02-2021','dd-mm-yyyy'),12,18,300,9500); INSERT INTO sales_exchange_table VALUES (1002,120,TO_DATE('31-03-2021','dd-mm-yyyy'),10,15,200,3000); INSERT INTO sales_exchange_table VALUES (2105,101,TO_DATE('25-04-2021','dd-mm-yyyy'),12,19,150,9000); ALTER TABLE sales_future_table EXCHANGE PARTITION s_2021 WITH TABLE sales_exchange_table; SELECT * FROM sales_future_table PARTITION(s_2021); PROD_ID CUST_ID TIME_ID CHANNEL_ID PROMO_ID QUANTITY_SOLD AMOUNT_SOLD ---------- ---------- --------- ---------- ---------- ------------- ----------- 1002 110 15-FEB-21 12 18 300 9500 1002 120 31-MAR-21 10 15 200 3000 2105 101 25-APR-21 12 19 150 9000 3 rows selected.
4.4.4.3 時間隔パーティション表のパーティションの交換
時間隔パーティション表の時間隔パーティションを交換できます。ただし、パーティションを交換する前に、時間隔パーティションが作成されていることを確認する必要があります。
次の例では、2007年1月1日現在に、月単位のパーティションを使用して時間隔パーティション化された、interval_sales
表のパーティションの交換を示します。この例では、パーティション交換ロードを使用して、表に2007年6月のデータを追加する方法を示します。interval_sales
表にはローカル索引のみがあり、interval_sales_june_2007
表に対応する索引が作成されているとします。
ALTER TABLE interval_sales EXCHANGE PARTITION FOR (TO_DATE('01-JUN-2007','dd-MON-yyyy')) WITH TABLE interval_sales_jun_2007 INCLUDING INDEXES;
システム生成されたパーティションを識別するためのFOR
構文の使用方法に注意してください。*_TAB_PARTITIONS
データ・ディクショナリ・ビューを問い合せてシステム生成のパーティション名を表示することで、パーティション名を判別できます。
4.4.4.4 参照パーティション表のパーティションの交換
参照パーティション表のパーティションを交換できますが、参照するデータが親表のそれぞれのパーティションで使用可能であることを確認する必要があります。
例4-32では、レンジ・パーティション化されたorders
表、および参照パーティション化されたorder_items
表のパーティション交換ロードのシナリオを示します。order_items_2018_dec
表のデータには、order_date
が2018年12月の注文の注文アイテム・データのみが含まれています。
主キー索引を使用可能なままにするには、親表のパーティションの交換では、UPDATE GLOBAL INDEXES
またはUPDATE INDEXES
を使用する必要があります。また、参照パーティション表でのパーティションの交換を正常に行うには、order_items_2018_dec
表で外部キー制約を作成するか有効化する必要があります。
CASCADE
キーワードで交換する場合の詳細と例は、カスケード・オプションを使用したパーティションの交換についての項を参照してください。
例4-32 参照パーティション表のパーティションの交換
CREATE TABLE orders ( order_id number NOT NULL, order_date DATE, CONSTRAINT order_pk PRIMARY KEY (order_id)) PARTITION by range (order_date) (PARTITION p_2018_dec values less than ('01-JAN-2019')); CREATE TABLE order_items ( order_item_id NUMBER NOT NULL, order_id NUMBER not null, order_item VARCHAR2(100), CONSTRAINT order_item_pk PRIMARY KEY (order_item_id), CONSTRAINT order_item_fk FOREIGN KEY (order_id) references orders(order_id) on delete cascade) PARTITION by reference (order_item_fk); CREATE TABLE orders_2018_dec ( order_id NUMBER, order_date DATE, CONSTRAINT order_2018_dec_pk PRIMARY KEY (order_id)); INSERT into orders_2018_dec values (1,'01-DEC-2018'); COMMIT; CREATE TABLE order_items_2018_dec ( order_item_id NUMBER, order_id NUMBER NOT NULL, order_item VARCHAR2(100), CONSTRAINT order_item_2018_dec_pk PRIMARY KEY (order_item_id), CONSTRAINT order_item_2018_dec_fk FOREIGN KEY (order_id) references orders_2018_dec (order_id) on delete cascade); INSERT into order_items_2018_dec values (1,1,'item A'); INSERT into order_items_2018_dec values (2,1,'item B'); REM You must disable or DROP the constraint before the exchange ALTER TABLE order_items_2018_dec DROP CONSTRAINT order_item_2018_dec_fk; REM ALTER TABLE is successful with disabled PK-FK ALTER TABLE orders EXCHANGE PARTITION p_2018_dec WITH TABLE orders_2018_dec UPDATE GLOBAL INDEXES; REM You must establish the PK-FK with the future parent prior to this exchange ALTER TABLE order_items_2018_dec ADD CONSTRAINT order_items_dec_2018_fk FOREIGN KEY (order_id) REFERENCES orders(order_id) ; REM Complete the exchange ALTER TABLE order_items EXCHANGE PARTITION p_2018_dec WITH TABLE order_items_2018_dec; REM Display the data SELECT * FROM orders; ORDER_ID ORDER_DAT ---------- --------- 1 01-DEC-18 SELECT * FROM order_items; ORDER_ITEM_ID ORDER_ID ORDER_ITEM ------------- ---------- ------------ 1 1 item A 2 1 item B
4.4.4.5 仮想列を含む表のパーティションの交換について
仮想列が存在する場合もパーティションを交換できます。
仮想列を含むパーティション表でパーティションの交換を正常に行うには、パーティション表の単一のパーティションにある仮想列以外のすべての列の定義に一致する表を作成する必要があります。仮想列に制約または索引が定義されている場合を除き、仮想列の定義を含める必要はありません。
定義されている場合は、パーティション表の制約および索引の定義に一致させるために、仮想列の定義を含める必要があります。このシナリオは、仮想列ベースのパーティション表にも適用されます。
4.4.4.6 ハッシュ・パーティション表と* - ハッシュ・パーティションの交換
すべてのパーティションを含むハッシュ・パーティション表全体を、* - ハッシュ・パーティション表のパーティションおよびそのすべてのハッシュ・サブパーティションと交換できます。
次の例では、レンジ - ハッシュ・パーティション表のこの概念を説明します。
最初に、ハッシュ・パーティション表を作成します。
CREATE TABLE t1 (i NUMBER, j NUMBER) PARTITION BY HASH(i) (PARTITION p1, PARTITION p2);
表に移入し、次のようにしてレンジ - ハッシュ・パーティション表を作成します。
CREATE TABLE t2 (i NUMBER, j NUMBER) PARTITION BY RANGE(j) SUBPARTITION BY HASH(i) (PARTITION p1 VALUES LESS THAN (10) (SUBPARTITION t2_pls1, SUBPARTITION t2_pls2), PARTITION p2 VALUES LESS THAN (20) (SUBPARTITION t2_p2s1, SUBPARTITION t2_p2s2) );
表t1
のパーティション化キーが、表t2
のサブパーティション化キーと同一であることが重要です。
t1
のデータをt2
に移行して行を検証するには、次の文を使用します。
ALTER TABLE t2 EXCHANGE PARTITION p1 WITH TABLE t1 WITH VALIDATION;
4.4.4.7 * - ハッシュ・パーティション表のサブパーティションの交換
* - ハッシュ・パーティション表のハッシュ・サブパーティションを非パーティション表に変換する場合、またはその逆を行うには、ALTER
TABLE
EXCHANGE
SUBPARTITION
文を使用します。
次の例では、表sales
のサブパーティションq3_1999_s1
を、非パーティション表q3_1999
に変換します。ローカル索引パーティションは、q3_1999
の対応する索引と交換されます。
ALTER TABLE sales EXCHANGE SUBPARTITION q3_1999_s1 WITH TABLE q3_1999 INCLUDING INDEXES;
4.4.4.8 リスト・パーティション表と* - リスト・パーティションの交換
ALTER
TABLE
EXCHANGE
PARTITION
文を使用すると、リスト - パーティション表を* - リスト・パーティションと交換できます。
セマンティックは、「ハッシュ・パーティション表と* - ハッシュ・パーティションの交換」で前述されているものと同じです。次の例では、リスト - リスト・パーティション表のパーティションの交換シナリオを示します。
CREATE TABLE customers_apac ( id NUMBER , name VARCHAR2(50) , email VARCHAR2(100) , region VARCHAR2(4) , credit_rating VARCHAR2(1) ) PARTITION BY LIST (credit_rating) ( PARTITION poor VALUES ('P') , PARTITION mediocre VALUES ('C') , PARTITION good VALUES ('G') , PARTITION excellent VALUES ('E') );
表にAPACの顧客を移入します。次に、リスト - リスト・パーティション表を作成します。
CREATE TABLE customers ( id NUMBER , name VARCHAR2(50) , email VARCHAR2(100) , region VARCHAR2(4) , credit_rating VARCHAR2(1) ) PARTITION BY LIST (region) SUBPARTITION BY LIST (credit_rating) SUBPARTITION TEMPLATE ( SUBPARTITION poor VALUES ('P') , SUBPARTITION mediocre VALUES ('C') , SUBPARTITION good VALUES ('G') , SUBPARTITION excellent VALUES ('E') ) (PARTITION americas VALUES ('AMER') , PARTITION emea VALUES ('EMEA') , PARTITION apac VALUES ('APAC') );
customers_apac
表のパーティション化キーが、customers
表のサブパーティション化キーと一致していることが重要です。
次に、apac
パーティションを交換します。
ALTER TABLE customers EXCHANGE PARTITION apac WITH TABLE customers_apac WITH VALIDATION;
4.4.4.9 * - リスト・パーティション表のサブパーティションの交換について
* - リスト・パーティション表のサブパーティションを交換するには、ALTER
TABLE
EXCHANGE
SUBPARTITION
文を使用します。
ALTER
TABLE
EXCHANGE
SUBPARTITION
文のセマンティックは、「ハッシュ・パーティション表のサブパーティションの交換」で説明されているセマンティックと同じです。
4.4.4.10 レンジ・パーティション表と* - レンジ・パーティションの交換
ALTER
TABLE
EXCHANGE
PARTITION
文を使用すると、レンジ - パーティション表を* - レンジ・パーティションと交換できます。
ALTER
TABLE
EXCHANGE
PARTITION
文のセマンティックは、ハッシュ・パーティション表と* - ハッシュ・パーティションの交換で説明されているセマンティックと同じです。次の例では、order_date
で時間隔パーティション化され、order_total
のレンジでサブパーティション化されたorders
表を示します。この例では、単一の月単位の時間隔をレンジ・パーティション表と交換する方法を示します。
CREATE TABLE orders_mar_2007 ( id NUMBER , cust_id NUMBER , order_date DATE , order_total NUMBER ) PARTITION BY RANGE (order_total) ( PARTITION p_small VALUES LESS THAN (1000) , PARTITION p_medium VALUES LESS THAN (10000) , PARTITION p_large VALUES LESS THAN (100000) , PARTITION p_extraordinary VALUES LESS THAN (MAXVALUE) );
表に2007年5月の注文を移入します。次に時間隔 - レンジ・パーティション表を作成します。
CREATE TABLE orders ( id NUMBER , cust_id NUMBER , order_date DATE , order_total NUMBER ) PARTITION BY RANGE (order_date) INTERVAL (NUMTOYMINTERVAL(1,'MONTH')) SUBPARTITION BY RANGE (order_total) SUBPARTITION TEMPLATE ( SUBPARTITION p_small VALUES LESS THAN (1000) , SUBPARTITION p_medium VALUES LESS THAN (10000) , SUBPARTITION p_large VALUES LESS THAN (100000) , SUBPARTITION p_extraordinary VALUES LESS THAN (MAXVALUE) ) (PARTITION p_before_2007 VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-MON-yyyy')));
orders_mar_2007
表のパーティション化キーが、orders
表のサブパーティション化キーと一致していることが重要です。
次に、パーティションを交換します。
ALTER TABLE orders EXCHANGE PARTITION FOR (TO_DATE('01-MAR-2007','dd-MON-yyyy')) WITH TABLE orders_mar_2007 WITH VALIDATION;
4.4.4.11 * - レンジ・パーティション表のサブパーティションの交換について
* - レンジ・パーティションのサブパーティションを交換するには、ALTER
TABLE
EXCHANGE
SUBPARTITION
文を使用します。
ALTER
TABLE
EXCHANGE
SUBPARTITION
のセマンティックは、「ハッシュ・パーティション表のサブパーティションの交換」で説明されているセマンティックと同じです。
4.4.4.12 カスケード・オプションを使用したパーティションの交換について
ALTER
TABLE
EXCHANGE
PARTITION
およびALTER
TABLE
EXCHANGE
SUBPARTITION
SQL文のCASCADE
オプションを使用して、子の参照パーティション表に交換操作をカスケードできます。
交換操作のカスケードは、すべての外部キー制約をON
DELETE
CASCADE
として定義する必要があります。
ALTER
TABLE
EXCHANGE
PARTITION
およびALTER
TABLE
EXCHANGE
SUBPARTITION
のCASCADE
オプションを指定すると、EXCHANGE
操作は、ターゲット表の子である参照パーティション表にカスケードします。交換操作は、参照パーティション階層の任意のレベルで指定でき、ターゲット表から開始される子表にカスケードします。子表に権限は必要ありませんが、交換操作の通常の制限が操作に影響されるすべての表に適用されます。参照パーティションの子を持たない表に指定されている場合、CASCADE
オプションは無視されます。
ターゲット表の参照パーティション階層および交換表の参照パーティション階層は一致する必要があります。同じ親キーが複数の依存表によって参照される場合、CASCADE
オプションはサポートされません。複数の依存表が同じ主キーを使用していると、カーネルは依存パーティションの交換方法を明示的に識別できません。UPDATE
INDEXES
など、操作に指定される他のオプションは、操作に影響されるすべての表に適用されます。
カスケード・オプションはデフォルトで無効になっているため、Oracle Database互換性に影響しません。
次の例は、参照パーティション表のパーティションを交換する場合のCASCADE
の使用を示しています。
例4-33 参照パーティション表のカスケードを使用するパーティションの交換
CREATE TABLE orders ( order_id number NOT NULL, order_date DATE, CONSTRAINT order_pk PRIMARY KEY (order_id)) PARTITION by range (order_date) (PARTITION p_2018_dec values less than ('01-JAN-2019')); CREATE TABLE order_items ( order_item_id NUMBER NOT NULL, order_id NUMBER not null, order_item VARCHAR2(100), CONSTRAINT order_item_pk PRIMARY KEY (order_item_id), CONSTRAINT order_item_fk FOREIGN KEY (order_id) references orders(order_id) on delete cascade) PARTITION by reference (order_item_fk); CREATE TABLE orders_2018_dec ( order_id NUMBER, order_date DATE, CONSTRAINT order_2018_dec_pk PRIMARY KEY (order_id)); INSERT into orders_2018_dec values (1,'01-DEC-2018'); CREATE TABLE order_items_2018_dec ( order_item_id NUMBER, order_id NUMBER NOT NULL, order_item VARCHAR2(100), CONSTRAINT order_item_2018_dec_pk PRIMARY KEY (order_item_id), CONSTRAINT order_item_2018_dec_fk FOREIGN KEY (order_id) references orders_2018_dec (order_id) on delete cascade); INSERT into order_items_2018_dec values (1,1,'item A new'); INSERT into order_items_2018_dec values (2,1,'item B new'); REM Display data from reference partitioned tables before exchange SELECT * FROM orders; no rows selected SELECT * FROM order_items; no rows selected REM ALTER TABLE using cascading exchange ALTER TABLE orders EXCHANGE PARTITION p_2018_dec WITH TABLE orders_2018_dec CASCADE UPDATE GLOBAL INDEXES; REM Display data from reference partitioned tables after exchange SELECT * FROM orders; ORDER_ID ORDER_DAT ---------- --------- 1 01-DEC-18 SELECT * FROM order_items; ORDER_ITEM_ID ORDER_ID ORDER_ITEM ------------- ---------- ------------ 1 1 item A new 2 1 item B new
4.4.5 パーティションおよびサブパーティションのマージについて
ALTER
TABLE
MERGE
PARTITION
およびSUBPARTITION
SQL文を使用して、2つのパーティションまたはサブパーティションのコンテンツをマージします。
元の2つのパーティションまたはサブパーティションと、対応するローカル索引は削除されます。この文は、ハッシュ・パーティション表、またはコンポジット* - ハッシュ・パーティション表のハッシュ・サブパーティションには使用できません。
参照パーティション表のパーティションはマージできません。かわりに、親表でのマージ操作がすべての子表にカスケードされます。ただし、パーティションまたはサブパーティションをマージするために、マスター表でマージ操作を発行する場合は、DEPENDENT TABLES
句を使用して依存表に特定のプロパティを設定できます。
ONLINE
キーワードをALTER
TABLE
MERGE
PARTITION
およびSUBPARTITION
SQL文とともに使用すると、通常の(ヒープ構成)表に対するオンライン・マージ操作が有効になります。ONLINE
キーワードの使用例は、例4-34を参照してください。
関連するパーティションまたはサブパーティションにデータが含まれる場合は、次の表で説明するように、索引はUNUSABLE
とマークされます。
表のタイプ | 索引の動作 |
---|---|
通常(ヒープ) |
|
索引構成 |
|
この項では、次の項目について説明します。
4.4.5.1 レンジ・パーティションのマージ
隣接する2つのレンジ・パーティションの内容を、1つのパーティションにマージできます。
隣接しないレンジ・パーティションはマージできません。結果のパーティションは、マージされた2つのパーティションの高い方の上限を継承します。
レンジ・パーティションをマージする理由の1つは、大規模なパーティションで、履歴データをオンラインに保つためです。たとえば、最も古いパーティションが週次パーティションにロールアップされ、そのパーティションは月次パーティションにロールアップされる日次パーティションを作成できます。
例4-34は、ONLINE
キーワードを使用したレンジ・パーティションのマージ例を示しています。
例4-34 レンジ・パーティションのマージ
-- First, create a partitioned table with four partitions, each on its own -- tablespace, partitioned by range on the date column -- CREATE TABLE four_seasons ( one DATE, two VARCHAR2(60), three NUMBER ) PARTITION BY RANGE (one) ( PARTITION quarter_one VALUES LESS THAN ( TO_DATE('01-APR-2017','dd-mon-yyyy')) TABLESPACE quarter_one, PARTITION quarter_two VALUES LESS THAN ( TO_DATE('01-JUL-2017','dd-mon-yyyy')) TABLESPACE quarter_two, PARTITION quarter_three VALUES LESS THAN ( TO_DATE('01-OCT-2017','dd-mon-yyyy')) TABLESPACE quarter_three, PARTITION quarter_four VALUES LESS THAN ( TO_DATE('01-JAN-2018','dd-mon-yyyy')) TABLESPACE quarter_four ); -- -- Create local PREFIXED indexes on four_seasons -- Prefixed because the leftmost columns of the index match the -- Partitioning key -- CREATE INDEX i_four_seasons_l ON four_seasons (one,two) LOCAL ( PARTITION i_quarter_one TABLESPACE i_quarter_one, PARTITION i_quarter_two TABLESPACE i_quarter_two, PARTITION i_quarter_three TABLESPACE i_quarter_three, PARTITION i_quarter_four TABLESPACE i_quarter_four ); SELECT TABLE_NAME, PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME ='FOUR_SEASONS'; TABLE_NAME PARTITION_NAME ----------------------------------- ------------------------- FOUR_SEASONS QUARTER_FOUR FOUR_SEASONS QUARTER_ONE FOUR_SEASONS QUARTER_THREE FOUR_SEASONS QUARTER_TWO -- Next, merge the first two partitions ALTER TABLE four_seasons MERGE PARTITIONS quarter_one, quarter_two INTO PARTITION quarter_two UPDATE INDEXES ONLINE; SELECT TABLE_NAME, PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME ='FOUR_SEASONS'; TABLE_NAME PARTITION_NAME ----------------------------------- ------------------------- FOUR_SEASONS QUARTER_FOUR FOUR_SEASONS QUARTER_THREE FOUR_SEASONS QUARTER_TWO
ALTER
TABLE
four_season
文からUPDATE
INDEXES
句を除外した場合は、影響を受けるパーティションのローカル索引を再作成する必要があります。
-- Rebuild the index for quarter_two, which has been marked unusable -- because it has not had all of the data from quarter_one added to it. -- Rebuilding the index corrects this condition. -- ALTER TABLE four_seasons MODIFY PARTITION quarter_two REBUILD UNUSABLE LOCAL INDEXES;
4.4.5.2 時間隔パーティションのマージ
隣接する2つの時間隔パーティションのコンテンツを、1つのパーティションにマージできます。
隣接しない時間隔パーティションはマージできません。また、最初の時間隔パーティションは、最高位のレンジ・パーティションとマージできます。結果のパーティションは、マージされた2つのパーティションの高い方の上限を継承します。
時間隔パーティションをマージすると、遷移点が、マージされた2つのパーティションの高い方の上限に移動します。その結果、時間隔パーティション表のレンジ・セクションが、マージされた2つのパーティションの上限に拡張されます。新しくマージされたパーティションより上限が低いマテリアライズ化された時間隔パーティションは、上限が時間隔の上限によって定義されたレンジ・パーティションに自動的に変換されます。
次の時間隔パーティション表transactionsを例にあげます。
CREATE TABLE transactions ( id NUMBER , transaction_date DATE , value NUMBER ) PARTITION BY RANGE (transaction_date) INTERVAL (NUMTODSINTERVAL(1,'DAY')) ( PARTITION p_before_2007 VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-MON-yyyy')));
データを表の時間隔セクションに挿入すると、これらの日付用の時間隔パーティションが作成されます。2007年1月15日および2007年1月16日のデータは、隣接する時間隔パーティションに格納されます。
INSERT INTO transactions VALUES (1,TO_DATE('15-JAN-2007','dd-MON-yyyy'),100); INSERT INTO transactions VALUES (2,TO_DATE('16-JAN-2007','dd-MON-yyyy'),600); INSERT INTO transactions VALUES (3,TO_DATE('30-JAN-2007','dd-MON-yyyy'),200);
次に、隣接する2つの時間隔パーティションをマージします。新しいパーティションには、システム生成の名前が付けられます。
ALTER TABLE transactions MERGE PARTITIONS FOR(TO_DATE('15-JAN-2007','dd-MON-yyyy')) , FOR(TO_DATE('16-JAN-2007','dd-MON-yyyy'));
transactions
表の遷移点が2007年1月17日に移動します。時間隔パーティション表のレンジ・セクションには、値が2007年1月1日より少ないものと、2007年1月17日より少ないものの、2つのレンジ・パーティションが含まれます。2007年1月17日より大きい値は、時間隔パーティション表の時間隔部分に分類されます。
4.4.5.3 リスト・パーティションのマージ
リスト・パーティションをマージする場合、マージするパーティションは任意の2つのパーティションでかまいません。
リスト・パーティション化ではパーティションの順序が想定されていないため、レンジ・パーティションのように隣接している必要はありません。結果のパーティションには、元の2つのパーティションのすべてのデータが含まれます。デフォルトのリスト・パーティションをその他のパーティションとマージすると、結果のパーティションがデフォルトのパーティションになります。
次の文では、リスト・メソッドを使用してパーティション化された表の2つのパーティションを、すべての属性を表レベルのデフォルト属性から継承するパーティションにマージします。文にはMAXEXTENTS
が指定されています。
ALTER TABLE q1_sales_by_region MERGE PARTITIONS q1_northcentral, q1_southcentral INTO PARTITION q1_central STORAGE(MAXEXTENTS 20);
元の2つのパーティションの値リストは、次のとおりです。
PARTITION q1_northcentral VALUES ('SD','WI') PARTITION q1_southcentral VALUES ('OK','TX')
結果として生成されるsales_west
パーティションの値リストは、これら2つのパーティションの値リストを合せたものです。つまり、次のようになります。
('SD','WI','OK','TX')
4.4.5.4 * - ハッシュ・パーティションのマージ
* - ハッシュ・パーティションをマージすると、サブパーティションが、SUBPARTITIONS
n
またはSUBPARTITION
句で指定されたサブパーティション数に再度ハッシュされます。どちらも含まれない場合、表レベルのデフォルトが使用されます。
2つの* - ハッシュ・パーティションをマージする場合と、* - ハッシュ・パーティションを分割する場合では、プロパティの継承方法が異なります。パーティションを分割する場合は親が1つのみであるため、新しいパーティションは元のパーティションからプロパティを継承できます。ただし、パーティションをマージする場合は、表レベルからプロパティを継承する必要があります。
時間隔 - ハッシュ・パーティション表の場合、マージできるのは、隣接する2つの時間隔パーティションか、最高位のレンジ・パーティションと最初の時間隔パーティションのみです。時間隔 - ハッシュ・パーティション表で時間隔をマージする際、遷移点が移動します。
次の例では、2つのレンジ - ハッシュ・パーティションをマージします。
ALTER TABLE all_seasons MERGE PARTITIONS quarter_1, quarter_2 INTO PARTITION quarter_2 SUBPARTITIONS 8;
関連項目:
-
ハッシュ・パーティションの詳細は、「* - ハッシュ・パーティションの分割」を参照してください
-
時間隔パーティションのマージの詳細は、「時間隔パーティションのマージ」を参照してください
4.4.5.5 * - リスト・パーティションのマージについて
パーティションはパーティション・レベルで、サブパーティションはリスト・サブパーティション・レベルでマージできます。
この項では、次の項目について説明します。
4.4.5.5.1 * - リスト・パーティション表のパーティションのマージ
2つの* - リスト・パーティションをマージする場合、結果の新しいパーティションは、サブパーティション・テンプレートからサブパーティションの説明を継承します(サブパーティション・テンプレートが存在する場合)。サブパーティション・テンプレートがない場合には、新しいパーティションに単一のデフォルトのサブパーティションが作成されます。
時間隔 - リスト・パーティション表の場合、マージできるのは、隣接する2つの時間隔パーティションか、最高位のレンジ・パーティションと最初の時間隔パーティションのみです。時間隔 - リスト・パーティション表で時間隔をマージする際、遷移点が移動します。
次の文では、レンジ - リスト・パーティション化されたstripe_regional_sales
表の2つのパーティションをマージします。表には、サブパーティション・テンプレートがあります。
ALTER TABLE stripe_regional_sales MERGE PARTITIONS q1_1999, q2_1999 INTO PARTITION q1_q2_1999 STORAGE(MAXEXTENTS 20);
指定されていないパーティションでは表レベルのデフォルトが継承されますが、この新しいパーティションにはいくつかの新しい物理属性が指定されています。結果の新しいパーティションq1_q2_1999
は、パーティションq2_1999
の上限値と、表のサブパーティション・テンプレートの説明からサブパーティションの値リストの説明を継承しています。
結果のパーティションのデータには、両方のパーティションのデータが含まれます。ただし、データベースによりエラーが戻される場合があります。これは、次に示す両方の条件に当てはまる場合には、データが新しいパーティション外にマップされているためです。
このエラー条件は、デフォルトのサブパーティション・テンプレートに必ずデフォルトのパーティションを指定することでなくすことができます。
-
マージされたサブパーティションの一部のリテラル値がサブパーティション・テンプレートに含まれていない。
-
サブパーティション・テンプレートにデフォルトのパーティション定義が含まれていない。
関連項目:
-
* - リスト・パーティション表のパーティションのマージの詳細は、「リスト・パーティションのマージ」を参照してください
-
時間隔パーティションのマージの詳細は、「時間隔パーティションのマージ」を参照してください
4.4.5.5.2 * - リスト・パーティション表のサブパーティションのマージ
同じパーティションに所属する2つの任意のリスト・サブパーティションのコンテンツをマージできます。
結果のサブパーティションの値リストの記述子には、マージされるパーティションの値リストのすべてのリテラル値が含まれます。
次の文では、レンジ - リスト・メソッドを使用してパーティション化された表の2つのサブパーティションを、表領域ts4
に配置された新しいサブパーティションにマージします。
ALTER TABLE quarterly_regional_sales MERGE SUBPARTITIONS q1_1999_northwest, q1_1999_southwest INTO SUBPARTITION q1_1999_west TABLESPACE ts4;
元の2つのパーティションの値リストは、次のとおりです。
-
サブパーティション
q1_1999_northwest
は('WA','OR')
-
サブパーティション
q1_1999_southwest
は('AZ','NM','UT')
結果のサブパーティションの値リストは、次に示すように、これら2つのサブパーティションの値リストを合せたセットで構成されます。
-
サブパーティション
q1_1999_west
の値リストは('WA','OR','AZ','NM','UT')
結果のサブパーティションが配置されている表領域およびサブパーティションの属性は、明示的に指定されている場合を除き、パーティション・レベルのデフォルト属性によって決定されます。既存のサブパーティション名を再利用する場合、新しいサブパーティションは、名前が再利用されるサブパーティションのサブパーティション属性を継承します。
4.4.5.6 * - レンジ・パーティションのマージについて
パーティションはパーティション・レベルで、サブパーティションはレンジ・サブパーティション・レベルでマージできます。
4.4.5.6.1 * - レンジ・パーティション表のパーティションのマージ
2つの* - レンジ・パーティションをマージする場合、結果の新しいパーティションは、サブパーティション・テンプレートからサブパーティションの説明を継承します(サブパーティション・テンプレートが存在する場合)。サブパーティション・テンプレートがない場合には、上限がMAXVALUE
の単一のサブパーティションが新しいパーティションに作成されます。
時間隔 - レンジ・パーティション表の場合、マージできるのは、隣接する2つの時間隔パーティションか、最高位のレンジ・パーティションと最初の時間隔パーティションのみです。時間隔 - レンジ・パーティション表で時間隔をマージする際、遷移点が移動します。
次の文では、月次の時間隔 - レンジでパーティション化されたorders
表の2つのパーティションをマージします。表には、サブパーティション・テンプレートがあります。
ALTER TABLE orders MERGE PARTITIONS FOR(TO_DATE('01-MAR-2007','dd-MON-yyyy')), FOR(TO_DATE('01-APR-2007','dd-MON-yyyy')) INTO PARTITION p_pre_may_2007;
2007年3月および2007年4月のパーティションが時間隔 - レンジ・パーティション表の時間隔セクションにある場合、マージ操作により、遷移点が2007年5月1日に移動します。
パーティションp_pre_may_2007
のサブパーティションは、サブパーティション・テンプレートからプロパティを継承します。結果のパーティションのデータには、両方のパーティションのデータが含まれます。ただし、データベースによりエラーが戻される場合があります。これは、次に示す両方の条件に当てはまる場合には、データが新しいパーティション外にマップされているためです。
このエラー条件は、上限がMAXVALUE
のサブパーティションをサブパーティション・テンプレートに必ず指定することでなくすことができます。
-
マージされたサブパーティションの一部のレンジ値がサブパーティション・テンプレートに含まれていない。
-
サブパーティション・テンプレートに、上限が
MAXVALUE
のサブパーティションの定義がない。
関連項目:
-
* - レンジ・パーティション表のパーティションのマージの詳細は、「レンジ・パーティションのマージ」を参照してください
-
時間隔パーティションのマージの詳細は、「時間隔パーティションのマージ」を参照してください
4.4.5.7 複数のパーティションのマージ
2つ以上のパーティションまたはサブパーティションのコンテンツを新しい1つのパーティションまたはサブパーティションにマージし、ALTER
TABLE
SQL文のMERGE
PARTITIONS
およびMERGE
SUBPARTITIONS
句を使用して元のパーティションまたはサブパーティションを削除できます。
MERGE
PARTITIONS
およびMERGE
SUBPARTITIONS
句は、MERGE
PARTITION
およびMERGE
SUBPARTITION
句と同義です。
たとえば、次のSQL文は、4つのパーティションを1つのパーティションにマージし、マージされた4つのパーティションを削除します。
ALTER TABLE t1 MERGE PARTITIONS p01, p02, p03, p04 INTO p0;
複数のレンジ・パーティションをマージする場合、パーティションは隣接し、パーティション・バウンド値の昇順で指定する必要があります。新しいパーティションは、元のパーティションの最高位のパーティション上限を継承します。
TO
構文を使用して複数のレンジ・パーティションをマージする場合、マージする最下位および最高位のパーティションを指定できます。指定されたパーティション間のすべてのパーティション(指定されたパーティションを含む)は、ターゲット・パーティションにマージされます。この構文は、リストおよびシステム・パーティションに使用できません。
たとえば、次のSQL文は、パーティションp01
からp04
をパーティションp0
にマージします。
ALTER TABLE t1 MERGE PARTITIONS p01 TO p04 INTO p0;
パーティションの順序が想定されていないため、マージするリスト・パーティションおよびシステム・パーティションは隣接する必要がありません。複数のリスト・パーティションをマージする場合、結果のパーティションの値リストは、マージするすべてのパーティションのパーティション値リストをまとめたものです。他のリスト・パーティションとマージするDEFAULT
リスト・パーティションは、DEFAULT
パーティションになります。
コンポジット・パーティション表の複数のパーティションをマージする場合、結果の新しいパーティションは、存在する場合にサブパーティション・テンプレートからサブパーティションの説明を継承します。サブパーティション・テンプレートが存在しない場合、新しいパーティションのレンジ・サブパーティションから1つのMAXVALUE
サブパーティションまたはリスト・パーティションから1つのDEFAULT
サブパーティションが作成されます。コンポジット・パーティション表の複数のサブパーティションをマージする場合、マージするサブパーティションは同じパーティションに属する必要があります。
複数のパーティションをマージする場合、ローカルおよびグローバル索引操作および指定されていない物理属性を継承するセマンティックは、2つのパーティションのマージで同じです。
次のSQL文では、レンジ・パーティション表sales
の4つのパーティションがマージされます。最も古い年の4四半期に対応するこれらの4つのパーティションは、その年の売上データ全体を含む単一のパーティションにマージされます。
ALTER TABLE sales MERGE PARTITIONS sales_q1_2009, sales_q2_2009, sales_q3_2009, sales_q4_2009 INTO PARTITION sales_2009;
前述のSQL文を次のSQL文にリライトしても、同じ結果を取得できます。
ALTER TABLE sales MERGE PARTITIONS sales_q1_2009 TO sales_q4_2009 INTO PARTITION sales_2009;
4.4.6 表、パーティションおよびサブパーティションの属性の変更について
このトピックでは、表、パーティションおよびサブパーティションの属性の変更について説明します。
4.4.6.1 デフォルトの属性の変更について
表またはコンポジット・パーティション表のパーティションのデフォルト属性を変更できます。
デフォルト属性を変更する場合、新しい属性の影響を受けるのは、作成される今後のパーティションまたはサブパーティションのみです。新しいパーティションまたはサブパーティションの作成時には、デフォルト値を明示的に上書きできます。参照パーティション表のデフォルト属性を変更できます。
この項では、次の項目について説明します。
4.4.6.1.1 表のデフォルト属性の変更
ALTER
TABLE
のMODIFY
DEFAULT
ATTRIBUTES
句を使用して、レンジ、ハッシュ、リスト、時間隔または参照パーティションに継承されるデフォルト属性を変更できます。
ハッシュ・パーティション表の場合、変更できるのはTABLESPACE
属性のみです。
4.4.6.1.2 パーティションのデフォルト属性の変更
サブパーティションの作成時に継承されたデフォルト属性を変更するには、ALTER
TABLE
MODIFY
DEFAULT
ATTRIBUTES
FOR
PARTITION
を使用します。
次の文では、レンジ - ハッシュ・パーティション表のパーティションp1
の後続のサブパーティションが配置されるTABLESPACE
を変更します。
ALTER TABLE employees_subpartitions MODIFY DEFAULT ATTRIBUTES FOR PARTITION p1 TABLESPACE ts1;
TABLESPACE
を除き、レンジ - ハッシュ・パーティション表のすべてのサブパーティションでは同じ属性を共有する必要があるため、これは変更できる唯一の属性です。
作成されていない時間隔パーティションのデフォルト属性は変更できません。時間隔パーティション表の今後のサブパーティションの作成方法を変更するには、サブパーティション・テンプレートを変更する必要があります。
4.4.6.2 パーティションの実際の属性の変更について
表または索引の既存のパーティションの属性を変更できます。
TABLESPACE
属性は変更できません。新しい表領域にパーティションまたはサブパーティションを移動する場合は、ALTER
TABLE
MOVE
PARTITION
/SUBPARTITION
を使用します。
この項では、次の項目について説明します。
4.4.6.2.1 レンジまたはリスト・パーティションの実際の属性の変更
レンジ・パーティションまたはリスト・パーティションの既存の属性を変更するには、ALTER
TABLE
MODIFY
PARTITION
文を使用します。
セグメント属性(TABLESPACE
を除く)の変更、エクステントの割当てや割当て解除、ローカル索引パーティションへのUNUSABLE
のマーク付け、またはUNUSABLE
とマークされたローカル索引の再作成が可能です。
* - ハッシュ・パーティション表のレンジ・パーティションの場合は、次の内容に注意してください。
-
エクステントの割当てまたは割当て解除を行うと、このアクションは指定されたパーティションのすべてのサブパーティションに対して実行されます。
-
同様に、その他の属性を変更した場合も、対応する変更がそのパーティションのすべてのサブパーティションの属性に対して行われます。パーティション・レベルのデフォルト属性も変更されます。既存のサブパーティションの属性が変更されないようにするには、
MODIFY
DEFAULT
ATTRIBUTES
文のFOR
PARTITION
句を使用します。
次に、パーティションの実際の属性の変更例をいくつか示します。
この例では、表sales
のレンジ・パーティションsales_q1
のMAXEXTENTS
記憶域属性を変更します。
ALTER TABLE sales MODIFY PARTITION sales_q1 STORAGE (MAXEXTENTS 10);
次の例では、レンジ - ハッシュ・パーティション表scubagear
のパーティションts1
のローカル索引サブパーティションがすべてUNUSABLE
とマークされます。
ALTER TABLE scubagear MODIFY PARTITION ts1 UNUSABLE LOCAL INDEXES;
時間隔パーティション表の場合、変更できるのは、作成済のレンジ・パーティションまたは時間隔パーティションの実際の属性のみです。
4.4.6.2.2 ハッシュ・パーティションの実際の属性の変更
ALTER
TABLE
MODIFY
PARTITION
文を使用して、ハッシュ・パーティションの属性を変更できます。
ただし、個々のハッシュ・パーティションの物理属性は(TABLESPACE
を除き)すべて同一である必要があるため、実行できるのは次の操作のみです。
-
新規エクステントの割当て
-
未使用のエクステントの割当て解除
-
ローカル索引サブパーティションへの
UNUSABLE
のマーク付け -
UNUSABLE
とマークされたローカル索引サブパーティションの再作成
次の例では、表のハッシュ・パーティションp1
に関連付けられた使用できないローカル索引パーティションを再作成します。
ALTER TABLE departments_rebuild_index MODIFY PARTITION p1 REBUILD UNUSABLE LOCAL INDEXES;
4.4.6.2.3 サブパーティションの実際の属性の変更
ALTER
TABLE
のMODIFY
SUBPARTITION
句を使用すると、前の項でパーティションに関してリストされていたのと同じアクションを実行できますが、実行できるのは、特定のコンポジット・パーティション表のサブパーティション・レベルにおいてです。
例:
ALTER TABLE employees_rebuild_index MODIFY SUBPARTITION p3_s1 REBUILD UNUSABLE LOCAL INDEXES;
4.4.6.2.4 索引パーティションの実際の属性の変更
ALTER
INDEX
のMODIFY
PARTITION
句を使用すると、索引のパーティションまたはサブパーティションの実際の属性を変更できます。
ルールは表パーティションのルールとよく似ています。ALTER
INDEX
のMODIFY
PARTITION
句とは異なり、使用不可の索引パーティションを作成する副句はありませんが、索引のパーティションまたはサブパーティションを結合する副句があります。ここでの結合は索引ブロックのマージを意味します。これは再利用のために解放できます。
MODIFY
PARTITION
句を使用して、ローカル索引のサブパーティションに対する記憶域の割当てや割当て解除、またはそれらをUNUSABLE
とマークすることもできます。
4.4.7 リスト・パーティションの変更について
このトピックでは、パーティションおよびサブパーティションのリストの値の変更について説明します。
4.4.7.1 リスト・パーティションの変更について: 値の追加
リスト・パーティション化では、オプションで、定義された値リストのリテラル値を追加できます。
この項では、次の項目について説明します。
4.4.7.1.1 リスト・パーティションへの値の追加
既存のパーティションの値リストを拡張するには、ALTER
TABLE
文のMODIFY
PARTITION
ADD
VALUES
句を使用します。
追加するリテラル値は、その他のパーティションの値リストに含まれていない必要があります。対応するローカル索引パーティションのパーティションの値リストはそれに応じて拡張され、グローバル索引や、グローバルまたはローカル索引パーティションは使用可能なままです。
次の文では、既存のパーティション・リストに、一連の新しい州コード(OK
、KS
)を追加します。
ALTER TABLE sales_by_region MODIFY PARTITION region_south ADD VALUES ('OK', 'KS');
デフォルトのパーティションがあると、その他のパーティションへの値の追加時にパフォーマンスに影響があります。これは、リスト・パーティションに値を追加するために、追加する値がデフォルトのパーティションに存在しないことをデータベースで確認する必要があるためです。いずれかの値がデフォルト・パーティションに存在する場合は、エラーが表示されます。
ノート:
データベースにより、追加されるリテラル値に対応する行がデフォルトのパーティションに存在するかどうかを確認する問合せが実行されます。そのため、表にローカルの同一キー索引を作成することをお薦めします。これにより、問合せの実行および操作全体が高速化されます。
デフォルトのリスト・パーティションには値を追加できません。
4.4.7.1.2 リスト・サブパーティションへの値の追加
既存のサブパーティションの値リストを拡張するには、ALTER
TABLE
文のMODIFY
SUBPARTITION
ADD
VALUES
句を使用します。
この操作は、「リスト・パーティションの変更について: 値の追加」に説明されている操作と基本的に同じですが、MODIFY
PARTITION
句ではなくMODIFY
SUBPARTITION
句を使用します。たとえば、サブパーティションq1_1999_southeast
の値リストにあるリテラル値のレンジを拡張するには、次の文を使用します。
ALTER TABLE quarterly_regional_sales MODIFY SUBPARTITION q1_1999_southeast ADD VALUES ('KS');
追加するリテラル値が、所有パーティション内のその他のサブパーティションの値リストに含まれていない必要があります。ただし、表内にあるその他のパーティションのサブパーティションの値リストのリテラル値を複製したものであってもかまいません。
時間隔 - リスト・コンポジット・パーティション表の場合、作成済のレンジ・パーティションか時間隔パーティションのサブパーティションにのみ値を追加できます。まだ作成されていない時間隔パーティションのサブパーティションに値を追加するには、サブパーティション・テンプレートを変更する必要があります。
4.4.7.2 リスト・パーティションの変更について: 値の削除
リスト・パーティション化では、オプションで、定義された値リストのリテラル値を削除できます。
この項では、次の項目について説明します。
4.4.7.2.1 リスト・パーティションからの値の削除
既存のパーティションの値リストからリテラル値を削除するには、ALTER
TABLE
文のMODIFY
PARTITION
DROP
VALUES
句を使用します。
この文は常に検証しながら実行されます。つまり、削除する一連の値に対応する行がパーティションに存在するかどうかが確認されます。そのような行が見つかると、データベースによってエラー・メッセージが返され、操作が失敗します。必要な場合は、DELETE
文を使用して、対応する行を表から削除した後で値の削除を試行します。
ノート:
パーティションを説明する値リストからすべてのリテラル値を削除することはできません。かわりに、ALTER TABLE DROP PARTITION
文を使用してください。
対応するローカル索引パーティションのパーティションの値リストには新しい値リストが反映され、グローバル索引や、グローバルまたはローカル索引パーティションは使用可能なままです。
次の文では、既存のパーティションの値リストから、一連の州コード(OK
およびKS
)を削除します。
ALTER TABLE sales_by_region MODIFY PARTITION region_south DROP VALUES ('OK', 'KS');
ノート:
データベースにより、削除されるリテラル値に対応する行がパーティションに存在するかどうかを確認する問合せが実行されます。そのため、表にローカルの同一キー索引を作成することをお薦めします。これにより、問合せおよび操作全体が高速化されます。
デフォルトのリスト・パーティションからは値を削除できません。
4.4.7.2.2 リスト・サブパーティションからの値の削除
既存のサブパーティションの値リストからリテラル値を削除するには、ALTER
TABLE
文のMODIFY
SUBPARTITION
DROP
VALUES
句を使用します。
この操作は、「リスト・パーティションの変更について: 値の削除」に説明されている操作と基本的に同じですが、MODIFY
PARTITION
句ではなくMODIFY
SUBPARTITION
句を使用します。たとえば、サブパーティションq1_1999_southeast
の値リストにある一連のリテラル値を削除するには、次の文を使用します。
ALTER TABLE quarterly_regional_sales MODIFY SUBPARTITION q1_1999_southeast DROP VALUES ('KS');
時間隔 - リスト・コンポジット・パーティション表の場合、作成済のレンジ・パーティションか時間隔パーティションのサブパーティションからのみ値を削除できます。まだ作成されていない時間隔パーティションのサブパーティションから値を削除するには、サブパーティション・テンプレートを変更する必要があります。
4.4.8 パーティション化戦略の変更について
ALTER
TABLE
MODIFY
PARTITION
SQL文を使用して、通常の(ヒープ構成)表のパーティション化戦略を変更できます。
パーティション化戦略の変更(ハッシュ・パーティション化からコンポジット・レンジ - ハッシュ・パーティション化に変更するなど)は、オフラインまたはオンラインで実行できます。オンライン・モードで実行した場合、進行中のDML操作は変更の影響を受けません。オフライン・モードで実行した場合、変更中の同時DML操作は許可されません。
索引は、表の変更の際にメンテナンスされます。パーティション化戦略を変更する場合、索引列が新しいパーティション化キーのプリフィックスであるすべての未指定の索引は自動的にローカル・パーティション索引に変換されます。そうでない場合、索引はグローバル索引に変換されます。
変更操作は、ドメイン索引ではサポートされていません。UPDATE
INDEXES
句では、索引のリストが最初に定義されている列、索引の一意性プロパティ、またはその他の索引プロパティを変更することはできません。
非パーティション表からパーティション表への変換の詳細は、「パーティション表への非パーティション表の変換」を参照してください。
例4-35に、レンジ・パーティション表をコンポジット・レンジ- ハッシュ・パーティション表にオンラインで変換するためのALTER
TABLE
の使用方法を示します。この例では、ALTER
TABLE
での変更中に索引が更新されます。
Live SQL:
Oracle Live SQLの表のパーティション化戦略の変更で関連する例を参照して実行してください。
例4-35 パーティション化戦略の変更
CREATE TABLE mod_sales_partitioning ( prod_id NUMBER NOT NULL, cust_id NUMBER NOT NULL, time_id DATE NOT NULL, channel_id NUMBER NOT NULL, promo_id NUMBER NOT NULL, quantity_sold NUMBER(10,2) NOT NULL, amount_sold NUMBER(10,2) NOT NULL ) PARTITION BY RANGE (time_id) (PARTITION sales_q1_2017 VALUES LESS THAN (TO_DATE('01-APR-2017','dd-MON-yyyy')), PARTITION sales_q2_2017 VALUES LESS THAN (TO_DATE('01-JUL-2017','dd-MON-yyyy')), PARTITION sales_q3_2017 VALUES LESS THAN (TO_DATE('01-OCT-2017','dd-MON-yyyy')), PARTITION sales_q4_2017 VALUES LESS THAN (TO_DATE('01-JAN-2018','dd-MON-yyyy')) ); CREATE INDEX i1_cust_id_indx ON mod_sales_partitioning (cust_id) LOCAL; CREATE INDEX i2_time_id_indx ON mod_sales_partitioning (time_id); CREATE INDEX i3_prod_id_indx ON mod_sales_partitioning (prod_id); SELECT TABLE_NAME, PARTITIONING_TYPE FROM USER_PART_TABLES WHERE TABLE_NAME ='MOD_SALES_PARTITIONING'; TABLE_NAME PARTITION_NAME ------------------------- -------------- MOD_SALES_PARTITIONING RANGE SELECT TABLE_NAME, PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME ='MOD_SALES_PARTITIONING'; TABLE_NAME PARTITION_NAME ------------------------- -------------- MOD_SALES_PARTITIONING SALES_Q1_2017 MOD_SALES_PARTITIONING SALES_Q2_2017 MOD_SALES_PARTITIONING SALES_Q3_2017 MOD_SALES_PARTITIONING SALES_Q4_2017 ... ALTER TABLE mod_sales_partitioning MODIFY PARTITION BY RANGE (time_id) SUBPARTITION BY HASH (cust_id) SUBPARTITIONS 8 ( PARTITION sales_q1_2017 VALUES LESS THAN (TO_DATE('01-APR-2017','dd-MON-yyyy')), PARTITION sales_q2_2017 VALUES LESS THAN (TO_DATE('01-JUL-2017','dd-MON-yyyy')), PARTITION sales_q3_2017 VALUES LESS THAN (TO_DATE('01-OCT-2017','dd-MON-yyyy')), PARTITION sales_q4_2017 VALUES LESS THAN (TO_DATE('01-JAN-2018','dd-MON-yyyy'))) ONLINE UPDATE INDEXES ( i1_cust_id_indx LOCAL, i2_time_id_indx GLOBAL PARTITION BY RANGE (time_id) (PARTITION ip1_indx VALUES LESS THAN (MAXVALUE) ) ); SELECT TABLE_NAME, PARTITIONING_TYPE, SUBPARTITIONING_TYPE FROM USER_PART_TABLES WHERE TABLE_NAME ='MOD_SALES_PARTITIONING'; TABLE_NAME PARTITION SUBPARTIT --------------------------- -------------- ---------- MOD_SALES_PARTITIONING RANGE HASH SELECT TABLE_NAME, PARTITION_NAME, SUBPARTITION_NAME FROM USER_TAB_SUBPARTITIONS WHERE TABLE_NAME ='MOD_SALES_PARTITIONING'; TABLE_NAME PARTITION_NAME SUBPARTITION_NAME --------------------------- ------------------ ------------------ MOD_SALES_PARTITIONING SALES_Q1_2017 SYS_SUBP567 MOD_SALES_PARTITIONING SALES_Q1_2017 SYS_SUBP568 MOD_SALES_PARTITIONING SALES_Q1_2017 SYS_SUBP569 MOD_SALES_PARTITIONING SALES_Q1_2017 SYS_SUBP570 ...
4.4.9 パーティションおよびサブパーティションの移動について
パーティションの物理記憶域属性を変更するには、ALTER
TABLE
文でMOVE
PARTITION
句を使用します。
ALTER
TABLE
文のMOVE
PARTITION
句は、次の目的に使用できます。
-
データを再クラスタリングして断片化を減らす場合
-
別の表領域にパーティションを移動する場合
-
作成時間属性の変更
-
表圧縮を使用してデータを圧縮形式で保存する場合
通常は、ALTER
TABLE
/INDEX
MODIFY
PARTITION
文を使用して、一度にパーティションの物理記憶域属性を変更できます。ただし、TABLESPACE
などの一部の物理属性は、MODIFY
PARTITION
を使用して変更できません。そのような場合には、MOVE
PARTITION
句を使用します。表圧縮などのその他の属性を変更すると、既存のデータではなく、後続の記憶域のみが影響されます。
移動するパーティションにデータが含まれる場合は、次の表で説明するように、索引はUNUSABLE
とマークされます。
表のタイプ | 索引の動作 |
---|---|
通常(ヒープ) |
|
索引構成 |
移動するパーティションに定義された任意のローカルまたはグローバル索引は、主キー・ベースの論理行IDであるため使用可能なままです。ただし、これらの行IDの不確定情報は不適切になります。 |
この項では、次の項目について説明します。
関連項目:
-
ALTER
TABLE
MOVE
文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください -
表およびパーティションの移動の詳細は、『Oracle Database管理者ガイド』を参照してください
4.4.9.1 表パーティションの移動
パーティションを移動するには、MOVE
PARTITION
句を使用します。
たとえば、(I/Oを調整するために)最もアクティブなパーティションをアクションは記録せずにデータを圧縮し、一連の独自のディスクに存在する表領域に移動するには、次の文を発行します。
ALTER TABLE parts MOVE PARTITION depot2 TABLESPACE ts094 NOLOGGING COMPRESS;
この文では、新しい表領域を指定しない場合でも、古いパーティション・セグメントが削除され、新しいセグメントが作成されます。
パーティション化索引構成表のパーティションを移動する場合は、MOVE
PARTITION
句の一部としてMAPPING
TABLE
句を指定できます。これにより、マッピング表のパーティションは表パーティションとともに新しい場所に移動されます。
時間隔または時間隔 - *パーティション表の場合、移動できるのは、マテリアライズ化済のレンジ・パーティションまたは時間隔パーティションのみです。パーティションの移動操作では、時間隔または時間隔 - *パーティション表の遷移点は移動されません。
マスター表のパーティションには関係なく、参照パーティション表のパーティションを移動できます。
4.4.9.2 サブパーティションの移動
サブパーティションを移動するには、MOVE
SUBPARTITION
句を使用します。
次の文では、表のサブパーティションにあるデータの移動方法を示します。この例では、PARALLEL
句も指定されています。
ALTER TABLE scuba_gear MOVE SUBPARTITION bcd_types TABLESPACE tbs23 PARALLEL (DEGREE 2);
マスター表のサブパーティションには関係なく、参照パーティション表のサブパーティションを移動できます。
4.4.10 索引パーティションの再作成について
索引の再作成には複数の利点があります。
次に、索引パーティションを再作成する理由をいくつか示します。
-
領域のリカバリおよびパフォーマンスの向上
-
メディア障害により破損した索引パーティションの修復
-
SQL*Loaderまたはインポート・ユーティリティを使用して基礎となる表パーティションをロードした後のローカル索引パーティションの再作成
-
UNUSABLE
とマークされた索引パーティションの再作成 -
Bツリー索引のキー圧縮の有効化
次の項では、索引パーティションおよびサブパーティションを再作成するためのオプションを説明します。
この項では、次の項目について説明します。
4.4.10.1 グローバル索引パーティションの再作成について
グローバル索引パーティションは、いくつかの方法で再作成できます。
-
ALTER
INDEX
REBUILD
PARTITION
文を発行して各パーティションを再作成する方法(再作成は同時に実行できます)。 -
グローバル索引全体を削除して再作成する方法。表がスキャンされるのは一度のみであるため、この方法はより効率的です。
索引付きのパーティション表におけるほとんどのメンテナンス操作では、DDL文にUPDATE
INDEXES
を指定することにより、オプションで索引の再作成を回避できます。
4.4.10.2 ローカル索引パーティションの再作成について
ローカル索引パーティションは、いくつかの方法で再作成できます。
ALTER
INDEX
またはALTER
TABLE
を使用し、次のようにしてローカル索引を再作成します。
-
ALTER
INDEX
REBUILD
PARTITION
/SUBPARTITION
この文では、索引パーティションまたはサブパーティションが無条件に再作成されます。
-
ALTER
TABLE
MODIFY
PARTITION
/SUBPARTITION
REBUILD
UNUSABLE
LOCAL
INDEXES
この文では、表のパーティションまたはサブパーティションに対する使用不可の索引がすべて検索され、それらが再作成されます。
UNUSABLE
とマークされた索引パーティションのみが再作成されます。
次の各項では、索引の再作成の例について説明します。
4.4.10.2.1 ALTER INDEXを使用したパーティションの再作成
ALTER
INDEX
REBUILD
PARTITION
文によって、索引の1つのパーティションが再作成されます。
これは、コンポジット・パーティション表には使用できません。このコマンドで再作成できるのは実際の物理セグメントのみです。索引を再作成するとき、パーティションの新しい表領域への移動や属性の変更を選択することもできます。
コンポジット・パーティション表では、ALTER
INDEX
REBUILD
SUBPARTITION
を使用して、索引のサブパーティションを再作成します。サブパーティションを別の表領域に移動するか、PARALLEL句を指定できます。次の文では、表のローカル索引のサブパーティションを再作成し、索引サブパーティションを別の表領域に移動します。
ALTER INDEX scuba REBUILD SUBPARTITION bcd_types TABLESPACE tbs23 PARALLEL (DEGREE 2);
4.4.10.2.2 ALTER TABLEを使用した索引パーティションの再作成
ALTER
TABLE
MODIFY
PARTITION
のREBUILD
UNUSABLE
LOCAL
INDEXES
句により、使用できない索引パーティションを再作成できます。
ただし、文では、索引パーティションの再作成の新規属性を指定できません。次の例では、表scubagear
のパーティションp1
の使用できないローカル索引パーティションを検出して再作成します。
ALTER TABLE scubagear MODIFY PARTITION p1 REBUILD UNUSABLE LOCAL INDEXES;
ALTER
TABLE
MODIFY
SUBPARTITION
は、使用できないローカル索引サブパーティションの再作成のための句です。
4.4.11 パーティションおよびサブパーティション名の変更について
表と索引の両方のパーティションおよびサブパーティション名を変更できます。
パーティション名を変更する理由の1つは、別のメンテナンス操作でパーティションに割り当てられたデフォルトのシステム名とは対照的に、意味のわかる名前を割り当てるためです。
すべてのパーティション化メソッドで、パーティションを識別するためのFOR(
value
)
メソッドがサポートされています。このメソッドを使用して、システム生成されたパーティション名をより意味のわかりやすい名前に変更できます。これは、時間隔または時間隔 - *パーティション表に特に便利です。
参照パーティション化されたマスター表および子表のパーティションやサブパーティション名を個別に変更できます。マスター表での名前の変更操作は、子表にカスケードされません。
この項では、次の項目について説明します。
4.4.11.1 表パーティション名の変更
ALTER
TABLE
RENAME
PARTITION
部門を使用して、レンジ、ハッシュまたはリスト・パーティションの名前を変更できます。
例:
ALTER TABLE scubagear RENAME PARTITION sys_p636 TO tanks;
4.4.12 パーティションおよびサブパーティションの分割について
パーティションの内容を2つの新しいパーティションに分割できます。
ALTER
TABLE
またはALTER
INDEX
文のSPLIT
PARTITION
句は、パーティションのコンテンツを2つの新しいパーティションに再分散するために使用されます。パーティションが大きくなりすぎてバックアップ、リカバリまたはメンテナンス操作の完了に長い時間がかかるようになった場合や、単純にパーティションのデータが増えすぎた場合に、再分散を検討します。SPLIT
PARTITION
句を使用して、I/Oロードを再分散することもできます。この句は、ハッシュ・パーティションまたはサブパーティションには使用できません。
分割するパーティションにデータが含まれる場合は、次の表で説明するように、索引はUNUSABLE
とマークされます。
表のタイプ | 索引の動作 |
---|---|
通常(ヒープ) |
|
索引構成 |
|
親表を除いて、参照パーティション表のパーティションまたはサブパーティションを分割できません。親表のパーティションまたはサブパーティションを分割すると、すべての子表にカスケードされます。ただし、パーティションまたはサブパーティションを分割するために、マスター表でSPLIT
文を発行する場合は、DEPENDENT TABLES
句を使用して依存表に特定のプロパティを設定できます。
SPLIT
操作によるパーティション・メンテナンスは、キーワードONLINE
が指定されたオンライン操作としてヒープ構成表でサポートされているため、パーティション・メンテナンス操作が進行中の同時DML操作が可能になります。
ONLINE
操作では、UPDATE
INDEXES
句を指定したかどうかに関係なく、索引の分割はデフォルトで常に更新されます。
SPLIT
操作でのキーワードONLINE
の使用の例は、例4-37を参照してください。
この項では、次の項目について説明します。
4.4.12.1 レンジ・パーティション表のパーティションの分割
ALTER
TABLE
SPLIT
PARTITION
文を使用して、レンジ・パーティションを分割できます。
このSQL文では、パーティションの分割点である、パーティションのレンジ内のパーティション化キー列の値を指定する必要があります。
分割の結果得られるパーティションに、オプションで新しい属性を指定できます。表にローカル索引が定義されている場合、この文では、各ローカル索引の一致するパーティションも分割されます。
新しいパーティションの名前を指定しない場合、データベースにより、SYS_P
n
という書式の名前が割り当てられます。データ・ディクショナリを調査して、新しいローカル索引パーティションに割り当てられた名前を検出できます。それらの名前を変更する必要がある場合もあります。指定しない属性は、元のパーティションから継承されます。
例4-36 レンジ・パーティション表のパーティションの分割、および索引の再作成
この例のfee_katy
は、表vet_cats
のパーティションです。これにはローカル索引jaf1
があります。この表にはグローバル索引vet
もあります。vet
には2つのパーティションvet_parta
とvet_partb
が含まれます。結果の新しい2つのパーティションの1つ目には、パーティション化キー列の値が、指定された値より小さいものをマッピングする元のパーティションのすべての行が含まれます。2つ目のパーティションには、パーティション化キー列値が、指定された値以上のものをマッピングするすべての行が含まれます。次のSQL文では、パーティションfee_katy
が分割され、索引パーティションが再作成されます。
ALTER TABLE vet_cats SPLIT PARTITION fee_katy at (100) INTO ( PARTITION fee_katy1, PARTITION fee_katy2); ALTER INDEX JAF1 REBUILD PARTITION fee_katy1; ALTER INDEX JAF1 REBUILD PARTITION fee_katy2; ALTER INDEX VET REBUILD PARTITION vet_parta; ALTER INDEX VET REBUILD PARTITION vet_partb;
例4-37 オンラインでのレンジ・パーティション表のパーティションの分割
この例では、ORDERS
表のsales_q4_2016
パーティションが、月ごとに別個のパーティションに分割されます。ONLINE
キーワードは、パーティション・メンテナンス操作の進行中に同時DML操作を可能にするために指定されます。
ORDERS
表に索引がある場合、これらはオンライン分割の一部として自動的にメンテナンスされます。
CREATE TABLE orders (prod_id NUMBER(6), cust_id NUMBER, time_id DATE, channel_id CHAR(1), promo_id NUMBER(6), quantity_sold NUMBER(3), amount_sold NUMBER(10,2) ) PARTITION BY RANGE (time_id) (PARTITION sales_q1_2016 VALUES LESS THAN (TO_DATE('01-APR-2016','dd-MON-yyyy')), PARTITION sales_q2_2016 VALUES LESS THAN (TO_DATE('01-JUL-2016','dd-MON-yyyy')), PARTITION sales_q3_2016 VALUES LESS THAN (TO_DATE('01-OCT-2016','dd-MON-yyyy')), PARTITION sales_q4_2016 VALUES LESS THAN (TO_DATE('01-JAN-2017','dd-MON-yyyy')) ); ALTER TABLE orders SPLIT PARTITION sales_q4_2016 INTO (PARTITION sales_oct_2016 VALUES LESS THAN (TO_DATE('01-NOV-2016','dd-MON-yyyy')), PARTITION sales_nov_2016 VALUES LESS THAN (TO_DATE('01-DEC-2016','dd-MON-yyyy')), PARTITION sales_dec_2016 ) ONLINE;
4.4.12.2 リスト・パーティション表のパーティションの分割
ALTER
TABLE
SPLIT
PARTITION
文を使用して、リスト・パーティションを分割できます。
SPLIT
PARTITION
句を使用すると、リテラル値のリストを指定してパーティションを定義できます。このパーティションに、対応するパーティション化キー値を含む行が挿入されます。元のパーティションのその他の行は、元のパーティションの残りの値が値リストに含まれる2番目のパーティションに挿入されます。分割の結果である2つのパーティションに、オプションで新しい属性を指定できます。
次の文では、パーティションregion_east
が2つのパーティションに分割されます。
ALTER TABLE sales_by_region SPLIT PARTITION region_east VALUES ('CT', 'MA', 'MD') INTO ( PARTITION region_east_1 TABLESPACE tbs2, PARTITION region_east_2 STORAGE (INITIAL 8M)) PARALLEL 5;
元のregion_east
パーティションのリテラル値のリストは、次のように指定されています。
PARTITION region_east VALUES ('MA','NY','CT','NH','ME','MD','VA','PA','NJ')
2つの新しいパーティションは次のとおりです。
-
リテラル値のリストが
('CT','MA','MD')
のregion_east_1
-
残りのリテラル値のリスト
('NY','NH','ME','VA','PA','NJ')
を継承しているregion_east_2
個々のパーティションには、パーティション・レベルで指定された新しい物理属性があります。操作は並列度5で実行されます。
その他のリスト・パーティションの分割と同じように、デフォルトのリスト・パーティションを分割できます。これは、デフォルトのパーティションがあるリスト・パーティション表に新しいパーティションを追加する唯一の方法でもあります。デフォルトのパーティションを分割する際には、指定した値で定義された新しいパーティションと、デフォルトのパーティションとして残る2つ目のパーティションを作成します。
Live SQL:
Oracle Live SQLのOracle Live SQL: リストパーティション表のDEFAULTパーティションの分割で関連する例を参照して実行してください。
例4-38 リスト・パーティション表のデフォルト・パーティションの分割
この例では、sales_by_region
のデフォルトのパーティションを分割することで、新しいパーティションを作成します。
CREATE TABLE sales_by_region (dept_number NUMBER NOT NULL, dept_name VARCHAR2(20), quarterly_sales NUMBER(10,2), state VARCHAR2(2) ) PARTITION BY LIST (state) ( PARTITION yearly_north VALUES ('MN','WI','MI'), PARTITION yearly_south VALUES ('NM','TX','GA'), PARTITION yearly_east VALUES ('MA','NY','NC'), PARTITION yearly_west VALUES ('CA','OR','WA'), PARTITION unknown VALUES (DEFAULT) ); SELECT PARTITION_NAME, HIGH_VALUE FROM USER_TAB_PARTITIONS WHERE TABLE_NAME ='SALES_BY_REGION'; PARTITION_NAME HIGH_VALUE -------------- --------------- UNKNOWN DEFAULT YEARLY_EAST 'MA', 'NY', 'NC' YEARLY_NORTH 'MN', 'WI', 'MI' YEARLY_SOUTH 'NM', 'TX', 'GA' YEARLY_WEST 'CA', 'OR', 'WA 5 rows selected. INSERT INTO SALES_BY_REGION VALUES (002, 'AUTO NORTH', 450000, 'MN'); INSERT INTO SALES_BY_REGION VALUES (002, 'AUTO NORTH', 495000, 'WI'); INSERT INTO SALES_BY_REGION VALUES (002, 'AUTO NORTH', 850000, 'MI'); INSERT INTO SALES_BY_REGION VALUES (004, 'AUTO SOUTH', 595000, 'NM'); INSERT INTO SALES_BY_REGION VALUES (004, 'AUTO SOUTH', 4825000, 'TX'); INSERT INTO SALES_BY_REGION VALUES (004, 'AUTO SOUTH', 945000, 'GA'); INSERT INTO SALES_BY_REGION VALUES (006, 'AUTO EAST', 2125000, 'MA'); INSERT INTO SALES_BY_REGION VALUES (006, 'AUTO EAST', 6101000, 'NY'); INSERT INTO SALES_BY_REGION VALUES (006, 'AUTO EAST', 741000, 'NC'); INSERT INTO SALES_BY_REGION VALUES (008, 'AUTO WEST', 7201000, 'CA'); INSERT INTO SALES_BY_REGION VALUES (008, 'AUTO WEST', 901000, 'OR'); INSERT INTO SALES_BY_REGION VALUES (008, 'AUTO WEST', 1125000, 'WA'); INSERT INTO SALES_BY_REGION VALUES (009, 'AUTO MIDWEST', 1950000, 'AZ'); INSERT INTO SALES_BY_REGION VALUES (009, 'AUTO MIDWEST', 5725000, 'UT'); SELECT DEPT_NUMBER, DEPT_NAME, QUARTERLY_SALES, STATE FROM SALES_BY_REGION PARTITION(yearly_north); DEPT_NUMBER DEPT_NAME QUARTERLY_SALES ST ----------- -------------------- --------------- -- 2 AUTO NORTH 450000 MN 2 AUTO NORTH 495000 WI 2 AUTO NORTH 850000 MI SELECT DEPT_NUMBER, DEPT_NAME, QUARTERLY_SALES, STATE FROM SALES_BY_REGION PARTITION(yearly_south); DEPT_NUMBER DEPT_NAME QUARTERLY_SALES ST ----------- -------------------- --------------- -- 4 AUTO SOUTH 595000 NM 4 AUTO SOUTH 4825000 TX 4 AUTO SOUTH 945000 GA … SELECT DEPT_NUMBER, DEPT_NAME, QUARTERLY_SALES, STATE FROM SALES_BY_REGION PARTITION(unknown); DEPT_NUMBER DEPT_NAME QUARTERLY_SALES ST ----------- -------------------- --------------- -- 9 AUTO MIDWEST 1950000 AZ 9 AUTO MIDWEST 5725000 UT REM Note that the following ADD PARTITION statement fails. This action fails because REM all undefined values are automatically included in the DEFAULT partition. ALTER TABLE sales_by_region ADD PARTITION yearly_midwest VALUES ('AZ', 'UT'); ORA-14323: cannot add partition when DEFAULT partition exists REM You must SPLIT the DEFAULT partition to add a new partition. ALTER TABLE sales_by_region SPLIT PARTITION unknown VALUES ('AZ', 'UT') INTO ( PARTITION yearly_midwest, PARTITION unknown); SELECT PARTITION_NAME, HIGH_VALUE FROM USER_TAB_PARTITIONS WHERE TABLE_NAME ='SALES_BY_REGION'; PARTITION_NAME HIGH_VALUE -------------- --------------- UNKNOWN DEFAULT YEARLY_EAST 'MA', 'NY', 'NC' YEARLY_MIDWEST 'AZ', 'UT' YEARLY_NORTH 'MN', 'WI', 'MI' YEARLY_SOUTH 'NM', 'TX', 'GA' YEARLY_WEST 'CA', 'OR', 'WA' 6 Rows selected. SELECT DEPT_NUMBER, DEPT_NAME, QUARTERLY_SALES, STATE FROM SALES_BY_REGION PARTITION(yearly_midwest); DEPT_NUMBER DEPT_NAME QUARTERLY_SALES ST ----------- -------------------- --------------- -- 9 AUTO MIDWEST 1950000 AZ 9 AUTO MIDWEST 5725000 UT SELECT DEPT_NUMBER, DEPT_NAME, QUARTERLY_SALES, STATE FROM SALES_BY_REGION PARTITION(unknown); no rows selected REM Split the DEFAULT partition again to add a new 'yearly_mideast' partition. ALTER TABLE sales_by_region SPLIT PARTITION unknown VALUES ('OH', 'IL') INTO ( PARTITION yearly_mideast, PARTITION unknown); Table altered. SELECT PARTITION_NAME, HIGH_VALUE FROM USER_TAB_PARTITIONS WHERE TABLE_NAME ='SALES_BY_REGION'; PARTITION_NAME HIGH_VALUE ------------------ ------------------ UNKNOWN DEFAULT YEARLY_EAST 'MA', 'NY', 'NC' YEARLY_MIDEAST 'OH', 'IL' YEARLY_MIDWEST 'AZ', 'UT' YEARLY_NORTH 'MN', 'WI', 'MI' YEARLY_SOUTH 'NM', 'TX', 'GA' YEARLY_WEST 'CA', 'OR', 'WA' 7 rows selected. INSERT INTO SALES_BY_REGION VALUES (007, 'AUTO MIDEAST', 925000, 'OH'); INSERT INTO SALES_BY_REGION VALUES (007, 'AUTO MIDEAST', 1325000, 'IL'); SELECT DEPT_NUMBER, DEPT_NAME, QUARTERLY_SALES, STATE FROM SALES_BY_REGION PARTITION(yearly_mideast); DEPT_NUMBER DEPT_NAME QUARTERLY_SALES ST ----------- -------------------- --------------- -- 7 AUTO MIDEAST 925000 OH 7 AUTO MIDEAST 1325000 IL SELECT DEPT_NUMBER, DEPT_NAME, QUARTERLY_SALES, STATE FROM SALES_BY_REGION PARTITION(unknown); no rows selected
4.4.12.3 時間隔パーティション表のパーティションの分割
時間隔パーティション表でALTER
TABLE
SPLIT
PARTITION
文を使用して、レンジまたはマテリアライズ化された時間隔パーティションを分割できます。
時間隔パーティション表のレンジ・パーティションの分割については、「レンジ・パーティション表のパーティションの分割」で説明しています。
マテリアライズ化された時間隔パーティションを分割するには、パーティションの分割点である、時間隔パーティション内のパーティション化キー列の値を指定します。結果の新しい2つのパーティションの1つ目には、パーティション化キー列の値が、指定された値より小さいものをマッピングする元のパーティションのすべての行が含まれます。2つ目のパーティションには、パーティション化キー列値が、指定された値以上のものをマッピングするすべての行が含まれます。パーティションの分割操作により、分割したパーティションの高い方の上限まで遷移点が移動され、新しく分割されたパーティションより小さいすべてのマテリアライズ化された時間隔パーティションは、上限が時間隔の上限によって定義された状態で、暗黙的にレンジ・パーティションに変換されます。
分割の結果である2つのレンジ・パーティションに、オプションで新しい属性を指定できます。表にローカル索引が定義されている場合、この文では、各ローカル索引の一致するパーティションも分割されます。作成されていない時間隔パーティションは分割できません。
次の例では、月単位の時間隔パーティション表transactions
の2007年5月のパーティションを分割する方法を示します。
ALTER TABLE transactions SPLIT PARTITION FOR(TO_DATE('01-MAY-2007','dd-MON-yyyy')) AT (TO_DATE('15-MAY-2007','dd-MON-yyyy'));
4.4.12.4 * - ハッシュ・パーティションの分割
ALTER
TABLE
SPLIT
PARTITION
文を使用して、ハッシュ・パーティションを分割できます。
これは、* - ハッシュ・パーティションのマージの逆の操作です。* - ハッシュ・パーティションを分割すると、新しいサブパーティションが、SUBPARTITIONS
またはSUBPARTITION
句で指定されたサブパーティション数に再度ハッシュされます。または、そのような句が含まれていない場合、新しいパーティションは、分割されるパーティションのサブパーティション(および表領域)の数を継承します。
2つの* - ハッシュ・パーティションをマージする場合と、* - ハッシュ・パーティションを分割する場合では、プロパティの継承方法が異なります。パーティションを分割する場合は親が1つのみであるため、新しいパーティションは元のパーティションからプロパティを継承できます。ただし、パーティションがマージされるとき、プロパティを表レベルのデフォルトから継承する必要があります。親が2つあり、新しいパーティションが片方を無視していずれか1つから継承することはできないためです。
次の例では、レンジ - ハッシュ・パーティションを分割します。
ALTER TABLE all_seasons SPLIT PARTITION quarter_1 AT (TO_DATE('16-dec-1997','dd-mon-yyyy')) INTO (PARTITION q1_1997_1 SUBPARTITIONS 4 STORE IN (ts1,ts3), PARTITION q1_1997_2);
時間隔 - ハッシュ・パーティション表の分割のルールは、時間隔パーティション表の分割のルールと同じです。「時間隔パーティション表のパーティションの分割」に説明されているように、遷移点は分割されたパーティションの上限に変更されます。
4.4.12.5 * - リスト・パーティション表のパーティションの分割
パーティションは、リスト・パーティション表のパーティション・レベルとサブパーティション・レベルの両方で分割できます。
4.4.12.5.1 * - リスト・パーティションの分割
ALTER
TABLE
SPLIT
PARTITION
文を使用して、リスト・パーティションを分割できます。
* - リスト・パーティション表のパーティションの分割は、「リスト・パーティション表のパーティションの分割」での説明と似ています。新しいパーティションのいずれにも、サブパーティションのリテラル値のリストを指定できません。新しいパーティションは、分割元のパーティションからサブパーティションの説明を継承します。
次の例では、quarterly_regional_sales
表のq1_1999
パーティションを分割します。
ALTER TABLE quarterly_regional_sales SPLIT PARTITION q1_1999 AT (TO_DATE('15-Feb-1999','dd-mon-yyyy')) INTO ( PARTITION q1_1999_jan_feb TABLESPACE ts1, PARTITION q1_1999_feb_mar STORAGE (INITIAL 8M) TABLESPACE ts2) PARALLEL 5;
この操作により、パーティションq1_1999
が、q1_1999_jan_feb
およびq1_1999_feb_mar
の2つの結果のパーティションに分割されます。どちらのパーティションも、元のパーティションからサブパーティションの説明を継承します。個々のパーティションには、パーティション・レベルで指定された新しい物理属性(表領域を含む)があります。これらの新しい属性は、新しいパーティションのデフォルト属性になります。この操作は並列度5で実行されます。
ALTER
TABLE
SPLIT
PARTITION
文には、コンポジット・パーティション表のパーティションを分割した結果のサブパーティションに、明示的に名前を付ける方法がありません。ただし、partition name_subpartition name
という書式の名前が付けられた親パーティションのサブパーティションには、データベースにより、新規に作成されたサブパーティションに新しいパーティション名を使用して対応する名前が生成されます。その他すべてのサブパーティションには、SYS_SUBP
n
という書式のシステム生成の名前が割り当てられます。システム生成の名前は、名前が指定されていないパーティションを分割した結果のサブパーティションにも割り当てられます。名前が付けられていないパーティションには、SYS_P
n
という書式のシステム生成のパーティション名が割り当てられます。
次の問合せでは、表quarterly_regional_sales
に対する前のパーティション分割操作で生成されたサブパーティション名が表示されます。「コンポジット・レンジ - リスト・パーティション表の作成について」で作成されてから、この表に対してこの章でこれまでに実行された他の操作の結果も反映しています。
SELECT PARTITION_NAME, SUBPARTITION_NAME, TABLESPACE_NAME FROM DBA_TAB_SUBPARTITIONS WHERE TABLE_NAME='QUARTERLY_REGIONAL_SALES' ORDER BY PARTITION_NAME; PARTITION_NAME SUBPARTITION_NAME TABLESPACE_NAME -------------------- ------------------------------ --------------- Q1_1999_FEB_MAR Q1_1999_FEB_MAR_WEST TS2 Q1_1999_FEB_MAR Q1_1999_FEB_MAR_NORTHEAST TS2 Q1_1999_FEB_MAR Q1_1999_FEB_MAR_SOUTHEAST TS2 Q1_1999_FEB_MAR Q1_1999_FEB_MAR_NORTHCENTRAL TS2 Q1_1999_FEB_MAR Q1_1999_FEB_MAR_SOUTHCENTRAL TS2 Q1_1999_FEB_MAR Q1_1999_FEB_MAR_SOUTH TS2 Q1_1999_JAN_FEB Q1_1999_JAN_FEB_WEST TS1 Q1_1999_JAN_FEB Q1_1999_JAN_FEB_NORTHEAST TS1 Q1_1999_JAN_FEB Q1_1999_JAN_FEB_SOUTHEAST TS1 Q1_1999_JAN_FEB Q1_1999_JAN_FEB_NORTHCENTRAL TS1 Q1_1999_JAN_FEB Q1_1999_JAN_FEB_SOUTHCENTRAL TS1 Q1_1999_JAN_FEB Q1_1999_JAN_FEB_SOUTH TS1 Q1_2000 Q1_2000_NORTHWEST TS3 Q1_2000 Q1_2000_SOUTHWEST TS3 Q1_2000 Q1_2000_NORTHEAST TS3 Q1_2000 Q1_2000_SOUTHEAST TS3 Q1_2000 Q1_2000_NORTHCENTRAL TS3 Q1_2000 Q1_2000_SOUTHCENTRAL TS3 Q2_1999 Q2_1999_NORTHWEST TS4 Q2_1999 Q2_1999_SOUTHWEST TS4 Q2_1999 Q2_1999_NORTHEAST TS4 Q2_1999 Q2_1999_SOUTHEAST TS4 Q2_1999 Q2_1999_NORTHCENTRAL TS4 Q2_1999 Q2_1999_SOUTHCENTRAL TS4 Q3_1999 Q3_1999_NORTHWEST TS4 Q3_1999 Q3_1999_SOUTHWEST TS4 Q3_1999 Q3_1999_NORTHEAST TS4 Q3_1999 Q3_1999_SOUTHEAST TS4 Q3_1999 Q3_1999_NORTHCENTRAL TS4 Q3_1999 Q3_1999_SOUTHCENTRAL TS4 Q4_1999 Q4_1999_NORTHWEST TS4 Q4_1999 Q4_1999_SOUTHWEST TS4 Q4_1999 Q4_1999_NORTHEAST TS4 Q4_1999 Q4_1999_SOUTHEAST TS4 Q4_1999 Q4_1999_NORTHCENTRAL TS4 Q4_1999 Q4_1999_SOUTHCENTRAL TS4 36 rows selected.
4.4.12.5.2 * - リスト・サブパーティションの分割
ALTER
TABLE
SPLIT
SUBPARTITION
文を使用して、リスト・サブパーティションを分割できます。
* - リスト・パーティション表のリスト・サブパーティションの分割は、「リスト・パーティション表のパーティションの分割」で説明されている内容と似ていますが、構文はPARTITION
ではなくSUBPARTITION
です。たとえば、次の文では、quarterly_regional_sales
表のサブパーティションを分割します。
ALTER TABLE quarterly_regional_sales SPLIT SUBPARTITION q2_1999_southwest VALUES ('UT') INTO ( SUBPARTITION q2_1999_utah TABLESPACE ts2, SUBPARTITION q2_1999_southwest TABLESPACE ts3 ) PARALLEL;
この操作により、サブパーティションq2_1999_southwest
が、次の2つのサブパーティションに分割されます。
-
リテラル値のリストが
('UT')
のq2_1999_utah
-
残りのリテラル値のリスト
('AZ','NM')
を継承しているq2_1999_southwest
個々のサブパーティションには、分割されたサブパーティションから継承された新しい物理属性があります。
時間隔 - リスト・パーティション表のサブパーティションは、レンジ・パーティションまたはマテリアライズ化された時間隔パーティションにのみ分割できます。後続の時間隔パーティションのサブパーティション値を変更するには、サブパーティション・テンプレートを変更する必要があります。
4.4.12.6 * - レンジ・パーティションの分割
ALTER
TABLE
SPLIT
PARTITION
文を使用して、レンジ・パーティションを分割できます。
* - レンジ・パーティション表のパーティションの分割は、「レンジ・パーティション表のパーティションの分割」での説明と似ています。新しいパーティションのいずれにも、サブパーティションのレンジ値を指定できません。新しいパーティションは、分割元のパーティションからサブパーティションの説明を継承します。
次の例では、時間隔 - レンジ・パーティション表orders
の2007年5月の時間隔パーティションを分割します。
ALTER TABLE orders SPLIT PARTITION FOR(TO_DATE('01-MAY-2007','dd-MON-yyyy')) AT (TO_DATE('15-MAY-2007','dd-MON-yyyy')) INTO (PARTITION p_fh_may07,PARTITION p_sh_may2007);
この操作により、時間隔パーティションFOR('01-MAY-2007')
が、p_fh_may07
およびp_sh_may_2007
の2つの結果のパーティションに分割されます。どちらのパーティションも、元のパーティションからサブパーティションの説明を継承します。「時間隔パーティションのマージ」で説明されているように、2007年6月のパーティションより前の時間隔パーティションはレンジ・パーティションに変換されます。
ALTER TABLE SPLIT PARTITION
文には、コンポジット・パーティション表のパーティションを分割した結果のサブパーティションに、明示的に名前を付ける方法がありません。ただし、partition name
_
subpartition name
という書式の名前が付けられた親パーティションのサブパーティションには、データベースにより、新規に作成されたサブパーティションに新しいパーティション名を使用して対応する名前が生成されます。その他すべてのサブパーティションには、SYS_SUBP
n
という書式のシステム生成の名前が割り当てられます。システム生成の名前は、名前が指定されていないパーティションを分割した結果のサブパーティションにも割り当てられます。名前が付けられていないパーティションには、SYS_P
n
という書式のシステム生成のパーティション名が割り当てられます。
次の問合せでは、表orders
に対する前のパーティション分割操作で生成されたサブパーティション名と上限値が表示されます。表が作成されてから、この章でこれまでに実行された他の操作の結果も反映しています。
BREAK ON partition_name SELECT partition_name, subpartition_name, high_value FROM user_tab_subpartitions WHERE table_name = 'ORCERS' ORDER BY partition_name, subpartition_position; PARTITION_NAME SUBPARTITION_NAME HIGH_VALUE ------------------------- ------------------------------ --------------- P_BEFORE_2007 P_BEFORE_2007_P_SMALL 1000 P_BEFORE_2007_P_MEDIUM 10000 P_BEFORE_2007_P_LARGE 100000 P_BEFORE_2007_P_EXTRAORDINARY MAXVALUE P_FH_MAY07 SYS_SUBP2985 1000 SYS_SUBP2986 10000 SYS_SUBP2987 100000 SYS_SUBP2988 MAXVALUE P_PRE_MAY_2007 P_PRE_MAY_2007_P_SMALL 1000 P_PRE_MAY_2007_P_MEDIUM 10000 P_PRE_MAY_2007_P_LARGE 100000 P_PRE_MAY_2007_P_EXTRAORDINARY MAXVALUE P_SH_MAY2007 SYS_SUBP2989 1000 SYS_SUBP2990 10000 SYS_SUBP2991 100000 SYS_SUBP2992 MAXVALUE
4.4.12.6.1 * - レンジ・サブパーティションの分割
ALTER
TABLE
SPLIT
SUBPARTITION
文を使用して、レンジ・サブパーティションを分割できます。
* - レンジ・パーティション表のレンジ・サブパーティションの分割は、「レンジ・パーティション表のパーティションの分割」で説明されている内容と似ていますが、構文はPARTITION
ではなくSUBPARTITION
です。たとえば、次の文では、orders
表のサブパーティションを分割します。
ALTER TABLE orders SPLIT SUBPARTITION p_pre_may_2007_p_large AT (50000) INTO (SUBPARTITION p_pre_may_2007_med_large TABLESPACE TS4 , SUBPARTITION p_pre_may_2007_large_large TABLESPACE TS5 );
この操作により、サブパーティションp_pre_may_2007_p_large
が、次の2つのサブパーティションに分割されます。
-
値が10000から50000の
p_pre_may_2007_med_large
-
値が50000から100000の
p_pre_may_2007_large_large
個々のサブパーティションには、分割されたサブパーティションから継承された新しい物理属性があります。
時間隔 - レンジ・パーティション表のサブパーティションは、レンジ・パーティションまたはマテリアライズ化された時間隔パーティションにのみ分割できます。後続の時間隔パーティションのサブパーティションの上限を変更するには、サブパーティション・テンプレートを変更する必要があります。
4.4.12.7 索引パーティションの分割
ローカル索引のパーティションは明示的に分割できません。ローカル索引パーティションが分割されるのは、基礎となる表のパーティションを分割した場合のみです。
ただし、グローバル索引パーティションは、次の例のようにして分割できます。
ALTER INDEX quon1 SPLIT PARTITION canada AT ( 100 ) INTO PARTITION canada1 ..., PARTITION canada2 ...); ALTER INDEX quon1 REBUILD PARTITION canada1; ALTER INDEX quon1 REBUILD PARTITION canada2;
分割する索引に索引データが含まれていても問題はなく、元のパーティションがUNUSABLE
とマークされていなければ、結果のパーティションを再作成する必要はありません。
4.4.12.8 複数のパーティションへの分割
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);
4.4.12.9 高速なSPLIT PARTITIONおよびSPLIT SUBPARTITION操作
Oracle Databaseでは、2つ以上の新しいパーティションを作成し、分割元のパーティションの行を複数の新しいパーティションに再分配することで、SPLIT
PARTITION
操作が実施されます。
この操作には時間がかかります。分割対象のパーティションのすべての行をスキャンしてから、新しいパーティションに1行ずつ挿入する必要があるためです。さらに、UPDATE
INDEXES
句を使用しない場合、ローカルおよびグローバル索引も再作成する必要があります。
分割操作後に、分割元のパーティションのすべての行が、新しいあるパーティションに含まれ、他のパーティションには行が含まれていない場合があります。これは、表の最初または最後のパーティションを分割した場合によく起こります。このような状況はデータベースにより検出され、分割操作が最適化されます。この最適化により、パーティションの追加操作のように動作する分割操作が高速になります。
具体的には、次の条件をすべて満たしている場合に、SPLIT
PARTITION
操作がデータベースにより最適化および高速化されます。
-
結果となるパーティションの1つに、すべての行が含まれます。
-
空ではない結果のパーティションの記憶域特性が、分割されたパーティションの記憶域特性と同一である必要があります。具体的には、次のようになります。
-
分割元のパーティションがコンポジットの場合、結果となる新しいパーティションの各サブパーティションの記憶域特性は、分割元のパーティションのサブパーティションの記憶域特性と同一である必要があります。
-
分割元のパーティションに
LOB
列が含まれる場合、空ではない新しい結果のパーティションの各LOB
(サブ)パーティションの記憶域特性は、分割元のパーティションのLOB
(サブ)パーティションの記憶域特性と同一である必要があります。 -
オーバーフローが含まれる索引構成表のパーティションを分割する場合、空ではない新しい結果のパーティションの各オーバーフロー(サブ)パーティションの記憶域特性は、分割元のパーティションのオーバーフロー(サブ)パーティションの記憶域特性と同一である必要があります。
-
マッピング表が含まれる索引構成表のパーティションを分割する場合、空ではない新しい結果のパーティションの各マッピング表(サブ)パーティションの記憶域特性は、分割元のパーティションのマッピング表(サブ)パーティションの記憶域特性と同一である必要があります。
-
分割後にこれらの条件に一致していれば、UPDATE
INDEXES
句を指定しなかった場合でも、グローバル索引はすべて使用可能なままです。結果となるパーティションに関連付けられているローカル索引(サブ)パーティションは、分割前に使用可能であった場合は、使用可能なままとなります。空ではない結果のパーティションに対応するローカル索引(サブ)パーティションは、分割されたパーティションのローカル索引(サブ)パーティションと同一になります。SPLIT
SUBPARTITION
操作にも、同じ最適化が行われます。
4.4.13 パーティションおよびサブパーティションの切捨てについて
パーティションの切捨ては、パーティションのデータはなくなりますが物理的に削除されないことを除き、パーティションの削除に似ています。
表パーティションからすべての行を削除するには、ALTER
TABLE
TRUNCATE
PARTITION
文を使用します。索引パーティションは切り捨てられません。ただし、表にローカル索引が定義されている場合には、ALTER
TABLE
TRUNCATE
PARTITION
文により各ローカル索引の一致するパーティションが切り捨てられます。UPDATE
INDEXES
を指定しない場合、グローバル索引はUNUSABLE
とマークされ、再作成する必要があります。索引構成表にはUPDATE
INDEXES
は使用できません。かわりにUPDATE
GLOBAL
INDEXES
を使用してください。
この項では、次の項目について説明します。
関連項目:
-
パーティションを切り捨てる非同期グローバル索引メンテナンスの詳細は、「パーティションを削除および切り捨てる非同期グローバル索引メンテナンス」を参照してください
-
パーティションの削除の詳細は、「パーティションおよびサブパーティションの削除について」を参照してください
4.4.13.1 表パーティションの切捨てについて
領域を解放するかどうかに関係なく、表パーティションからすべての行を削除するには、ALTER
TABLE
TRUNCATE
PARTITION
文を使用します。
時間隔パーティション表のパーティションを切り捨てても、遷移点は移動されません。参照パーティション表のパーティションおよびサブパーティションは切り捨てられません。
4.4.13.1.1 データおよびグローバル索引を含む表パーティションの切捨て
データおよびグローバル索引を含む表パーティションを切り捨てる場合、次の方法のいずれかを使用できます。
パーティションにデータおよびグローバル索引が含まれている場合は、次のいずれかの方法(方法1、2または3)を使用して表パーティションを切り捨てます。
方法1
ALTER
TABLE
TRUNCATE
PARTITION
文の実行中は、グローバル索引はそのままにします。この例では、表sales
にはグローバル索引sales_area_ix
があり、この索引は再作成されます。
ALTER TABLE sales TRUNCATE PARTITION dec98; ALTER INDEX sales_area_ix REBUILD;
これは、切り捨てられるパーティションに表の合計データの大部分が含まれる大規模な表に最適な方法です。
方法2
ALTER
TABLE
TRUNCATE
PARTITION
文を発行する前に、DELETE
文を実行してパーティションからすべての行を削除します。DELETE
文によりグローバル索引が更新され、トリガーの起動や、REDOおよびUNDOログの生成も行われます。
たとえば、最初のパーティションを切り捨てるには、次の文を実行します。
DELETE FROM sales PARTITION (dec98); ALTER TABLE sales TRUNCATE PARTITION dec98;
これは、小規模な表、または切り捨てられるパーティションに含まれる表の合計データの割合が少ない場合に、大規模な表に最適な方法です。
方法3
ALTER TABLE
文にUPDATE
INDEXES
を指定します。これにより、パーティションが切り捨てられる時にグローバル索引も切り捨てられます。
ALTER TABLE sales TRUNCATE PARTITION dec98 UPDATE INDEXES;
非同期グローバル索引メンテナンスでは、この操作はメタデータのみの操作です。
4.4.13.1.2 データおよび参照整合性制約を含むパーティションの切捨て
パーティションにデータが含まれ、参照整合性制約がある場合には、パーティションを切り捨てられません。ただし、削除するパーティションのデータを参照しているデータがない場合は、次のいずれかの方法を使用できます。
表パーティションを切り捨てるには、次のいずれかの方法(方法1または2)を選択してください。
方法1
整合性制約を無効化し、ALTER
TABLE
TRUNCATE
PARTITION
文を実行し、整合性制約を再度有効化します。これは、切り捨てられるパーティションに表の合計データの大部分が含まれる大規模な表に最適な方法です。別の表に参照元のデータがある場合には、そのデータを削除して、整合性制約を再度有効化できるようにする必要があります。
方法2
ALTER
TABLE
TRUNCATE
PARTITION
文を発行する前に、DELETE
文を発行してパーティションからすべての行を削除します。DELETE
文によって、参照整合性制約が施行されます。また、トリガーが起動されて、REDOログとUNDOログが生成されます。参照表のデータが削除されるのは、外部キー制約がON DELETE CASCADE
オプション付きで作成されていた場合です。
DELETE FROM sales partition (dec94); ALTER TABLE sales TRUNCATE PARTITION dec94;
これは、小規模な表、または切り捨てられるパーティションに含まれる表の合計データの割合が少ない場合に、大規模な表に最適な方法です。
4.4.13.2 複数のパーティションの切捨て
ALTER
TABLE
文のTRUNCATE
PARTITION
句を使用して、レンジまたはリスト・パーティション表から複数のパーティションを切り捨てることができます。
ローカル索引の対応するパーティションは、操作で切り捨てられます。UPDATE
INDEXES
が指定されていないかぎり、グローバル索引を再構築する必要があります。
次の例では、SQL文のALTER
TABLE
で表の複数のサブパーティションを切り捨てます。データは切り捨てられますが、パーティションは削除されない点に注意してください。
Live SQL:
関連する例をOracle Live SQLのOracle Live SQL: レンジ・パーティション表の切捨てで参照して実行してください。
例4-39 複数のパーティションの切捨て
CREATE TABLE sales_partition_truncate ( product_id NUMBER(6) NOT NULL, customer_id NUMBER NOT NULL, channel_id CHAR(1), promo_id NUMBER(6), sales_date DATE, quantity_sold INTEGER, amount_sold NUMBER(10,2) ) PARTITION BY RANGE (sales_date) SUBPARTITION BY LIST (channel_id) ( PARTITION q3_2018 VALUES LESS THAN (TO_DATE('1-OCT-2018','DD-MON-YYYY')) ( SUBPARTITION q3_2018_p_catalog VALUES ('C'), SUBPARTITION q3_2018_p_internet VALUES ('I'), SUBPARTITION q3_2018_p_partners VALUES ('P'), SUBPARTITION q3_2018_p_direct_sales VALUES ('S'), SUBPARTITION q3_2018_p_tele_sales VALUES ('T') ), PARTITION q4_2018 VALUES LESS THAN (TO_DATE('1-JAN-2019','DD-MON-YYYY')) ( SUBPARTITION q4_2018_p_catalog VALUES ('C'), SUBPARTITION q4_2018_p_internet VALUES ('I'), SUBPARTITION q4_2018_p_partners VALUES ('P'), SUBPARTITION q4_2018_p_direct_sales VALUES ('S'), SUBPARTITION q4_2018_p_tele_sales VALUES ('T') ), PARTITION q1_2019 VALUES LESS THAN (TO_DATE('1-APR-2019','DD-MON-YYYY')) ( SUBPARTITION q1_2019_p_catalog VALUES ('C') , SUBPARTITION q1_2019_p_internet VALUES ('I') , SUBPARTITION q1_2019_p_partners VALUES ('P') , SUBPARTITION q1_2019_p_direct_sales VALUES ('S') , SUBPARTITION q1_2019_p_tele_sales VALUES ('T') ), PARTITION q2_2019 VALUES LESS THAN (TO_DATE('1-JUL-2019','DD-MON-YYYY')) ( SUBPARTITION q2_2019_p_catalog VALUES ('C'), SUBPARTITION q2_2019_p_internet VALUES ('I'), SUBPARTITION q2_2019_p_partners VALUES ('P'), SUBPARTITION q2_2019_p_direct_sales VALUES ('S'), SUBPARTITION q2_2019_p_tele_sales VALUES ('T') ), PARTITION q3_2019 VALUES LESS THAN (TO_DATE('1-OCT-2019','DD-MON-YYYY')) ( SUBPARTITION q3_2019_p_catalog VALUES ('C'), SUBPARTITION q3_2019_p_internet VALUES ('I'), SUBPARTITION q3_2019_p_partners VALUES ('P'), SUBPARTITION q3_2019_p_direct_sales VALUES ('S'), SUBPARTITION q3_2019_p_tele_sales VALUES ('T') ), PARTITION q4_2019 VALUES LESS THAN (TO_DATE('1-JAN-2020','DD-MON-YYYY')) ( SUBPARTITION q4_2019_p_catalog VALUES ('C'), SUBPARTITION q4_2019_p_internet VALUES ('I'), SUBPARTITION q4_2019_p_partners VALUES ('P'), SUBPARTITION q4_2019_p_direct_sales VALUES ('S'), SUBPARTITION q4_2019_p_tele_sales VALUES ('T') ) ); SELECT TABLE_NAME, PARTITION_NAME, SUBPARTITION_NAME FROM USER_TAB_SUBPARTITIONS WHERE TABLE_NAME ='SALES_PARTITION_TRUNCATE'; TABLE_NAME PARTITION_NAME SUBPARTITION_NAME –------------------------ –-------------- –------------------ SALES_PARTITION_TRUNCATE Q1_2019 Q1_2019_P_CATALOG SALES_PARTITION_TRUNCATE Q1_2019 Q1_2019_P_DIRECT_SALES ... 30 rows selected. INSERT INTO sales_partition_truncate VALUES (1001,100,'C',150,'10-SEP-2018',500,2000); INSERT INTO sales_partition_truncate VALUES (1021,200,'C',160,'16-NOV-2018',100,1500); INSERT INTO sales_partition_truncate VALUES (1001,100,'C',150,'10-FEB-2019',500,2000); INSERT INTO sales_partition_truncate VALUES (1021,200,'S',160,'16-FEB-2019',100,1500); INSERT INTO sales_partition_truncate VALUES (1002,110,'I',180,'15-JUN-2019',100,1000); INSERT INTO sales_partition_truncate VALUES (5010,150,'P',200,'20-AUG-2019',1000,10000); INSERT INTO sales_partition_truncate VALUES (1001,100,'T',150,'12-OCT-2019',500,2000); SELECT * FROM sales_partition_truncate; PRODUCT_ID CUSTOMER_ID C PROMO_ID SALES_DAT QUANTITY_SOLD AMOUNT_SOLD ---------- ----------- - ---------- --------- ------------- ----------- 1001 100 C 150 10-SEP-18 500 2000 1021 200 C 160 16-NOV-18 100 1500 1001 100 C 150 10-FEB-19 500 2000 1021 200 S 160 16-FEB-19 100 1500 1002 110 I 180 15-JUN-19 100 1000 5010 150 P 200 20-AUG-19 1000 10000 1001 100 T 150 12-OCT-19 500 2000 7 rows selected. ALTER TABLE sales_partition_truncate TRUNCATE PARTITIONS q3_2018, q4_2018; SELECT * FROM sales_partition_truncate; PRODUCT_ID CUSTOMER_ID C PROMO_ID SALES_DAT QUANTITY_SOLD AMOUNT_SOLD ---------- ----------- - ---------- --------- ------------- ----------- 1001 100 C 150 10-FEB-19 500 2000 1021 200 S 160 16-FEB-19 100 1500 1002 110 I 180 15-JUN-19 100 1000 5010 150 P 200 20-AUG-19 1000 10000 1001 100 T 150 12-OCT-19 500 2000 5 rows selected. SELECT TABLE_NAME, PARTITION_NAME, SUBPARTITION_NAME FROM USER_TAB_SUBPARTITIONS WHERE TABLE_NAME ='SALES_PARTITION_TRUNCATE'; TABLE_NAME PARTITION_NAME SUBPARTITION_NAME –------------------------ –-------------- –------------------ SALES_PARTITION_TRUNCATE Q1_2019 Q1_2019_P_CATALOG SALES_PARTITION_TRUNCATE Q1_2019 Q1_2019_P_DIRECT_SALES ... SALES_PARTITION_TRUNCATE Q3_2018 Q3_2018_P_CATALOG SALES_PARTITION_TRUNCATE Q3_2018 Q3_2018_P_DIRECT_SALES SALES_PARTITION_TRUNCATE Q3_2018 Q3_2018_P_INTERNET SALES_PARTITION_TRUNCATE Q3_2018 Q3_2018_P_PARTNERS SALES_PARTITION_TRUNCATE Q3_2018 Q3_2018_P_TELE_SALES ... SALES_PARTITION_TRUNCATE Q4_2018 Q4_2018_P_CATALOG SALES_PARTITION_TRUNCATE Q4_2018 Q4_2018_P_DIRECT_SALES SALES_PARTITION_TRUNCATE Q4_2018 Q4_2018_P_INTERNET SALES_PARTITION_TRUNCATE Q4_2018 Q4_2018_P_PARTNERS SALES_PARTITION_TRUNCATE Q4_2018 Q4_2018_P_TELE_SALES ... 30 rows selected.
4.4.13.3 サブパーティションの切捨て
コンポジット・パーティション表のサブパーティションからすべての行を削除するには、ALTER
TABLE
TRUNCATE
SUBPARTITION
文を使用します。
サブパーティションを切り捨てる場合、対応するローカル索引サブパーティションも切り捨てられます。
次の例では、ALTER
TABLE
文で表のサブパーティションのデータを切り捨てます。この例では、DROP
STORAGE
句を使用して、削除済の行で占有された領域を表領域のその他のスキーマ・オブジェクトで使用できるようにしています。データは切り捨てられますが、サブパーティションは削除されない点に注意してください。
例4-40 複数のサブパーティションの切捨て
CREATE TABLE sales_partition_truncate ( product_id NUMBER(6) NOT NULL, customer_id NUMBER NOT NULL, channel_id CHAR(1), promo_id NUMBER(6), sales_date DATE, quantity_sold INTEGER, amount_sold NUMBER(10,2) ) PARTITION BY RANGE (sales_date) SUBPARTITION BY LIST (channel_id) ( PARTITION q3_2018 VALUES LESS THAN (TO_DATE('1-OCT-2018','DD-MON-YYYY')) ( SUBPARTITION q3_2018_p_catalog VALUES ('C'), SUBPARTITION q3_2018_p_internet VALUES ('I'), SUBPARTITION q3_2018_p_partners VALUES ('P'), SUBPARTITION q3_2018_p_direct_sales VALUES ('S'), SUBPARTITION q3_2018_p_tele_sales VALUES ('T') ), PARTITION q4_2018 VALUES LESS THAN (TO_DATE('1-JAN-2019','DD-MON-YYYY')) ( SUBPARTITION q4_2018_p_catalog VALUES ('C'), SUBPARTITION q4_2018_p_internet VALUES ('I'), SUBPARTITION q4_2018_p_partners VALUES ('P'), SUBPARTITION q4_2018_p_direct_sales VALUES ('S'), SUBPARTITION q4_2018_p_tele_sales VALUES ('T') ), PARTITION q1_2019 VALUES LESS THAN (TO_DATE('1-APR-2019','DD-MON-YYYY')) ( SUBPARTITION q1_2019_p_catalog VALUES ('C') , SUBPARTITION q1_2019_p_internet VALUES ('I') , SUBPARTITION q1_2019_p_partners VALUES ('P') , SUBPARTITION q1_2019_p_direct_sales VALUES ('S') , SUBPARTITION q1_2019_p_tele_sales VALUES ('T') ), PARTITION q2_2019 VALUES LESS THAN (TO_DATE('1-JUL-2019','DD-MON-YYYY')) ( SUBPARTITION q2_2019_p_catalog VALUES ('C'), SUBPARTITION q2_2019_p_internet VALUES ('I'), SUBPARTITION q2_2019_p_partners VALUES ('P'), SUBPARTITION q2_2019_p_direct_sales VALUES ('S'), SUBPARTITION q2_2019_p_tele_sales VALUES ('T') ), PARTITION q3_2019 VALUES LESS THAN (TO_DATE('1-OCT-2019','DD-MON-YYYY')) ( SUBPARTITION q3_2019_p_catalog VALUES ('C'), SUBPARTITION q3_2019_p_internet VALUES ('I'), SUBPARTITION q3_2019_p_partners VALUES ('P'), SUBPARTITION q3_2019_p_direct_sales VALUES ('S'), SUBPARTITION q3_2019_p_tele_sales VALUES ('T') ), PARTITION q4_2019 VALUES LESS THAN (TO_DATE('1-JAN-2020','DD-MON-YYYY')) ( SUBPARTITION q4_2019_p_catalog VALUES ('C'), SUBPARTITION q4_2019_p_internet VALUES ('I'), SUBPARTITION q4_2019_p_partners VALUES ('P'), SUBPARTITION q4_2019_p_direct_sales VALUES ('S'), SUBPARTITION q4_2019_p_tele_sales VALUES ('T') ) ); SELECT TABLE_NAME, PARTITION_NAME, SUBPARTITION_NAME FROM USER_TAB_SUBPARTITIONS WHERE TABLE_NAME ='SALES_PARTITION_TRUNCATE'; TABLE_NAME PARTITION_NAME SUBPARTITION_NAME –------------------------ –-------------- –------------------ SALES_PARTITION_TRUNCATE Q1_2019 Q1_2019_P_CATALOG SALES_PARTITION_TRUNCATE Q1_2019 Q1_2019_P_DIRECT_SALES ... 30 rows selected. INSERT INTO sales_partition_truncate VALUES (1001,100,'C',150,'10-SEP-2018',500,2000); INSERT INTO sales_partition_truncate VALUES (1021,200,'C',160,'16-NOV-2018',100,1500); INSERT INTO sales_partition_truncate VALUES (1001,100,'C',150,'10-FEB-2019',500,2000); INSERT INTO sales_partition_truncate VALUES (1021,200,'S',160,'16-FEB-2019',100,1500); INSERT INTO sales_partition_truncate VALUES (1002,110,'I',180,'15-JUN-2019',100,1000); INSERT INTO sales_partition_truncate VALUES (5010,150,'P',200,'20-AUG-2019',1000,10000); INSERT INTO sales_partition_truncate VALUES (1001,100,'T',150,'12-OCT-2019',500,2000); SELECT * FROM sales_partition_truncate; PRODUCT_ID CUSTOMER_ID C PROMO_ID SALES_DAT QUANTITY_SOLD AMOUNT_SOLD ---------- ----------- - ---------- --------- ------------- ----------- 1001 100 C 150 10-SEP-18 500 2000 1021 200 C 160 16-NOV-18 100 1500 1001 100 C 150 10-FEB-19 500 2000 1021 200 S 160 16-FEB-19 100 1500 1002 110 I 180 15-JUN-19 100 1000 5010 150 P 200 20-AUG-19 1000 10000 1001 100 T 150 12-OCT-19 500 2000 7 rows selected. ALTER TABLE sales_subpartition_truncate TRUNCATE SUBPARTITIONS q3_2018_p_catalog, q4_2018_p_catalog, q1_2019_p_catalog, q2_2019_p_catalog, q3_2019_p_catalog, q4_2019_p_catalog DROP STORAGE; SELECT * FROM sales_partition_truncate; PRODUCT_ID CUSTOMER_ID C PROMO_ID SALES_DAT QUANTITY_SOLD AMOUNT_SOLD ---------- ----------- - ---------- --------- ------------- ----------- 1021 200 S 160 16-FEB-19 100 1500 1002 110 I 180 15-JUN-19 100 1000 5010 150 P 200 20-AUG-19 1000 10000 1001 100 T 150 12-OCT-19 500 2000 4 rows selected. SELECT TABLE_NAME, PARTITION_NAME, SUBPARTITION_NAME FROM USER_TAB_SUBPARTITIONS WHERE TABLE_NAME ='SALES_PARTITION_TRUNCATE'; TABLE_NAME PARTITION_NAME SUBPARTITION_NAME –------------------------ –-------------- –------------------ SALES_PARTITION_TRUNCATE Q1_2019 Q1_2019_P_CATALOG SALES_PARTITION_TRUNCATE Q1_2019 Q1_2019_P_DIRECT_SALES ... 30 rows selected.
4.4.13.4 カスケード・オプションを使用したパーティションの切捨て
TRUNCATE
TABLE
、ALTER
TABLE
TRUNCATE
PARTITION
およびALTER
TABLE
TRUNCATE
SUBPARTITION
SQL文のCASCADE
オプションを使用して、参照パーティション化されている子表に切捨て操作をカスケードできます。
CASCADE
オプションがTRUNCATE
TABLE
に指定されている場合、表の切捨て操作は、ON
DELETE
CASCADE
を有効化している有効な参照制約を介してターゲット表を参照する子表も切り捨てます。このカスケード・アクションは、孫、ひ孫などに再帰的に適用されます。有効なON
DELETE
CASCADE
参照制約に基づいて切り捨てる表セットを決定した後、このセットの表がセットの外側の子から有効な制約を介して参照されると、エラーが発生します。親および子が複数の参照制約で接続される場合、少なくとも1つの制約のON
DELETE
CASCADE
が有効であると、親を対象とするTRUNCATE
TABLE
CASCADE
操作に成功します。
権限は、操作に影響されるすべての表に必要です。DROP
STORAGE
またはPURGE
MATERIALIZED
VIEW
LOG
など、操作に指定される他のオプションは、操作に影響されるすべての表に適用されます。
CASCADE
オプションを指定すると、TRUNCATE
PARTITION
およびTRUNCATE
SUBPARTITION
操作は、ターゲット表の子である参照パーティション表にカスケードされます。TRUNCATE
は、参照パーティション階層の任意のレベルで指定でき、ターゲット表から開始される子表にカスケードします。権限は子表に必要ありませんが、表をパーティション化制約ではない有効な参照制約で参照できないなど、TRUNCATE
操作の通常の制約が操作に影響されるすべての表に適用されます。
参照パーティションの子を持たない表に指定されている場合、CASCADE
オプションは無視されます。DROP
STORAGE
またはUPDATE
INDEXES
など、操作に指定される他のオプションは、操作に影響されるすべての表に適用されます。
カスケード・オプションはデフォルトで無効になっているため、Oracle Database互換性に影響しません。
ALTER TABLE sales TRUNCATE PARTITION dec2016 DROP STORAGE CASCADE UPDATE INDEXES;