パーティションの管理は、パーティション表および索引を使用する際の最も重要なタスクの1つです。この章では、パーティション表や索引の作成およびメンテナンスの様々な局面について説明します。この章の内容は次のとおりです。
パーティション表や索引の作成は、非パーティション表や索引(『Oracle Database管理者ガイド』を参照)の作成に非常に似ていますが、CREATE TABLE
文にパーティション化句を含めます。文に含めるパーティション化句および副次句は、実行するパーティション化のタイプによって異なります。
パーティション化は、LONG
またはLONG RAW
列を含む表を除き、通常の(ヒープ構成)表および索引構成表の両方で実行できます。パーティション表には、非パーティション・グローバル索引、レンジまたはハッシュ・パーティション・グローバル索引、およびローカル索引を作成できます。
パーティション表を作成(または変更)する際には、行移動句(ENABLE ROW MOVEMENT
またはDISABLE ROW MOVEMENT
のいずれか)を指定できます。この句は、キーが更新された場合に、新しいパーティションへの行の移行を有効化または無効化します。デフォルトはDISABLE ROW MOVEMENT
です。
次の項では、様々なタイプのパーティション表および索引に関するパーティション作成の詳細および例を示します。
関連項目:
|
CREATE TABLE
文のPARTITION BY RANGE
句では、表または索引をレンジ・パーティション化することを指定します。PARTITION
句では個々のパーティション・レンジを特定し、PARTITION
句のオプションの副次句では、パーティション・セグメントに固有の物理属性およびその他の属性を指定できます。パーティション・レベルで上書きされない場合、パーティションは基礎となる表の属性を継承します。
次の例では、4つのパーティションがある表を作成します。売上の四半期ごとに1つのパーティションがあります。列sale_year
、sale_month
およびsale_day
がパーティション化列で、その値が特定の行のパーティション化キーを構成します。VALUES LESS THAN
句によりパーティション・バウンドが決定されます。この句で指定された値の順序リストと比較して、パーティション化キーの値がそれより小さい行がそのパーティションに保存されます。各パーティションには名前(sales_q1
、sales_q2
など)があり、各パーティションは別々の表領域(tsa
、tsb
など)に格納されます。
CREATE TABLE sales ( 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_2006 VALUES LESS THAN (TO_DATE('01-APR-2006','dd-MON-yyyy')) TABLESPACE tsa , PARTITION sales_q2_2006 VALUES LESS THAN (TO_DATE('01-JUL-2006','dd-MON-yyyy')) TABLESPACE tsb , PARTITION sales_q3_2006 VALUES LESS THAN (TO_DATE('01-OCT-2006','dd-MON-yyyy')) TABLESPACE tsc , PARTITION sales_q4_2006 VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-MON-yyyy')) TABLESPACE tsd );
time_id=17-MAR-2006
を含む行は、パーティションsales_q1_2006
に格納されます。
次の例では、レンジ・パーティション表用に使用された前述の例がより複雑になっています。記憶域パラメータおよびLOGGING
属性が表レベルで指定されています。これらは、表自体の表領域レベルから継承された対応するデフォルトを置き換え、レンジ・パーティションに継承されます。ただし、第1四半期には取引が少なかったため、パーティションsales_q1_2006
の記憶域属性は小さく設定されています。ENABLE ROW MOVEMENT
句は、キー値に、行を別のパーティションに配置するような更新が行われた場合に、新しいパーティションへの自動的な行の移行を可能にするために指定されています。
CREATE TABLE sales ( 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) ) STORAGE (INITIAL 100K NEXT 50K) LOGGING PARTITION BY RANGE (time_id) ( PARTITION sales_q1_2006 VALUES LESS THAN (TO_DATE('01-APR-2006','dd-MON-yyyy')) TABLESPACE tsa STORAGE (INITIAL 20K NEXT 10K) , PARTITION sales_q2_2006 VALUES LESS THAN (TO_DATE('01-JUL-2006','dd-MON-yyyy')) TABLESPACE tsb , PARTITION sales_q3_2006 VALUES LESS THAN (TO_DATE('01-OCT-2006','dd-MON-yyyy')) TABLESPACE tsc , PARTITION sales_q4_2006 VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-MON-yyyy')) TABLESPACE tsd ) ENABLE ROW MOVEMENT;
レンジ・パーティション・グローバル索引を作成する際のルールは、レンジ・パーティション表を作成する際のルールに似ています。次に、前述の例で作成された表にsale_month
でレンジ・パーティション・グローバル索引を作成する例を示します。各索引パーティションには名前が付けられていますが、索引のデフォルトの表領域に保存されています。
CREATE INDEX amount_sold_ix ON sales(amount_sold) GLOBAL PARTITION BY RANGE(sale_month) ( PARTITION p_100 VALUES LESS THAN (100) , PARTITION p_1000 VALUES LESS THAN (1000) , PARTITION p_10000 VALUES LESS THAN (10000) , PARTITION p_100000 VALUES LESS THAN (100000) , PARTITION p_1000000 VALUES LESS THAN (1000000) , PARTITION p_greater_than_1000000 VALUES LESS THAN (maxvalue) );
注意: エンタープライズで異なるキャラクタ・セットを使用するデータベースを使用している場合、または今後使用する予定の場合は、文字のソート順序はすべてのキャラクタ・セットで同一ではないため、文字の列をパーティション化する際には注意してください。詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。 |
CREATE TABLE
文のINTERVAL
句により、表の時間隔パーティション化が行われます。PARTITION
句を使用して、少なくともレンジ・パーティションを1つ指定する必要があります。レンジ・パーティション化キーの値により、レンジ・パーティションの上限値が決定されます。上限値は転移点と呼ばれ、データベースにより、その転移点を超えるデータ用の時間隔パーティションが自動的に作成されます。各時間隔パーティションの下限は、前のレンジまたは時間隔パーティションの上限(最上限値は含まない)です。
たとえば、間隔が月単位で転移点が2007年1月1日の時間隔パーティション表を作成した場合、2007年1月の間隔の下限は2007年1月1日です。2007年7月の間隔の下限は、2007年6月のパーティションがすでに作成されているかどうかに関係なく2007年7月1日です。
時間隔パーティションの場合、パーティション化キーは表の単一の列名にする必要があり、NUMBER
またはDATE
型である必要があります。オプションのSTORE IN
句を使用すると、後から作成される時間隔パーティションに1つ以上の表領域を指定できます。この表領域には、ラウンドロビン・アルゴリズムを使用して、データベースが時間隔パーティション・データを格納します。
次の例では、期間の長さが異なる4つのパーティションを指定しています。また、2007年1月1日の転移点より後には、1か月の間隔でパーティションを作成することも指定されています。
CREATE TABLE interval_sales ( 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) INTERVAL(NUMTOYMINTERVAL(1, 'MONTH')) ( PARTITION p0 VALUES LESS THAN (TO_DATE('1-1-2005', 'DD-MM-YYYY')), PARTITION p1 VALUES LESS THAN (TO_DATE('1-1-2006', 'DD-MM-YYYY')), PARTITION p2 VALUES LESS THAN (TO_DATE('1-7-2006', 'DD-MM-YYYY')), PARTITION p3 VALUES LESS THAN (TO_DATE('1-1-2007', 'DD-MM-YYYY')) );
パーティションp3
の上位バウンドは、転移点を表しています。p3
およびそれより下位のすべてのパーティション(この例ではp0
、p1
およびp2
)はレンジ・セクションにありますが、それをより上位のすべてのパーティションは時間隔セクションに分類されます。
CREATE TABLE
文のPARTITION BY HASH
句では、表のハッシュ・パーティション化を指定しています。PARTITIONS
句は、作成するパーティション数の指定や、オプションで、パーティションを格納する表領域の指定に使用できます。また、PARTITION
句を使用して、個々のパーティションおよびその表領域に名前を付けることも可能です。
ハッシュ・パーティションに指定できる属性はTABLESPACE
のみです。表のすべてのハッシュ・パーティションで、表レベルから継承される同一のセグメント属性(TABLESPACE
を除く)を共有する必要があります。
次の例では、ハッシュ・パーティション表を作成します。パーティション化列はid
で、4つのパーティションが作成されてシステム生成の名前が割り当てられます。4つのパーティションは、名前の付けられた4つの表領域(gear1
、gear2
など)に配置されます。
CREATE TABLE scubagear (id NUMBER, name VARCHAR2 (60)) PARTITION BY HASH (id) PARTITIONS 4 STORE IN (gear1, gear2, gear3, gear4);
次の例では、dept
という名前のハッシュ・パーティション表を作成する2つの方法を示します。1つ目の例ではパーティション数が指定されていますが、システム生成の名前が割り当てられ、表のデフォルトの表領域に格納されます。
CREATE TABLE dept (deptno NUMBER, deptname VARCHAR(32)) PARTITION BY HASH(deptno) PARTITIONS 16;
次の例では、個々のパーティション名、およびそれらのパーティションを配置する表領域が指定されています。各ハッシュ・パーティション(セグメント)の初期エクステント・サイズも表レベルで明示的に指定されており、すべてのパーティションでこの属性が継承されます。
CREATE TABLE dept (deptno NUMBER, deptname VARCHAR(32)) STORAGE (INITIAL 10K) PARTITION BY HASH(deptno) (PARTITION p1 TABLESPACE ts1, PARTITION p2 TABLESPACE ts2, PARTITION p3 TABLESPACE ts1, PARTITION p4 TABLESPACE ts3);
この表にローカル索引を作成すると、データベースにより、基礎となる表と同一レベル・パーティション化されるように索引が作成されます。また、基礎となる表でメンテナンス操作が実行された場合には、データベースにより自動的に索引がメンテナンスされます。次に、表dept
にローカル索引を作成する例を示します。
CREATE INDEX loc_dept_ix ON dept(deptno) LOCAL;
オプションで、ハッシュ・パーティションおよびローカル索引パーティションが格納される表領域に名前を付けることができますが、そうしない場合、データベースでは対応する基礎となるパーティションの名前が索引パーティション名として使用され、索引パーティションは表パーティションと同じ表領域に格納されます。
ハッシュ・パーティション・グローバル索引を使用すると、マルチ・ユーザーのOLTP環境において、索引内の少数のリーフ・ブロックの競合率が高い索引のパフォーマンスが向上します。ハッシュ・パーティション・グローバル索引でも、増加し続ける列値における索引の誤差の影響を限定できます。索引パーティション化キーに等価およびIN
述語が含まれる問合せでは、ハッシュ・パーティション・グローバル索引を効率的に使用できます。
ハッシュ・パーティション・グローバル索引を作成する構文は、ハッシュ・パーティション表に使用する構文に似ています。たとえば、次の文では、ハッシュ・パーティション・グローバル索引を作成します。
CREATE INDEX hgidx ON tab (c1,c2,c3) GLOBAL PARTITION BY HASH (c1,c2) (PARTITION p1 TABLESPACE tbs_1, PARTITION p2 TABLESPACE tbs_2, PARTITION p3 TABLESPACE tbs_3, PARTITION p4 TABLESPACE tbs_4);
リスト・パーティションを作成するセマンティックは、レンジ・パーティションを作成するためのセマンティックと非常に似ています。ただし、リスト・パーティションを作成するには、CREATE TABLE
文にPARTITION BY LIST
句を指定し、PARTITION
句で、パーティションに含まれる行を修飾するパーティション化列の離散値であるリテラル値のリストを指定します。リスト・パーティションの場合、パーティション化キーは表の単一の列名にする必要があります。
リスト・パーティションでのみ使用可能なキーワードDEFAULT
を使用して、パーティションの値リストを説明できます。これにより、その他のパーティションにマッピングされていない行を格納するパーティションが特定されます。
レンジ・パーティションと同様、PARTITION
句のオプションの副次句で、パーティション・セグメントに固有の物理属性およびその他の属性を指定できます。パーティション・レベルで上書きされない場合、パーティションは親表の属性を継承します。
次の例では、リスト・パーティション表を作成します。米国の州のグループを含むリージョンでパーティション化された表q1_sales_by_region
が作成されます。
CREATE TABLE q1_sales_by_region (deptno number, deptname varchar2(20), quarterly_sales number(10, 2), state varchar2(2)) PARTITION BY LIST (state) (PARTITION q1_northwest VALUES ('OR', 'WA'), PARTITION q1_southwest VALUES ('AZ', 'UT', 'NM'), PARTITION q1_northeast VALUES ('NY', 'VM', 'NJ'), PARTITION q1_southeast VALUES ('FL', 'GA'), PARTITION q1_northcentral VALUES ('SD', 'WI'), PARTITION q1_southcentral VALUES ('OK', 'TX'));
行のパーティション化列の値が、パーティションを説明する値リストの値に一致するかどうかを確認して、行がパーティションにマッピングされます。
たとえば、次のようにしてサンプル行を挿入します。
(10, 'accounting', 100, 'WA')はパーティションq1_northwest
にマッピングされます。
(20, 'R&D', 150, 'OR')はパーティションq1_northwest
にマッピングされます。
(30, 'sales', 100, 'FL')はパーティションq1_southeast
にマッピングされます。
(40, 'HR', 10, 'TX')はパーティションq1_southcentral
にマッピングされます。
(50, 'systems engineering', 10, 'CA')は表内のいずれのパーティションにもマッピングされず、エラーが発生します。
レンジ・パーティションとは異なり、リスト・パーティションには、パーティション間に明白な順序はありません。また、その他のパーティションにマッピングされていない行がマッピングされる、デフォルトのパーティションを指定できます。前述の例でデフォルトのパーティションを指定した場合、州CAはそのパーティションにマッピングされます。
次の例では、表sales_by_region
を作成し、リスト・メソッドを使用してパーティション化します。最初の2つのPARTITION
句には、表レベルのデフォルトを上書きする物理属性が指定されています。残りのPARTITION
句には属性は指定されておらず、パーティションは表レベルのデフォルトから物理属性を継承します。デフォルトのパーティションも指定されています。
CREATE TABLE sales_by_region (item# INTEGER, qty INTEGER, store_name VARCHAR(30), state_code VARCHAR(2), sale_date DATE) STORAGE(INITIAL 10K NEXT 20K) TABLESPACE tbs5 PARTITION BY LIST (state_code) ( PARTITION region_east VALUES ('MA','NY','CT','NH','ME','MD','VA','PA','NJ') STORAGE (INITIAL 20K NEXT 40K PCTINCREASE 50) TABLESPACE tbs8, PARTITION region_west VALUES ('CA','AZ','NM','OR','WA','UT','NV','CO') NOLOGGING, PARTITION region_south VALUES ('TX','KY','TN','LA','MS','AR','AL','GA'), PARTITION region_central VALUES ('OH','ND','SD','MO','IL','MI','IA'), PARTITION region_null VALUES (NULL), PARTITION region_unknown VALUES (DEFAULT) );
参照パーティション表を作成するには、CREATE TABLE
文にPARTITION BY REFERENCE
句を指定します。この句では、参照制約の名前を指定します。この制約は、表の参照パーティション化の基本として使用されるパーティション化参照制約になります。参照制約は有効化して強制する必要があります。
その他のパーティション表と同じように、オブジェクト・レベルのデフォルト属性を指定できます。また、オプションで、パーティションごとにオブジェクト・レベルのデフォルトを上書きするパーティション記述子も指定できます。
次の例では、order_date
でレンジ・パーティション化されている親表orders
を作成します。参照パーティションの子表order_items
は、Q1_2005
、Q2_2005
、Q3_2005
およびQ4_2005
の4つのパーティションとともに作成されています。各パーティションには、それぞれの親パーティションの注文に対応するorder_items
行が含まれています。
CREATE TABLE orders ( order_id NUMBER(12), order_date TIMESTAMP WITH LOCAL TIME ZONE, order_mode VARCHAR2(8), customer_id NUMBER(6), order_status NUMBER(2), order_total NUMBER(8,2), sales_rep_id NUMBER(6), promotion_id NUMBER(6), CONSTRAINT orders_pk PRIMARY KEY(order_id) ) PARTITION BY RANGE(order_date) ( PARTITION Q1_2005 VALUES LESS THAN (TO_DATE('01-APR-2005','DD-MON-YYYY')), PARTITION Q2_2005 VALUES LESS THAN (TO_DATE('01-JUL-2005','DD-MON-YYYY')), PARTITION Q3_2005 VALUES LESS THAN (TO_DATE('01-OCT-2005','DD-MON-YYYY')), PARTITION Q4_2005 VALUES LESS THAN (TO_DATE('01-JAN-2006','DD-MON-YYYY')) ); CREATE TABLE order_items ( order_id NUMBER(12) NOT NULL, line_item_id NUMBER(3) NOT NULL, product_id NUMBER(6) NOT NULL, unit_price NUMBER(8,2), quantity NUMBER(8), CONSTRAINT order_items_fk FOREIGN KEY(order_id) REFERENCES orders(order_id) ) PARTITION BY REFERENCE(order_items_fk);
パーティション記述子が提供されている場合、説明されているパーティションの数は、参照表のパーティションまたはサブパーティションの数に正確に一致する必要があります。親表がコンポジット・パーティション表の場合、表には、親の各サブパーティションに対して1つのパーティションがあります。そうでない場合、表には、親の各パーティションに対して1つのパーティションがあります。
参照パーティション表のパーティションには、パーティション・バウンドを指定できません。
参照パーティション表のパーティションには名前を付けることができます。パーティションに明示的に名前が付けられていない場合は、明示的に指定された名前が継承した名前と競合しないかぎり、親表の対応するパーティションから名前が継承されます。この場合、パーティションにはシステム生成の名前が使用されます。
参照パーティション表のパーティションに明示的に表領域が指定されていない場合、参照パーティション表のパーティションは、親表の対応するパーティションと連結されます。
コンポジット・パーティション表を作成するには、CREATE TABLE
文にPARTITION BY [ RANGE | LIST ]
句を使用します。次に、PARTITION BY [ RANGE | LIST | HASH ]
句の類似の構文とルールに準拠するSUBPARTITION BY [ RANGE | LIST | HASH ]
句を指定します。個別のPARTITION
とSUBPARTITION
、またはSUBPARTITIONS
句、およびオプションでSUBPARTITION TEMPLATE
句を続けます。
次の文では、レンジ - ハッシュ・パーティション表を作成します。この例では、4つのレンジ・パーティションが作成され、それぞれに8つのサブパーティションが含まれています。サブパーティションには名前が付けられていないため、システム生成の名前が割り当てられていますが、STORE IN
句で指定された4つの表領域(ts1
〜ts4
)に格納されます。
CREATE TABLE sales ( 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) SUBPARTITION BY HASH (cust_id) SUBPARTITIONS 8 STORE IN (ts1, ts2, ts3, ts4) ( PARTITION sales_q1_2006 VALUES LESS THAN (TO_DATE('01-APR-2006','dd-MON-yyyy')) , PARTITION sales_q2_2006 VALUES LESS THAN (TO_DATE('01-JUL-2006','dd-MON-yyyy')) , PARTITION sales_q3_2006 VALUES LESS THAN (TO_DATE('01-OCT-2006','dd-MON-yyyy')) , PARTITION sales_q4_2006 VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-MON-yyyy')) );
レンジ - ハッシュ・パーティション表のパーティションは、そのデータがサブパーティションのセグメントに格納されるため、論理構造のみです。パーティション同様、これらのサブパーティションでも同じ論理属性を共有します。レンジ・パーティション表のレンジ・パーティションとは異なり、所有パーティションと同じ表領域に存在する必要はありませんが、サブパーティションの物理属性は所有パーティションの属性と同一である必要があります。
レンジ・パーティションに指定された属性は、そのパーティションのすべてのサブパーティションに適用されます。各レンジ・パーティションに異なる属性を指定することができ、そのパーティションのサブパーティションを格納する表領域のリストが、その他のパーティションのリストと異なる場合は、パーティション・レベルでSTORE IN
句を指定することもできます。次の例に、この内容をすべて示します。
CREATE TABLE emp (deptno NUMBER, empname VARCHAR(32), grade NUMBER) PARTITION BY RANGE(deptno) SUBPARTITION BY HASH(empname) SUBPARTITIONS 8 STORE IN (ts1, ts3, ts5, ts7) (PARTITION p1 VALUES LESS THAN (1000), PARTITION p2 VALUES LESS THAN (2000) STORE IN (ts2, ts4, ts6, ts8), PARTITION p3 VALUES LESS THAN (MAXVALUE) (SUBPARTITION p3_s1 TABLESPACE ts4, SUBPARTITION p3_s2 TABLESPACE ts5));
サブパーティション・テンプレートを使用することで、コンポジット・パーティション表の指定がどのように簡略化されるかの詳細は、「コンポジット・パーティション表を説明するサブパーティション・テンプレートの使用」を参照してください。
次の文で、索引セグメントが表領域ts7
、ts8
およびts9
に分散しているemp
表にローカル索引を作成する例を示します。
CREATE INDEX emp_ix ON emp(deptno) LOCAL STORE IN (ts7, ts8, ts9);
このローカル索引は、次のようにして、ベース表と同一レベル・パーティション化されます。
ベース表と同じ数のパーティションが含まれます。
各索引パーティションには、対応するベース表のパーティションと同じ数のサブパーティションが含まれます。
ベース表の指定されたサブパーティションに存在する行の索引エントリは、索引の対応するサブパーティションに格納されます。
レンジ - リスト・コンポジット・パーティション表のレンジ・パーティションは、非コンポジット・レンジ・パーティション表と同様に記述されます。これにより、PARTITION
句のオプションの副次句で、パーティション・セグメントに固有の物理属性およびその他の属性(表領域を含む)を指定できます。パーティション・レベルで上書きされない場合、パーティションは基礎となる表の属性を継承します。
SUBPARTITION
句のリスト・サブパーティションの説明は、指定できる唯一の物理属性が表領域(オプション)であることを除き、非コンポジット・リスト・パーティションと同様に記述されます。サブパーティションは、パーティションの説明からその他すべての物理属性を継承します。
次の例では、レンジ - リスト・パーティション化の使用方法を示します。この例では、製品の販売データを四半期ごとに追跡し、各四半期内で、指定された州ごとにグループ化しています。
CREATE TABLE quarterly_regional_sales (deptno number, item_no varchar2(20), txn_date date, txn_amount number, state varchar2(2)) TABLESPACE ts4 PARTITION BY RANGE (txn_date) SUBPARTITION BY LIST (state) (PARTITION q1_1999 VALUES LESS THAN (TO_DATE('1-APR-1999','DD-MON-YYYY')) (SUBPARTITION q1_1999_northwest VALUES ('OR', 'WA'), SUBPARTITION q1_1999_southwest VALUES ('AZ', 'UT', 'NM'), SUBPARTITION q1_1999_northeast VALUES ('NY', 'VM', 'NJ'), SUBPARTITION q1_1999_southeast VALUES ('FL', 'GA'), SUBPARTITION q1_1999_northcentral VALUES ('SD', 'WI'), SUBPARTITION q1_1999_southcentral VALUES ('OK', 'TX') ), PARTITION q2_1999 VALUES LESS THAN ( TO_DATE('1-JUL-1999','DD-MON-YYYY')) (SUBPARTITION q2_1999_northwest VALUES ('OR', 'WA'), SUBPARTITION q2_1999_southwest VALUES ('AZ', 'UT', 'NM'), SUBPARTITION q2_1999_northeast VALUES ('NY', 'VM', 'NJ'), SUBPARTITION q2_1999_southeast VALUES ('FL', 'GA'), SUBPARTITION q2_1999_northcentral VALUES ('SD', 'WI'), SUBPARTITION q2_1999_southcentral VALUES ('OK', 'TX') ), PARTITION q3_1999 VALUES LESS THAN (TO_DATE('1-OCT-1999','DD-MON-YYYY')) (SUBPARTITION q3_1999_northwest VALUES ('OR', 'WA'), SUBPARTITION q3_1999_southwest VALUES ('AZ', 'UT', 'NM'), SUBPARTITION q3_1999_northeast VALUES ('NY', 'VM', 'NJ'), SUBPARTITION q3_1999_southeast VALUES ('FL', 'GA'), SUBPARTITION q3_1999_northcentral VALUES ('SD', 'WI'), SUBPARTITION q3_1999_southcentral VALUES ('OK', 'TX') ), PARTITION q4_1999 VALUES LESS THAN ( TO_DATE('1-JAN-2000','DD-MON-YYYY')) (SUBPARTITION q4_1999_northwest VALUES ('OR', 'WA'), SUBPARTITION q4_1999_southwest VALUES ('AZ', 'UT', 'NM'), SUBPARTITION q4_1999_northeast VALUES ('NY', 'VM', 'NJ'), SUBPARTITION q4_1999_southeast VALUES ('FL', 'GA'), SUBPARTITION q4_1999_northcentral VALUES ('SD', 'WI'), SUBPARTITION q4_1999_southcentral VALUES ('OK', 'TX') ) );
行のパーティション化列の値が、特定のパーティション・レンジに含まれているかどうかを確認して、行がパーティションにマッピングされます。その後、記述子の値リストにサブパーティション列の値と一致する値が含まれるサブパーティションを特定して、そのパーティション内のサブパーティションに行がマッピングされます。
たとえば、次のようにしてサンプル行を挿入します。
(10, 4532130, '23-Jan-1999', 8934.10, 'WA')はサブパーティションq1_1999_northwest
にマッピングされます。
(20, 5671621, '15-May-1999', 49021.21, 'OR')はサブパーティションq2_1999_northwest
にマッピングされます。
(30, 9977612, '07-Sep-1999', 30987.90, 'FL')はサブパーティションq3_1999_southeast
にマッピングされます。
(40, 9977612, '29-Nov-1999', 67891.45, 'TX')はサブパーティションq4_1999_southcentral
にマッピングされます。
(40, 4532130, '5-Jan-2000', 897231.55, 'TX')は表内のいずれのパーティションにもマッピングされないため、エラーが発生します。
(50, 5671621, '17-Dec-1999', 76123.35, 'CA')は表内のいずれのサブパーティションにもマッピングされないため、エラーが発生します。
レンジ - リスト・パーティション表のパーティションは、そのデータがサブパーティションのセグメントに格納されるため、論理構造のみです。リスト・サブパーティションの特性は、リスト・パーティションと同様です。リスト・パーティション化にデフォルトのパーティションを指定する場合と同じように、デフォルトのサブパーティションを指定できます。
次の例では、パーティション・レベルおよびサブパーティション・レベルで表領域を指定する表を作成します。各パーティション内のサブパーティションの数は様々で、デフォルトのサブパーティションが指定されています。
CREATE TABLE sample_regional_sales (deptno number, item_no varchar2(20), txn_date date, txn_amount number, state varchar2(2)) PARTITION BY RANGE (txn_date) SUBPARTITION BY LIST (state) (PARTITION q1_1999 VALUES LESS THAN (TO_DATE('1-APR-1999','DD-MON-YYYY')) TABLESPACE tbs_1 (SUBPARTITION q1_1999_northwest VALUES ('OR', 'WA'), SUBPARTITION q1_1999_southwest VALUES ('AZ', 'UT', 'NM'), SUBPARTITION q1_1999_northeast VALUES ('NY', 'VM', 'NJ'), SUBPARTITION q1_1999_southeast VALUES ('FL', 'GA'), SUBPARTITION q1_others VALUES (DEFAULT) TABLESPACE tbs_4 ), PARTITION q2_1999 VALUES LESS THAN ( TO_DATE('1-JUL-1999','DD-MON-YYYY')) TABLESPACE tbs_2 (SUBPARTITION q2_1999_northwest VALUES ('OR', 'WA'), SUBPARTITION q2_1999_southwest VALUES ('AZ', 'UT', 'NM'), SUBPARTITION q2_1999_northeast VALUES ('NY', 'VM', 'NJ'), SUBPARTITION q2_1999_southeast VALUES ('FL', 'GA'), SUBPARTITION q2_1999_northcentral VALUES ('SD', 'WI'), SUBPARTITION q2_1999_southcentral VALUES ('OK', 'TX') ), PARTITION q3_1999 VALUES LESS THAN (TO_DATE('1-OCT-1999','DD-MON-YYYY')) TABLESPACE tbs_3 (SUBPARTITION q3_1999_northwest VALUES ('OR', 'WA'), SUBPARTITION q3_1999_southwest VALUES ('AZ', 'UT', 'NM'), SUBPARTITION q3_others VALUES (DEFAULT) TABLESPACE tbs_4 ), PARTITION q4_1999 VALUES LESS THAN ( TO_DATE('1-JAN-2000','DD-MON-YYYY')) TABLESPACE tbs_4 );
この例のサブパーティションの説明は次のようになります。
すべてのサブパーティションで、表領域レベルのデフォルトから、表領域以外の物理属性が継承されます。これは、パーティションまたはサブパーティションに指定された唯一の物理属性が表領域であるためです。表レベルで物理属性が指定されていないため、表領域レベルのデフォルトがすべてのレベルで継承されます。
tbs_4
に格納され、その他のいずれのパーティションにもマッピングされていないすべての行を含むサブパーティションq1_others
を除き、パーティションq1_1999
の最初の4つのサブパーティションは、すべてtbs_1
に格納されます。
パーティションq2_1999
の6つのサブパーティションは、すべてtbs_2
に格納されます。
tbs_4
に格納され、その他のいずれのパーティションにもマッピングされていないすべての行を含むサブパーティションq3_others
を除き、パーティションq3_1999
の最初の2つのサブパーティションは、すべてtbs_3
に格納されます。
パーティションq4_1999
にはサブパーティションの説明はありません。このため、デフォルトのサブパーティションが1つ作成され、tbs_4
に格納されます。サブパーティション名は、SYS_SUBP
n
という書式でシステム生成されます。
サブパーティション・テンプレートを使用することで、コンポジット・パーティション表の指定がどのように簡略化されるかの詳細は、「コンポジット・パーティション表を説明するサブパーティション・テンプレートの使用」を参照してください。
レンジ - レンジ・コンポジット・パーティション表のレンジ・パーティションは、非コンポジット・レンジ・パーティション表と同じように記述されます。これにより、PARTITION
句のオプションの副次句で、パーティション・セグメントに固有の物理属性およびその他の属性(表領域を含む)を指定できます。パーティション・レベルで上書きされない場合、パーティションは基礎となる表の属性を継承します。
SUBPARTITION
句のレンジ・サブパーティションの説明は、指定できる唯一の物理属性がオプションの表領域であることを除き、非コンポジット・レンジ・パーティションと同じように記述されます。サブパーティションは、パーティションの説明からその他すべての物理属性を継承します。
次の例では、レンジ - レンジ・パーティション化の使用方法を示します。この例では出荷を追跡しています。顧客とのサービス内容合意書には、すべての注文品は、注文が行われてから1か月以内に配送すると記載されています。注文には次のタイプがあります。
e(早期): 注文が行われた次の月の中旬までに配送される注文。これらの注文は、顧客の予想より早く配送されます。
a(合意どおり): 注文が行われてから1か月以内に配送される注文(ただし早期の注文ではありません)。
l(遅延): 注文が行われた後、1か月を過ぎてから配送される注文。
CREATE TABLE shipments ( order_id NUMBER NOT NULL , order_date DATE NOT NULL , delivery_date DATE NOT NULL , customer_id NUMBER NOT NULL , sales_amount NUMBER NOT NULL ) PARTITION BY RANGE (order_date) SUBPARTITION BY RANGE (delivery_date) ( PARTITION p_2006_jul VALUES LESS THAN (TO_DATE('01-AUG-2006','dd-MON-yyyy')) ( SUBPARTITION p06_jul_e VALUES LESS THAN (TO_DATE('15-AUG-2006','dd-MON-yyyy')) , SUBPARTITION p06_jul_a VALUES LESS THAN (TO_DATE('01-SEP-2006','dd-MON-yyyy')) , SUBPARTITION p06_jul_l VALUES LESS THAN (MAXVALUE) ) , PARTITION p_2006_aug VALUES LESS THAN (TO_DATE('01-SEP-2006','dd-MON-yyyy')) ( SUBPARTITION p06_aug_e VALUES LESS THAN (TO_DATE('15-SEP-2006','dd-MON-yyyy')) , SUBPARTITION p06_aug_a VALUES LESS THAN (TO_DATE('01-OCT-2006','dd-MON-yyyy')) , SUBPARTITION p06_aug_l VALUES LESS THAN (MAXVALUE) ) , PARTITION p_2006_sep VALUES LESS THAN (TO_DATE('01-OCT-2006','dd-MON-yyyy')) ( SUBPARTITION p06_sep_e VALUES LESS THAN (TO_DATE('15-OCT-2006','dd-MON-yyyy')) , SUBPARTITION p06_sep_a VALUES LESS THAN (TO_DATE('01-NOV-2006','dd-MON-yyyy')) , SUBPARTITION p06_sep_l VALUES LESS THAN (MAXVALUE) ) , PARTITION p_2006_oct VALUES LESS THAN (TO_DATE('01-NOV-2006','dd-MON-yyyy')) ( SUBPARTITION p06_oct_e VALUES LESS THAN (TO_DATE('15-NOV-2006','dd-MON-yyyy')) , SUBPARTITION p06_oct_a VALUES LESS THAN (TO_DATE('01-DEC-2006','dd-MON-yyyy')) , SUBPARTITION p06_oct_l VALUES LESS THAN (MAXVALUE) ) , PARTITION p_2006_nov VALUES LESS THAN (TO_DATE('01-DEC-2006','dd-MON-yyyy')) ( SUBPARTITION p06_nov_e VALUES LESS THAN (TO_DATE('15-DEC-2006','dd-MON-yyyy')) , SUBPARTITION p06_nov_a VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-MON-yyyy')) , SUBPARTITION p06_nov_l VALUES LESS THAN (MAXVALUE) ) , PARTITION p_2006_dec VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-MON-yyyy')) ( SUBPARTITION p06_dec_e VALUES LESS THAN (TO_DATE('15-JAN-2007','dd-MON-yyyy')) , SUBPARTITION p06_dec_a VALUES LESS THAN (TO_DATE('01-FEB-2007','dd-MON-yyyy')) , SUBPARTITION p06_dec_l VALUES LESS THAN (MAXVALUE) ) );
行のパーティション化列の値が、特定のパーティション・レンジに含まれているかどうかを確認して、行がパーティションにマッピングされます。その後、サブパーティション化列の値が特定のレンジ内に含まれているかどうかを確認して、そのパーティション内のサブパーティションに行がマッピングされます。たとえば、発注日が2006年9月で配送日が2006年10月28の出荷は、パーティションp06_oct_a
に含まれます。
サブパーティション・テンプレートを使用することで、コンポジット・パーティション表の指定がどのように簡略化されるかの詳細は、「コンポジット・パーティション表を説明するサブパーティション・テンプレートの使用」を参照してください。
リスト - ハッシュ、リスト - リストおよびリスト - レンジのコンポジット・パーティション化の概念は、レンジ - ハッシュ、レンジ - リストおよびレンジ - レンジのパーティション化の概念と似ています。ただし、この場合には、PARTITION BY LIST
を指定してパーティション化計画を定義します。
リスト - *コンポジット・パーティション表のリスト・パーティションは、非コンポジット・レンジ・パーティション表と同じように記述されます。これにより、PARTITION
句のオプションの副次句で、パーティション・セグメントに固有の物理属性およびその他の属性(表領域を含む)を指定できます。パーティション・レベルで上書きされない場合、パーティションは基礎となる表の属性を継承します。
SUBPARTITION
またはSUBPARTITIONS
句のサブパーティションの説明は、レンジ - *コンポジット・パーティション化と同様に記述されます。
関連項目:
|
後続の項では、各種のリスト - *コンポジット・パーティション化メソッドの例を示します。
次の例では、リージョンでリスト・パーティション化され、顧客IDによるハッシングを使用してサブパーティション化されたaccounts
表を示します。
CREATE TABLE accounts ( id NUMBER , account_number NUMBER , customer_id NUMBER , balance NUMBER , branch_id NUMBER , region VARCHAR(2) , status VARCHAR2(1) ) PARTITION BY LIST (region) SUBPARTITION BY HASH (customer_id) SUBPARTITIONS 8 ( PARTITION p_northwest VALUES ('OR', 'WA') , PARTITION p_southwest VALUES ('AZ', 'UT', 'NM') , PARTITION p_northeast VALUES ('NY', 'VM', 'NJ') , PARTITION p_southeast VALUES ('FL', 'GA') , PARTITION p_northcentral VALUES ('SD', 'WI') , PARTITION p_southcentral VALUES ('OK', 'TX') );
サブパーティション・テンプレートを使用することで、コンポジット・パーティション表の指定がどのように簡略化されるかの詳細は、「コンポジット・パーティション表を説明するサブパーティション・テンプレートの使用」を参照してください。
次の例では、リージョンでリスト・パーティション化され、アカウント・ステータスによるリスト化を使用してサブパーティション化されたaccounts
表を示します。
CREATE TABLE accounts ( id NUMBER , account_number NUMBER , customer_id NUMBER , balance NUMBER , branch_id NUMBER , region VARCHAR(2) , status VARCHAR2(1) ) PARTITION BY LIST (region) SUBPARTITION BY LIST (status) ( PARTITION p_northwest VALUES ('OR', 'WA') ( SUBPARTITION p_nw_bad VALUES ('B') , SUBPARTITION p_nw_average VALUES ('A') , SUBPARTITION p_nw_good VALUES ('G') ) , PARTITION p_southwest VALUES ('AZ', 'UT', 'NM') ( SUBPARTITION p_sw_bad VALUES ('B') , SUBPARTITION p_sw_average VALUES ('A') , SUBPARTITION p_sw_good VALUES ('G') ) , PARTITION p_northeast VALUES ('NY', 'VM', 'NJ') ( SUBPARTITION p_ne_bad VALUES ('B') , SUBPARTITION p_ne_average VALUES ('A') , SUBPARTITION p_ne_good VALUES ('G') ) , PARTITION p_southeast VALUES ('FL', 'GA') ( SUBPARTITION p_se_bad VALUES ('B') , SUBPARTITION p_se_average VALUES ('A') , SUBPARTITION p_se_good VALUES ('G') ) , PARTITION p_northcentral VALUES ('SD', 'WI') ( SUBPARTITION p_nc_bad VALUES ('B') , SUBPARTITION p_nc_average VALUES ('A') , SUBPARTITION p_nc_good VALUES ('G') ) , PARTITION p_southcentral VALUES ('OK', 'TX') ( SUBPARTITION p_sc_bad VALUES ('B') , SUBPARTITION p_sc_average VALUES ('A') , SUBPARTITION p_sc_good VALUES ('G') ) );
サブパーティション・テンプレートを使用することで、コンポジット・パーティション表の指定がどのように簡略化されるかの詳細は、「コンポジット・パーティション表を説明するサブパーティション・テンプレートの使用」を参照してください。
次の例では、リージョンでリスト・パーティション化され、勘定残高によるレンジ化を使用してサブパーティション化されたaccounts
表を示します。行移動が有効化されていることに注意してください。異なるリスト・パーティションのサブパーティションには、別々のレンジを指定できます。
CREATE TABLE accounts ( id NUMBER , account_number NUMBER , customer_id NUMBER , balance NUMBER , branch_id NUMBER , region VARCHAR(2) , status VARCHAR2(1) ) PARTITION BY LIST (region) SUBPARTITION BY RANGE (balance) ( PARTITION p_northwest VALUES ('OR', 'WA') ( SUBPARTITION p_nw_low VALUES LESS THAN (1000) , SUBPARTITION p_nw_average VALUES LESS THAN (10000) , SUBPARTITION p_nw_high VALUES LESS THAN (100000) , SUBPARTITION p_nw_extraordinary VALUES LESS THAN (MAXVALUE) ) , PARTITION p_southwest VALUES ('AZ', 'UT', 'NM') ( SUBPARTITION p_sw_low VALUES LESS THAN (1000) , SUBPARTITION p_sw_average VALUES LESS THAN (10000) , SUBPARTITION p_sw_high VALUES LESS THAN (100000) , SUBPARTITION p_sw_extraordinary VALUES LESS THAN (MAXVALUE) ) , PARTITION p_northeast VALUES ('NY', 'VM', 'NJ') ( SUBPARTITION p_ne_low VALUES LESS THAN (1000) , SUBPARTITION p_ne_average VALUES LESS THAN (10000) , SUBPARTITION p_ne_high VALUES LESS THAN (100000) , SUBPARTITION p_ne_extraordinary VALUES LESS THAN (MAXVALUE) ) , PARTITION p_southeast VALUES ('FL', 'GA') ( SUBPARTITION p_se_low VALUES LESS THAN (1000) , SUBPARTITION p_se_average VALUES LESS THAN (10000) , SUBPARTITION p_se_high VALUES LESS THAN (100000) , SUBPARTITION p_se_extraordinary VALUES LESS THAN (MAXVALUE) ) , PARTITION p_northcentral VALUES ('SD', 'WI') ( SUBPARTITION p_nc_low VALUES LESS THAN (1000) , SUBPARTITION p_nc_average VALUES LESS THAN (10000) , SUBPARTITION p_nc_high VALUES LESS THAN (100000) , SUBPARTITION p_nc_extraordinary VALUES LESS THAN (MAXVALUE) ) , PARTITION p_southcentral VALUES ('OK', 'TX') ( SUBPARTITION p_sc_low VALUES LESS THAN (1000) , SUBPARTITION p_sc_average VALUES LESS THAN (10000) , SUBPARTITION p_sc_high VALUES LESS THAN (100000) , SUBPARTITION p_sc_extraordinary VALUES LESS THAN (MAXVALUE) ) ) ENABLE ROW MOVEMENT;
サブパーティション・テンプレートを使用することで、コンポジット・パーティション表の指定がどのように簡略化されるかの詳細は、「コンポジット・パーティション表を説明するサブパーティション・テンプレートの使用」を参照してください。
時間隔 - *コンポジット・パーティション化の概念は、レンジ - *パーティション化の概念と似ています。ただし、PARTITION BY RANGE
句を拡張して、INTERVAL
定義を含めます。PARTITION
句を使用して、少なくともレンジ・パーティションを1つ指定する必要があります。レンジ・パーティション化キーの値により、レンジ・パーティションの上限値が決定されます。上限値は転移点と呼ばれ、データベースにより、その転移点を超えるデータ用の時間隔パーティションが自動的に作成されます。
時間隔 - *パーティション表の時間隔のサブパーティションは、データベースによる時間隔の作成時に作成されます。後続のサブパーティションの定義は、サブパーティション・テンプレートを使用してのみ指定できます。サブパーティション・テンプレートの使用方法の詳細は、「コンポジット・パーティション表を説明するサブパーティション・テンプレートの使用」を参照してください。
時間隔 - ハッシュ・パーティション表は、次のいずれかの方法を使用して複数のハッシュ・パーティションとともに作成できます。
PARTITIONS
句にハッシュ・パーティションの数を指定する。
サブパーティション・テンプレートを使用する。
これらのいずれの方法も使用しない場合、後続の時間隔パーティションにはハッシュ・サブパーティションが1つのみ作成されます。
次の例では、time_id
により月間隔で時間隔パーティション化され、cust_id
でハッシュ・サブパーティション化されたsales
表を示します。この例では、個々のハッシュ・パーティションに特定の表領域を割り当てずに、ハッシュ・パーティション数が指定されていることに注意してください。
CREATE TABLE sales ( 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) INTERVAL (NUMTOYMINTERVAL(1,'MONTH')) SUBPARTITION BY HASH (cust_id) SUBPARTITIONS 4 ( PARTITION before_2000 VALUES LESS THAN (TO_DATE('01-JAN-2000','dd-MON-yyyy'))) PARALLEL;
次の例では、time_id
により月間隔で時間隔パーティション化され、cust_id
でハッシュ・サブパーティション化された同じsales
表を示します。ただし、この例では、個々のハッシュ・パーティションは別々の表領域に格納されます。後続のハッシュ・サブパーティションへの表領域の割当てを定義するために、サブパーティション・テンプレートが使用されていることに注意してください。サブパーティション・テンプレートの使用方法の詳細は、「コンポジット・パーティション表を説明するサブパーティション・テンプレートの使用」を参照してください。
CREATE TABLE sales ( 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) INTERVAL (NUMTOYMINTERVAL(1,'MONTH')) SUBPARTITION BY hash(cust_id) SUBPARTITION template ( SUBPARTITION p1 TABLESPACE ts1 , SUBPARTITION p2 TABLESPACE ts2 , SUBPARTITION p3 TABLESPACE ts3 , SUBPARTITION P4 TABLESPACE ts4 ) ( PARTITION before_2000 VALUES LESS THAN (TO_DATE('01-JAN-2000','dd-MON-yyyy')) ) PARALLEL;
後続の時間隔パーティションのリスト・サブパーティションは、サブパーティション・テンプレートを使用してのみ定義できます。サブパーティション・テンプレートを使用しない場合、各時間隔パーティションに作成されるサブパーティションはDEFAULT
サブパーティションのみです。サブパーティション・テンプレートの使用方法の詳細は、「コンポジット・パーティション表を説明するサブパーティション・テンプレートの使用」を参照してください。
次の例では、time_id
により日次間隔で時間隔パーティション化され、channel_id
でリスト・サブパーティション化されたsales
表を示します。
CREATE TABLE sales ( 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) INTERVAL (NUMTODSINTERVAL(1,'DAY')) SUBPARTITION BY RANGE(amount_sold) SUBPARTITION TEMPLATE ( SUBPARTITION p_low VALUES LESS THAN (1000) , SUBPARTITION p_medium VALUES LESS THAN (4000) , SUBPARTITION p_high VALUES LESS THAN (8000) , SUBPARTITION p_ultimate VALUES LESS THAN (maxvalue) ) ( PARTITION before_2000 VALUES LESS THAN (TO_DATE('01-JAN-2000','dd-MON-yyyy'))) PARALLEL;
将来の時間隔パーティションのレンジ・サブパーティションは、サブパーティション・テンプレートを使用してのみ定義できます。サブパーティション・テンプレートを使用しない場合、各時間隔パーティションに作成されるサブパーティションは上限MAXVALUE
付きのレンジ・サブパーティションのみです。サブパーティション・テンプレートの使用方法の詳細は、「コンポジット・パーティション表を説明するサブパーティション・テンプレートの使用」を参照してください。
次の例では、time_id
により日次間隔で時間隔パーティション化され、amount_sold
でレンジ・サブパーティション化されたsales
表を示します。
CREATE TABLE sales ( 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) INTERVAL (NUMTODSINTERVAL(1,'DAY')) SUBPARTITION BY LIST (channel_id) SUBPARTITION TEMPLATE ( SUBPARTITION p_catalog VALUES ('C') , SUBPARTITION p_internet VALUES ('I') , SUBPARTITION p_partners VALUES ('P') , SUBPARTITION p_direct_sales VALUES ('S') , SUBPARTITION p_tele_sales VALUES ('T') ) ( PARTITION before_2000 VALUES LESS THAN (TO_DATE('01-JAN-2000','dd-MON-yyyy'))) PARALLEL;
サブパーティション・テンプレートを使用して、コンポジット・パーティション表にサブパーティションを作成できます。サブパーティション・テンプレートを使用すると、表の各パーティションにサブパーティション記述子を指定する必要がないため、サブパーティションの指定を簡略化できます。かわりに、テンプレートに一度のみサブパーティションを記述し、そのサブパーティション・テンプレートを表の各パーティションに適用します。時間隔 - *コンポジット・パーティション表の場合、時間隔パーティションのサブパーティションを定義するには、サブパーティション・テンプレートを使用する必要があります。
サブパーティション・テンプレートは、パーティションにサブパーティション記述子が指定されていない場合に適用されます。サブパーティション記述子が指定されている場合は、そのパーティションのサブパーティション・テンプレートのかわりに適用されます。サブパーティション・テンプレートが指定されておらず、パーティションにもサブパーティション記述子が指定されていない場合は、デフォルトのサブパーティションが1つ作成されます。
[レンジ|時間隔|リスト] - ハッシュ・パーティション表の場合、サブパーティション・テンプレートでサブパーティションを詳細に指定することも、ハッシュ・サブパーティションの数のみを指定することも可能です。
次の例では、サブパーティション・テンプレートを使用して、レンジ - ハッシュ・パーティション表を作成します。
CREATE TABLE emp_sub_template (deptno NUMBER, empname VARCHAR(32), grade NUMBER) PARTITION BY RANGE(deptno) SUBPARTITION BY HASH(empname) SUBPARTITION TEMPLATE (SUBPARTITION a TABLESPACE ts1, SUBPARTITION b TABLESPACE ts2, SUBPARTITION c TABLESPACE ts3, SUBPARTITION d TABLESPACE ts4 ) (PARTITION p1 VALUES LESS THAN (1000), PARTITION p2 VALUES LESS THAN (2000), PARTITION p3 VALUES LESS THAN (MAXVALUE) );
この例の表の説明は次のようになります。
各パーティションには、サブパーティション・テンプレートに記述されているように4つのサブパーティションがあります。
各サブパーティションには表領域が指定されています。サブパーティション・テンプレートで1つのサブパーティションに表領域が指定されている場合は、すべてのサブパーティションに表領域を1つ指定する必要があります。
時間隔 - *サブパーティション化を使用している場合以外、サブパーティションの名前は、次の書式でパーティション名とサブパーティション名を連結して生成されます。
partition name_subpartition name
時間隔 - *サブパーティション化の場合、サブパーティション名は次の書式でシステム生成されます。
SYS_SUBP
n
次の問合せでは、サブパーティション名と表領域名が表示されます。
SQL> SELECT TABLESPACE_NAME, PARTITION_NAME, SUBPARTITION_NAME 2 FROM DBA_TAB_SUBPARTITIONS WHERE TABLE_NAME='EMP_SUB_TEMPLATE' 3 ORDER BY TABLESPACE_NAME; TABLESPACE_NAME PARTITION_NAME SUBPARTITION_NAME --------------- --------------- ------------------ TS1 P1 P1_A TS1 P2 P2_A TS1 P3 P3_A TS2 P1 P1_B TS2 P2 P2_B TS2 P3 P3_B TS3 P1 P1_C TS3 P2 P2_C TS3 P3 P3_C TS4 P1 P1_D TS4 P2 P2_D TS4 P3 P3_D 12 rows selected.
次の例では、レンジ - リスト・パーティション表で、サブパーティション・テンプレートが表領域全体のデータのストライプ化にどのように役立つかを示します。この例では、表のサブパーティションが縦にストライプ化されている表が作成されます。つまり、各パーティションのサブパーティションnが同じ表領域に格納されています。
CREATE TABLE stripe_regional_sales ( deptno number, item_no varchar2(20), txn_date date, txn_amount number, state varchar2(2)) PARTITION BY RANGE (txn_date) SUBPARTITION BY LIST (state) SUBPARTITION TEMPLATE (SUBPARTITION northwest VALUES ('OR', 'WA') TABLESPACE tbs_1, SUBPARTITION southwest VALUES ('AZ', 'UT', 'NM') TABLESPACE tbs_2, SUBPARTITION northeast VALUES ('NY', 'VM', 'NJ') TABLESPACE tbs_3, SUBPARTITION southeast VALUES ('FL', 'GA') TABLESPACE tbs_4, SUBPARTITION midwest VALUES ('SD', 'WI') TABLESPACE tbs_5, SUBPARTITION south VALUES ('AL', 'AK') TABLESPACE tbs_6, SUBPARTITION others VALUES (DEFAULT ) TABLESPACE tbs_7 ) (PARTITION q1_1999 VALUES LESS THAN ( TO_DATE('01-APR-1999','DD-MON-YYYY')), PARTITION q2_1999 VALUES LESS THAN ( TO_DATE('01-JUL-1999','DD-MON-YYYY')), PARTITION q3_1999 VALUES LESS THAN ( TO_DATE('01-OCT-1999','DD-MON-YYYY')), PARTITION q4_1999 VALUES LESS THAN ( TO_DATE('1-JAN-2000','DD-MON-YYYY')) );
サブパーティション・テンプレートではなく、パーティション・レベルで表領域を指定した場合(パーティションq1_1999
にtbs_1
、パーティションq2_1999
にtbs_2
、パーティションq3_1999
にtbs_3
およびパーティションq4_1999
にtbs_4
など)、表は水平にストライプ化されます。すべてのサブパーティションは、所有パーティションの表領域に格納されます。
レンジ・パーティション表およびハッシュ・パーティション表では、最大16のパーティション化キー列を指定できます。パーティション化キーが複数の列で構成されていて、後続の列に前の列より細かい粒度が定義されている場合は、複数列のパーティション化を使用する必要があります。最も一般的なシナリオは、年、月、日が別々の列で構成され、分解されているDATE
またはTIMESTAMP
キーです。
複数列のパーティション化キーの評価時に、1番目の値で単一のターゲット・パーティションを一意に特定できない場合にのみ、データベースでは2番目の値が使用されます。また、1番目と2番目の値で適切なパーティションを判断できない場合にのみ、3番目の値が使用されます。値で適切なパーティションを判断できないのは、パーティション・バウンドがその値に完全に一致し、次のパーティションに同じ上限が定義されている場合のみです。そのため、n番目の列が調査されるのは、複数列キーの(n-1)より前のすべての値が、パーティションの(n-1)の上限に正確に一致する場合のみです。たとえば、2番目の列は、1番目の列がパーティション・バウンド値に正確に一致する場合にのみ評価されます。すべての列値がパーティションのすべてのバウンド値に正確に一致する場合、データベースでは、行がこのパーティションには適合しないとみなされ、次のパーティションに適合すると判断されます。
決定性のないバウンド定義(少なくとも1列に対して同一の値が設定された連続するパーティション)の場合、パーティション・バウンド値は、「以下」を表す上限を含む値になります。値の上限が常に「より小さい」であるとみなされる、決定性のあるバウンドとは対照的です。
次の例では、year
、month
およびday
の別々の3列に実際のDATE
情報が格納されている複数列のレンジ・パーティション表の列評価を示します。パーティション化の粒度は四半期です。評価されるパーティション表は、次のように作成されます。
CREATE TABLE sales_demo ( year NUMBER, month NUMBER, day NUMBER, amount_sold NUMBER) PARTITION BY RANGE (year,month) (PARTITION before2001 VALUES LESS THAN (2001,1), PARTITION q1_2001 VALUES LESS THAN (2001,4), PARTITION q2_2001 VALUES LESS THAN (2001,7), PARTITION q3_2001 VALUES LESS THAN (2001,10), PARTITION q4_2001 VALUES LESS THAN (2002,1), PARTITION future VALUES LESS THAN (MAXVALUE,0)); REM 12-DEC-2000 INSERT INTO sales_demo VALUES(2000,12,12, 1000); REM 17-MAR-2001 INSERT INTO sales_demo VALUES(2001,3,17, 2000); REM 1-NOV-2001 INSERT INTO sales_demo VALUES(2001,11,1, 5000); REM 1-JAN-2002 INSERT INTO sales_demo VALUES(2002,1,1, 4000);
12-DEC-2000の年の値は、1番目のパーティションbefore2001
に一致しているため、これ以上評価する必要はありません。
SELECT * FROM sales_demo PARTITION(before2001); YEAR MONTH DAY AMOUNT_SOLD ---------- ---------- ---------- ----------- 2000 12 12 1000
17-MAR-2001の情報はパーティションq1_2001
に格納されます。1番目のパーティション化キー列year
だけでは適切なパーティションを判断できないため、2番目のパーティション化キー列month
を評価する必要があります。
SELECT * FROM sales_demo PARTITION(q1_2001); YEAR MONTH DAY AMOUNT_SOLD ---------- ---------- ---------- ----------- 2001 3 17 2000
前のレコードと同じ決定ルールに従い、2番目の列month
により、1-NOV-2001の適切なパーティションはパーティションq4_2001
であると判断されます。
SELECT * FROM sales_demo PARTITION(q4_2001); YEAR MONTH DAY AMOUNT_SOLD ---------- ---------- ---------- ----------- 2001 11 1 5000
01-JAN-2002のパーティションはyear
列のみの評価で、future
パーティションが適切であると判断されます。
SELECT * FROM sales_demo PARTITION(future); YEAR MONTH DAY AMOUNT_SOLD ---------- ---------- ---------- ----------- 2002 1 1 4000
パーティション化キー列のいずれかにMAXVALUE
が含まれている場合、後続の列のその他すべての値は無視されます。つまり、前述の例のパーティションfuture
の定義における(MAXVALUE
,0)という上限は、上限(MAXVALUE
,100)または上限(MAXVALUE
,MAXVALUE
)と同一です。
次の例では、どのサプライヤがどの部品を配送するかに関する情報が格納されている表supplier_parts
に対して、複数列のパーティション化を使用する方法を示します。少数の専門の部品のみを提供するサプライヤが存在する一方で、非常に多くの部品を提供するサプライヤも存在するため、同じサイズのパーティションにデータを分散するには、表をsupplier_id
に基づいてパーティション化するのでは十分ではありません。かわりに、(supplier_id
, partnum
)で表をパーティション化し、同じサイズのパーティションを手動で強制します。
CREATE TABLE supplier_parts ( supplier_id NUMBER, partnum NUMBER, price NUMBER) PARTITION BY RANGE (supplier_id, partnum) (PARTITION p1 VALUES LESS THAN (10,100), PARTITION p2 VALUES LESS THAN (10,200), PARTITION p3 VALUES LESS THAN (MAXVALUE,MAXVALUE));
次の3つのレコードを表に挿入します。
INSERT INTO supplier_parts VALUES (5,5, 1000); INSERT INTO supplier_parts VALUES (5,150, 1000); INSERT INTO supplier_parts VALUES (10,100, 1000);
supplier_id
で一意に識別されるため、最初の2つのレコードはパーティションp1
に挿入されます。ただし、3番目のレコードは、パーティションp1
のすべてのレンジの上限値に正確に一致するため、データベースでは次のパーティションに一致しているとみなされ、パーティションp2
に挿入されます。partnum
の値が200より小さいという基準に一致しているため、パーティションp2
に挿入されます。
SELECT * FROM supplier_parts PARTITION (p1); SUPPLIER_ID PARTNUM PRICE ----------- ---------- ---------- 5 5 1000 5 150 1000 SELECT * FROM supplier_parts PARTITION (p2); SUPPLIER_ID PARTNUM PRICE ----------- ---------- ---------- 10 100 1000
supplier_id
が10より小さいすべての行は、partnum
値に関係なくパーティションp1
に格納されます。列partnum
はsupplier_id
が10の場合にのみ評価され、partnum
が200以上の場合、対応する行はパーティションp1
、p2
またはp3
に挿入されます。supplier_parts
のレンジのパーティション・サイズを同一にするには、supplier_id
でレンジ・パーティション化され、partnum
でハッシュ・サブパーティション化されたコンポジット・レンジ - ハッシュ・パーティション表を選択します。
複数列のパーティション表にパーティション・バウンドを定義する場合、いくつかのルールに従う必要があります。たとえば、3つの列a
、b
およびc
でレンジ・パーティション化された表があるとします。個々のパーティションには、次のようなレンジ値があります。
P0(a0, b0, c0) P1(a1, b1, c1) P2(a2, b2, c2) ... Pn(an, bn, cn)
各パーティションに指定するレンジ値は、次のルールに準拠している必要があります。
a0
はa1
以下で、a1
はa2
以下である必要があります(以降同様)。
a0
=a1
の場合、b0
はb1
以下である必要があります。a0
< a1
の場合、b0
およびb1
は任意の値でかまいません。a0
=a1
かつb0
=b1
の場合、c0
はc1
以下である必要があります。b0
<b1
の場合、c0
およびc1
は任意の値でかまいません(以降同様)。
a1
=a2
の場合、b1
はb2
以下である必要があります。a1
<a2
の場合、b1
およびb2
は任意の値でかまいません。a1
=a2
かつb1
=b2
の場合、c1
はc2
以下である必要があります。b1
<b2
の場合、c1
およびc2
は任意の値でかまいません(以降同様)。
パーティション化のコンテキストでは、仮想列を任意の正規列として使用できます。仮想列を使用する場合、時間隔パーティション化およびコンポジット・パーティション化のすべての組合せを含み、パーティション・メソッドがすべてサポートされます。パーティション化列として使用する仮想列では、PL/SQLファンクションへのコールは使用できません。
関連項目: 仮想列を作成する構文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
次の例では、サブパーティション化キーに仮想列を使用して、レンジ - レンジでパーティション化されたsales
表を示します。仮想列では、amount_sold
とquantity_sold
を掛けて販売の合計値が計算されます。
CREATE TABLE sales ( prod_id NUMBER(6) NOT NULL , cust_id NUMBER NOT NULL , time_id DATE NOT NULL , channel_id CHAR(1) NOT NULL , promo_id NUMBER(6) NOT NULL , quantity_sold NUMBER(3) NOT NULL , amount_sold NUMBER(10,2) NOT NULL , total_amount AS (quantity_sold * amount_sold) ) PARTITION BY RANGE (time_id) INTERVAL (NUMTOYMINTERVAL(1,'MONTH')) SUBPARTITION BY RANGE(total_amount) SUBPARTITION TEMPLATE ( SUBPARTITION p_small VALUES LESS THAN (1000) , SUBPARTITION p_medium VALUES LESS THAN (5000) , SUBPARTITION p_large VALUES LESS THAN (10000) , SUBPARTITION p_extreme VALUES LESS THAN (MAXVALUE) ) (PARTITION sales_before_2007 VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-MON-yyyy')) ) ENABLE ROW MOVEMENT PARALLEL NOLOGGING;
この例で示されているように、仮想列では行移動もサポートされています。行移動が有効化されている場合、仮想列が別のパーティションに属する値に評価されると、行はあるパーティションから別のパーティションに移行されます。
ヒープ構成パーティション表では、表圧縮を使用してパーティションの一部またはすべてを圧縮できます。表領域、表、または表のパーティションに対して圧縮属性を宣言できます。圧縮属性が指定されていない場合は、その他の記憶域属性と同じように継承されます。
次の例では、圧縮されたパーティションcosts_old
を含むリスト・パーティション表を作成します。表およびその他すべてのパーティションの圧縮属性は、表領域レベルから継承されます。
CREATE TABLE costs_demo ( prod_id NUMBER(6), time_id DATE, unit_cost NUMBER(10,2), unit_price NUMBER(10,2)) PARTITION BY RANGE (time_id) (PARTITION costs_old VALUES LESS THAN (TO_DATE('01-JAN-2003', 'DD-MON-YYYY')) COMPRESS, PARTITION costs_q1_2003 VALUES LESS THAN (TO_DATE('01-APR-2003', 'DD-MON-YYYY')), PARTITION costs_q2_2003 VALUES LESS THAN (TO_DATE('01-JUN-2003', 'DD-MON-YYYY')), PARTITION costs_recent VALUES LESS THAN (MAXVALUE));
キー圧縮を使用して、Bツリー索引のパーティションの一部またはすべてを圧縮できます。キー圧縮は、Bツリー索引にのみ適用できます。ビットマップ索引は、デフォルトで圧縮されて格納されます。キー圧縮を使用する索引では、キー列の接頭辞の値が繰り返し出現しないため、領域を節約しI/Oを削減できます。
次の例では、最新のパーティション以外すべてのパーティションが圧縮されたローカル・パーティション索引を作成します。
CREATE INDEX i_cost1 ON costs_demo (prod_id) COMPRESS LOCAL (PARTITION costs_old, PARTITION costs_q1_2003, PARTITION costs_q2_2003, PARTITION costs_recent NOCOMPRESS);
索引サブパーティションには、明示的にCOMPRESS
(またはNOCOMPRESS
)を指定できません。指定されたパーティションのすべての索引サブパーティションでは、親パーティションからキー圧縮設定を継承します。
指定されたパーティションのすべてのサブパーティションのキー圧縮属性を変更するには、まずALTER INDEX...MODIFY PARTITION
文を発行し、すべてのサブパーティションを再作成する必要があります。MODIFY PARTITION
句により、すべての索引サブパーティションがUNUSABLE
とマークされます。
索引構成表では、レンジ、リストまたはハッシュ・パーティション化メッソドを使用できます。パーティション索引構成表を作成する際のセマンティックは、通常の表のセマンティックに似ていますが、次のような違いがあります。
表の作成時に、ORGANIZATION INDEX
句、および必要に応じてINCLUDING
とOVERFLOW
句を指定します。
PARTITION
またはPARTITIONS
句にOVERFLOW
副次句を指定できます。この副次句を使用すると、オーバーフロー・セグメントの属性をパーティション・レベルで指定できます。
OVERFLOW
句を指定すると、オーバーフロー・データ・セグメント自体が主キー索引セグメントと同一レベル・パーティション化されます。このため、オーバーフローを含むパーティション索引構成表では、各パーティションに索引セグメントおよびオーバーフロー・データ・セグメントがあります。
索引構成表では、一連のパーティション化列は主キー列のサブセットである必要があります。索引構成表の行は表の主キー索引に格納されるため、パーティション化の基準は可用性に影響します。主キーのサブセットになるパーティション化キーを選択することにより、挿入操作では単一パーティションの主キーの一意性のみを検証すればよくなるため、パーティションの独立性が保たれます。
索引構成表の2次索引のサポートは、通常の表のサポートに似ています。2次索引の論理的な特性のため、通常の表ではUNUSABLEとマークされるような特定の操作に、索引構成表のグローバル索引を使用できます。
関連項目:
|
レンジ・メッソドを使用して、索引構成表およびその2次索引をパーティション化できます。次の例では、レンジ・パーティションの索引構成表sales
を作成します。INCLUDING
句では、week_no
の後のすべての列をオーバーフロー・セグメントに格納することを指定します。各パーティションにはオーバーフロー・セグメントが1つあり、すべて同じ表領域(overflow_here
)に格納されます。オプションで、個々のパーティション・レベルにOVERFLOW TABLESPACE
を指定できます。その場合、オーバーフロー・セグメントの一部またはすべてに、別々のTABLESPACE
属性を設定できます。
CREATE TABLE sales(acct_no NUMBER(5), acct_name CHAR(30), amount_of_sale NUMBER(6), week_no INTEGER, sale_details VARCHAR2(1000), PRIMARY KEY (acct_no, acct_name, week_no)) ORGANIZATION INDEX INCLUDING week_no OVERFLOW TABLESPACE overflow_here PARTITION BY RANGE (week_no) (PARTITION VALUES LESS THAN (5) TABLESPACE ts1, PARTITION VALUES LESS THAN (9) TABLESPACE ts2 OVERFLOW TABLESPACE overflow_ts2, ... PARTITION VALUES LESS THAN (MAXVALUE) TABLESPACE ts13);
索引構成表のパーティション化のその他のオプションは、ハッシュ・メッソドの使用です。次の例では、ハッシュ・メッソドでsales
索引構成表をパーティション化しています。
CREATE TABLE sales(acct_no NUMBER(5), acct_name CHAR(30), amount_of_sale NUMBER(6), week_no INTEGER, sale_details VARCHAR2(1000), PRIMARY KEY (acct_no, acct_name, week_no)) ORGANIZATION INDEX INCLUDING week_no OVERFLOW PARTITION BY HASH (week_no) PARTITIONS 16 STORE IN (ts1, ts2, ts3, ts4) OVERFLOW STORE IN (ts3, ts6, ts9);
注意: ハッシュ関数は、パーティション間にバランスよく行を分散するよう綿密に設計されています。そのため、行の主キー列を更新すると、その行は高確率で別のパーティションに移動されます。変更可能なパーティション化キーを使用してハッシュ・パーティションの索引構成表を作成する場合には、明示的にENABLE ROW MOVEMENT 句を指定することをお薦めします。デフォルトでは、ENABLE ROW MOVEMENT は無効化されています。 |
索引構成表のパーティション化の別のオプションは、リスト・メッソドの使用です。次の例では、リスト・メッソドでsales
索引構成表をパーティション化しています。この例では、シード・データベースのサンプル・スキーマの一部であるexample
表領域が使用されています。通常、異なるパーティションには、別の表領域記憶域を指定します。
CREATE TABLE sales(acct_no NUMBER(5), acct_name CHAR(30), amount_of_sale NUMBER(6), week_no INTEGER, sale_details VARCHAR2(1000), PRIMARY KEY (acct_no, acct_name, week_no)) ORGANIZATION INDEX INCLUDING week_no OVERFLOW TABLESPACE example PARTITION BY LIST (week_no) (PARTITION VALUES (1, 2, 3, 4) TABLESPACE example, PARTITION VALUES (5, 6, 7, 8) TABLESPACE example OVERFLOW TABLESPACE example, PARTITION VALUES (DEFAULT) TABLESPACE example);
ブロック・サイズの異なる表領域を含むデータベースに、パーティション・オブジェクトを作成する際には注意してください。そのような表領域のパーティション・オブジェクトの記憶域は、一部の制限の対象です。特に、次に示すエンティティのすべてのパーティションは、同じブロック・サイズの表領域に存在する必要があります。
従来型の表
索引
索引構成表の主キーの索引セグメント
索引構成表のオーバーフロー・セグメント
表外に格納されているLOB
列
そのため、次のようにする必要があります。
従来型の各表では、その表のすべてのパーティションをブロック・サイズが同一の表領域に格納する必要があります。
各索引構成表では、すべての主キーの索引パーティション、およびその表のすべてのオーバーフロー・パーティションが、ブロック・サイズが同一の表領域に存在する必要があります。ただし、索引パーティションおよびオーバーフロー・パーティションは、ブロック・サイズが異なる表領域に存在してもかまいません。
各索引(グローバルまたはローカル)では、その索引の各パーティションはブロック・サイズが同一の表領域に存在する必要があります。ただし、同じオブジェクトに定義されている異なる索引のパーティションは、ブロック・サイズが異なる表領域に存在してもかまいません。
各LOB
列では、その列の各パーティションをブロック・サイズが同一の表領域に格納する必要があります。ただし、異なるLOB
列は、ブロック・サイズが異なる表領域に格納してもかまいません。
パーティション表や索引を作成または変更する場合、各エンティティのパーティションおよびサブパーティションに明示的に指定するすべての表領域は、同じブロック・サイズである必要があります。表領域記憶域をエンティティに明示的に指定しない場合、データベースがデフォルトで使用する表領域は、同じブロック・サイズである必要があります。そのため、パーティション・オブジェクトの各レベルのデフォルト表領域を把握している必要があります。
この項では、表と索引の両方で、パーティションおよびサブパーティションのメンテナンス操作を実行する方法を説明します。
表3-1に、パーティション表およびコンポジット・パーティション表で実行可能なパーティション・メンテナンス操作を示します。また、表3-2に、コンポジット・パーティション表で実行可能なサブパーティション・メンテナンス操作を示します。パーティション化およびサブパーティション化のタイプごとに、そのメンテナンス操作の実行に使用するALTER TABLE
文の特定の句を示します。
表3-1 表パーティションに対するALTER TABLEメンテナンス操作
メンテナンス操作 | レンジ・コンポジット・レンジ - * | 時間隔コンポジット時間隔 - * | ハッシュ | リスト・コンポジット・リスト - * | 参照 |
---|---|---|---|---|---|
|
|
|
|
|
N/A脚注1 |
|
N/A |
N/A |
|
N/A |
N/A脚注1 |
|
|
|
N/A |
|
N/A脚注1 |
|
|
|
|
|
|
|
|
|
N/A |
|
N/A脚注1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
N/A |
N/A |
N/A |
|
N/A |
|
N/A |
N/A |
N/A |
|
N/A |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
N/A |
|
N/A脚注1 |
|
|
|
|
|
|
脚注1 これらの操作は、参照パーティション表では実行できません。これらの操作は、親表で実行するとすべての子表にカスケードされます。
表3-2 表サブパーティションに対するALTER TABLEメンテナンス操作
メンテナンス操作 | コンポジット* - レンジ | コンポジット* - ハッシュ | コンポジット* - リスト |
---|---|---|---|
|
|
|
|
|
N/A |
|
N/A |
|
|
N/A |
|
|
|
N/A |
|
|
|
N/A |
|
|
|
|
|
|
|
|
|
|
N/A |
N/A |
|
|
N/A |
N/A |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
N/A |
|
|
|
|
|
注意: ビットマップ索引のあるパーティション表や、現在圧縮されていないパーティションのみを含むパーティション表に、圧縮されたパーティションを組み込むために最初に表圧縮を使用する場合は、次の手順を実行する必要があります。
これらの処理は、パーティションにデータが含まれているかどうかには関係なく、圧縮されたパーティションを組み込む操作です。 これは、Bツリー索引を含むパーティション表、またはパーティション索引構成表には適用されません。 |
表3-3に索引パーティションで実行可能なメンテナンス操作を示し、どのタイプの索引(グローバルまたはローカル)で実行可能かを記載します。メンテナンス操作に使用するALTER INDEX
句を表示します。
グローバル索引は、基礎となる表の構造を反映しません。パーティション化されている場合は、レンジまたはハッシュでパーティション化できます。パーティション・グローバル索引では、パーティション表で実行可能なパーティション・メンテナンス操作のすべてではなく、一部が共有されます。
ローカル索引では基礎となる表の構造が反映されるため、表パーティションおよびサブパーティションがメンテナンス・アクティビティの影響を受けると、パーティション化も自動的にメンテナンスされます。そのため、ローカル索引でのパーティション・メンテナンスの必要性は低く、オプションの数も少なくなっています。
表3-3 索引パーティションに対するALTER INDEXメンテナンス操作
メンテナンス操作 | 索引のタイプ | 索引パーティション化のタイプ | ||
---|---|---|---|---|
レンジ | ハッシュおよびリスト | コンポジット | ||
|
グローバル |
|
|
- |
ローカル |
N/A |
N/A |
N/A |
|
|
グローバル |
|
- |
- |
ローカル |
N/A |
N/A |
N/A |
|
|
グローバル |
|
- |
- |
ローカル |
|
|
|
|
|
グローバル |
|
- |
- |
ローカル |
|
|
|
|
|
グローバル |
|
- |
- |
ローカル |
|
|
|
|
|
グローバル |
|
- |
- |
ローカル |
|
|
|
|
|
グローバル |
|
- |
- |
ローカル |
N/A |
N/A |
N/A |
注意: 次の項では、パーティション表に対するメンテナンス操作を説明します。メンテナンス操作に影響される索引または索引パーティションの使用性が説明されている箇所では、次のことを考慮してください。
|
パーティション表および索引に対する個々のメンテナンス操作を説明する前に、ALTER
TABLE
文に指定可能なUPDATE
INDEXES
句の影響を説明します。
デフォルトでは、パーティション表に対する表メンテナンス操作の多くにより、対応する索引または索引パーティションが無効化(UNUSABLE
とマーク)されます。索引全体または各パーティション(グローバル索引の場合)を再作成する必要があります。メンテナンス操作で、ALTER
TABLE
文にUPDATE
INDEXES
を指定すると、データベースによりこのデフォルトの動作が上書きされます。この句を指定すると、メンテナンス操作のDDL文の実行時に、データベースにより索引が更新されます。これには、次の利点があります。
索引が、ベース表操作とともに更新されます。後から個別に索引を再作成する必要はありません。
UNUSABLE
とマークされないため、索引の可用性が向上します。パーティションDDLの実行中でも索引は使用可能なままで、表内の影響を受けないパーティションへのアクセスに使用できます。
すべての無効な索引を再作成するために、名前を調べる必要はありまん。
ローカル索引のオプションの句で、更新されたローカル索引やそのパーティションに物理特性および記憶域特性を指定できます。
各ローカル索引のそれぞれのパーティションに物理属性、表領域記憶域およびロギングを指定できます。または、PARTITION
キーワードのみを指定して、次のようにデータベースによるパーティション属性の更新を行うことも可能です。
単一の表パーティションに対する操作(MOVE
PARTITION
やSPLIT
PARTITION
など)では、対応する索引パーティションは影響を受ける索引パーティションの属性を継承します。データベースでは新しい索引パーティションの名前は生成されないため、この操作により作成される新しい索引パーティションは、対応する新しい表パーティションから名前を継承します。
MERGE
PARTITION
操作では、結果のローカル索引パーティションは、結果の表パーティションから名前を継承し、ローカル索引から属性を継承します。
コンポジット・パーティション索引では、各サブパーティションに表領域記憶域を指定できます。
関連項目: 索引を更新するための構文は、ALTER TABLE のupdate_all_indexes_clause を参照してください。 |
次の操作では、UPDATE
INDEXES
句がサポートされています。
ADD
PARTITION
| SUBPARTITION
COALESCE
PARTITION
| SUBPARTITION
DROP
PARTITION
| SUBPARTITION
EXCHANGE
PARTITION
| SUBPARTITION
MERGE
PARTITION
| SUBPARTITION
MOVE
PARTITION
| SUBPARTITION
SPLIT
PARTITION
| SUBPARTITION
TRUNCATE
PARTITION
| SUBPARTITION
SKIP_UNUSABLE_INDEXES初期化パラメータ
SKIP_UNUSABLE_INDEXES
は、デフォルト値がTRUE
の初期化パラメータです。この設定により、UNUSABLE
とマークされた索引および索引パーティションのエラー・レポートが無効化されます。使用できない要素を避けるために、データベースが別の実行計画を選択しないようにするには、このパラメータをFALSE
に設定する必要があります。
索引を自動更新する際の考慮事項
UPDATE
INDEXES
を指定する際は、次の影響に注意してください。
事前にUNUSABLE
とマークされていた索引が更新されるため、パーティションDDL文の実行時間が長くなります。ただし、この増加した時間を、索引を更新せずにDDLを実行し、すべての索引を再作成する場合にかかる時間と比較する必要があります。パーティションのサイズが表サイズの5%に満たない場合は、経験則から言って、索引を更新する方が短時間ですみます。
DROP
、TRUNCATE
およびEXCHANGE
操作は高速な操作ではなくなりました。こちらも、DDLを実行してすべての索引を再作成する場合にかかる時間と比較する必要があります。
グローバル索引を含む表を更新する際の考慮事項は、次のとおりです。
索引はその場で更新されます。索引の更新は記録され、REDOおよびUNDOレコードが生成されます。反対に、グローバル索引全体を再作成する場合は、NOLOGGING
モードで実行できます。
索引全体を手動で再作成すると、領域がより有効に使用されて圧縮されるため、より効率的な索引が作成されます。
UPDATE INDEXES
句は、索引構成表ではサポートされていません。ただし、DROP
PARTITION
、TRUNCATE
PARTITION
およびEXCHANGE
PARTITION
操作でUPDATE GLOBAL INDEXES
句を使用して、索引構成表のグローバル索引を使用可能なままにできます。前述のリストのその他の操作では、索引構成表のグローバル索引は使用可能なままになります。また、索引構成表のローカル索引パーティションは、MOVE
PARTITION
操作後も使用可能なままです。
この項では、パーティション表に新しいパーティションを手動で追加する方法、および多くのパーティション索引に明示的にパーティションを追加できない理由を説明します。
ハイエンド(既存の最後のパーティションの後ろのポイント)に新しいパーティションを追加するには、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;
レンジ・パーティション表に関連付けられているローカルおよびグローバル索引は、使用可能なままです。
ハッシュ・パーティション表にパーティションを追加すると、データベースにより、新しいパーティションに既存のパーティション(データベースが選択)から再度ハッシュされた行が、ハッシュ関数で決定されたとおりに移入されます。その結果、表にデータが含まれる場合、ハッシュ・パーティションの追加に時間がかかる場合があります。
次の文では、表scubagear
にハッシュ・パーティションを追加する2つの方法を示します。最初の文では、パーティション名がシステム生成される新しいハッシュ・パーティションが追加され、デフォルトの表領域に配置されます。2番目の文でも、新しいハッシュ・パーティションが追加されますが、そのパーティションには明示的にp_named
という名前が付けられ、表領域gear5
に作成されます。
ALTER TABLE scubagear ADD PARTITION; ALTER TABLE scubagear ADD PARTITION p_named TABLESPACE gear5;
次の表で説明するように、索引はUNUSABLE
とマークされます。
表のタイプ | 索引の動作 |
---|---|
通常(ヒープ) | ALTER TABLE 文の一部にUPDATE INDEXES を指定しない場合:
|
索引構成 |
|
次の文で、リスト・パーティション表に新しいパーティションを追加する方法を示します。この例では、追加されるパーティションに物理属性およびNOLOGGING
が指定されています。
ALTER TABLE q1_sales_by_region ADD PARTITION q1_nonmainland VALUES ('HI', 'PR') STORAGE (INITIAL 20K NEXT 20K) TABLESPACE tbs_3 NOLOGGING;
追加するパーティションを説明する一連のリテラル値は、表のどのパーティションにも存在していない必要があります。
デフォルトのパーティションがあるリスト・パーティション表にはパーティションを追加できませんが、デフォルトのパーティションを分割することはできます。分割することで、指定した値で定義された新しいパーティションと、デフォルトのパーティションとして残る2つ目のパーティションを効率的に作成できます。
リスト・パーティション表に関連付けられているローカルおよびグローバル索引は、使用可能なままです。
まずパーティションをロックしないと、時間隔パーティション表にはパーティションを明示的に追加できません。ロックすることで、パーティションの作成がトリガーされます。特定の時間隔のデータが挿入されると、その時間隔のパーティションがデータベースにより自動的に作成されます。一般的に、実行する必要があるのは、パーティション交換ロードのシナリオ用に時間隔パーティションを明示的に作成することのみです。
後続のパーティションの時間隔を変更するには、ALTER TABLE
文のSET INTERVAL
句を使用します。この句により、すべてのマテリアライズ化された時間隔パーティションの現在の上限値を超えるパーティションの時間隔が変更されます。
既存のレンジ・パーティションまたはレンジ - *コンポジット・パーティション表を、時間隔または時間隔 - *パーティション表に移行するには、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 ();
パーティションは、パーティション・レベルとハッシュ・サブパーティション・レベルの両方で追加できます。
[レンジ|リスト|時間隔] - ハッシュ・パーティション表への新しいパーティションの追加は、すでに説明されている内容と同様です。時間隔 - ハッシュ・パーティション表の場合、時間隔パーティションは自動的に作成されます。指定した数のサブパーティションを追加できるSUBPARTITIONS
句を指定することも、特定のサブパーティションに名前を付けるSUBPARTITION
句を指定することも可能です。SUBPARTITIONS
またはSUBPARTITION
句が指定されていない場合、パーティションはサブパーティションの表レベルのデフォルトを継承します。時間隔 - ハッシュ・パーティション表の場合、マテリアライズ化されたレンジまたは時間隔パーティションに追加できるのはサブパーティションのみです。
この例では、レンジ - ハッシュ・パーティション表sales
に、2000年の第1四半期のデータが移入されるレンジ・パーティションq1_2000
を追加しています。表領域tbs5
に格納される8つのサブパーティションがあります。サブパーティションを、表圧縮を使用するように明示的に設定することはできません。サブパーティションはパーティション・レベルから圧縮属性を継承し、この例では圧縮された形式で格納されます。
ALTER TABLE sales ADD PARTITION q1_2000 VALUES LESS THAN (2000, 04, 01) COMPRESS SUBPARTITIONS 8 STORE IN tbs5;
ハッシュ・サブパーティションを[レンジ|リスト|時間隔] - ハッシュ・パーティション表に追加するには、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
を指定しない場合は、追加および再度ハッシュされたサブパーティションに対応する索引サブパーティションを再作成する必要があります。
パーティションは、パーティション・レベルとリスト・サブパーティション・レベルの両方で追加できます。
[レンジ|リスト|時間隔] - リスト・パーティション表への新しいパーティションの追加は、すでに説明されている内容と同様です。特定の時間隔のデータが挿入されると、データベースにより時間隔パーティションが自動的に作成されます。サブパーティションに名前を付け、値リストを提供するには、SUBPARTITION
句を指定できます。SUBPARTITION
句が指定されていない場合、パーティションはサブパーティション・テンプレートを継承します。サブパーティション・テンプレートがない場合には、単一のデフォルトのサブパーティションが作成されます。
次の文では、レンジ - リスト・メッソドでパーティション化されたquarterly_regional_sales
表に、新しいパーティションを追加しています。指定されていないパーティションでは表レベルのデフォルトが継承されますが、この新しいパーティションにはいくつかの新しい物理属性が指定されています。
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') );
リスト・サブパーティションを[レンジ|リスト|時間隔] - リスト・パーティション表に追加するには、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;
パーティションは、パーティション・レベルとレンジ・サブパーティション・レベルの両方で追加できます。
[レンジ|リスト|時間隔] - レンジ・パーティション表への新しいパーティションの追加は、すでに説明されている内容と同様です。特定の時間隔のデータが挿入されると、データベースにより時間隔 - レンジ・パーティション表に時間隔パーティションが自動的に作成されます。特定のサブパーティションに名前を付け、レンジを指定するには、SUBPARTITION
句を指定します。SUBPARTITION
句が指定されていない場合、パーティションは、表レベルに指定されたサブパーティション・テンプレートを継承します。サブパーティション・テンプレートがない場合には、最大値がMAXVALUE
の単一のサブパーティションが作成されます。
この例では、レンジ - レンジ・パーティション表shipments
に、2007年1月に注文された出荷品に関するデータが移入されるレンジ・パーティションp_2007_jan
を追加します。サブパーティションは3つあります。サブパーティションはパーティション・レベルから圧縮属性を継承し、この例では圧縮された形式で格納されます。
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')) ) ;
レンジ・サブパーティションを[レンジ|リスト|時間隔] - レンジ・パーティション表に追加するには、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) ;
レンジ、ハッシュ、リストまたはコンポジット・パーティション表にパーティションやサブパーティションを追加できるのと同じように、参照パーティション定義の親表にもパーティションまたはサブパーティションを追加できます。追加操作は、子参照パーティション表に自動的にカスケードされます。マスター表へのパーティションまたはサブパーティションの追加時に、DEPENDENT TABLES
句を使用して、依存表に特定のプロパティを設定できます。
関連項目: 『Oracle Database SQL言語リファレンス』 |
ローカル索引には、明示的にパーティションを追加できません。かわりに、基礎となる表にパーティションを追加する場合にのみ、ローカル索引に新しいパーティションが追加されます。特に、表にローカル索引が定義されていて、パーティションを追加する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
文を使用します。
パーティションの結合は、ハッシュ・パーティション表または索引のパーティション数や、* - ハッシュ・パーティション表のサブパーティション数を減らす方法の1つです。ハッシュ・パーティションを結合すると、そのコンテンツはハッシュ関数で決定された1つ以上の残りのパーティションに再配布されます。結合される特定のパーティションはデータベースにより選択され、コンテンツの再配布後に削除されます。参照パーティション表定義の親表のハッシュ・パーティションまたはサブパーティションを結合すると、参照パーティション表は新しいパーティション化定義を自動的に継承します。
次の表で説明するように、索引パーティションはUNUSABLE
とマークされます。
表のタイプ | 索引の動作 |
---|---|
通常(ヒープ) | ALTER TABLE 文の一部にUPDATE INDEXES を指定しない場合:
|
索引構成 |
|
ハッシュ・パーティション表でパーティションを結合する場合には、ALTER
TABLE
... COALESCE
PARTITION
文が使用されます。次の文では、パーティションを結合することにより、表のパーティション数が1つ削減されています。
ALTER TABLE ouu1 COALESCE PARTITION;
次の文により、パーティションus_locations
のサブパーティションのコンテンツが、同じパーティションの1つ以上の残りのサブパーティション(ハッシュ関数で決定)に分散されます。時間隔パーティション表の場合、結合できるのは、マテリアライズ化されたレンジまたは時間隔パーティションのハッシュ・サブパーティションのみです。基本的に、この操作は、「[レンジ|リスト|時間隔] - ハッシュ・パーティション表へのサブパーティションの追加」で説明したMODIFY
PARTITION
... ADD
SUBPARTITION
句の逆の操作です。
ALTER TABLE diving MODIFY PARTITION us_locations COALESCE SUBPARTITION;
ALTER
INDEX
のCOALESCE
PARTITION
句を使用して、ハッシュ・パーティション・グローバル索引の索引パーティション数を1つ減らすようにデータベースに指示できます。データベースにより、ハッシュ・パーティションの要件に基づいて、結合するパーティションが選択されます。次の文では、「ハッシュ・パーティション・グローバル索引の作成」で作成されたhgidx
索引のパーティション数が1つ削減されます。
ALTER INDEX hgidx COALESCE PARTITION;
レンジ、時間隔、リストまたはコンポジット* - [レンジ|リスト]パーティション表からパーティションを削除できます。時間隔パーティション表の場合は、マテリアライズ化されたレンジまたは時間隔パーティションのみ削除できます。ハッシュ・パーティション表またはコンポジット* - ハッシュ・パーティション表のハッシュ・サブパーティションの場合は、かわりに、結合操作を実行する必要があります。
参照パーティション表からパーティションを削除することはできません。かわりに、親表での削除操作がすべての子表にカスケードされます。
表パーティションまたはサブパーティションを削除するには、次のいずれかの文を使用します。
ALTER
TABLE
... DROP
SUBPARTITION
: コンポジット* - [レンジ|リスト]パーティション表のサブパーティションを削除する場合
パーティション内のデータを保持する場合は、DROP
PARTITION
文ではなくMERGE
PARTITION
文を使用します。
表にローカル索引が定義されている場合、この文では、ローカル索引からも一致するパーティションまたはサブパーティションが削除されます。次のいずれかが当てはまる場合、すべてのグローバル索引またはパーティション・グローバル索引のすべてのパーティションがUNUSABLE
とマークされます。
UPDATE
INDEXES
を指定する(索引構成表には指定できません。かわりにUPDATE
GLOBAL
INDEXES
を使用してください)。
削除するパーティションまたはそのサブパーティションが空である。
注意:
|
次の項では、表パーティションの削除に関するいくつかのシナリオを示します。
パーティションにデータが含まれている場合や、表に1つ以上のグローバル索引が定義されている場合には、次のいずれかの方法を使用して表パーティションを削除します。
方法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
、feb99_ix
、mar99_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;
これは、削除されるパーティションに表の合計データの大部分が含まれる大規模な表に最適な方法です。
方法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;
パーティションにデータが含まれ、表に参照整合性制約がある場合には、次のいずれかの方法を選択して表パーティションを削除します。この表にあるのはローカル索引のみであるため、索引を再作成する必要はありません。
方法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;
これは、小規模な表、または削除されるパーティションに含まれる表の合計データの割合が少ない場合に、大規模な表に最適な方法です。
時間隔パーティション表の時間隔パーティションを削除できます。この操作により、その時間隔のデータのみが削除され、時間隔定義はそのまま残ります。削除されたばかりの時間隔にデータが挿入された場合は、データベースにより時間隔パーティションが再度作成されます。
時間隔パーティション表のレンジ・パーティションも削除できます。時間隔パーティション表のレンジ・パーティションを削除するルールは、レンジ・パーティション表のレンジ・パーティションの削除ルールと同じです。一連のレンジ・パーティションの中間にあるレンジ・パーティションを削除すると、次のレンジ・パーティションの下限が、削除したレンジ・パーティションの下限に切り替わります。時間隔パーティション表のレンジ・パーティション・セクションにある最高位のレンジ・パーティションは削除できません。
次の例では、sales
表から2007年9月の時間隔パーティション表を削除します。ローカル索引しかないため、索引は無効化されません。
ALTER TABLE sales DROP PARTITION FOR(TO_DATE('01-SEP-2007','dd-MON-yyyy'));
ローカル索引のパーティションは明示的に削除できません。かわりに、基礎となる表からパーティションを削除した場合にのみ、ローカル索引パーティションが削除されます。
グローバル索引パーティションが空の場合は、ALTER
INDEX
... DROP
PARTITION
文を発行することでそのパーティションを明示的に削除できます。ただし、グローバル索引パーティションにデータが含まれる場合は、パーティションを削除すると次の最高位パーティションがUNUSABLE
とマークされる原因になります。たとえば、索引パーティションP1を削除する必要があり、P2が次の最高位パーティションであるとします。次の文を発行する必要があります。
ALTER INDEX npr DROP PARTITION P1; ALTER INDEX npr REBUILD PARTITION P2;
注意: グローバル索引では、最高位パーティションを削除できません。 |
データ・セグメントを交換することで、パーティション(またはサブパーティション)を非パーティション表に、非パーティション表をパーティション表のパーティション(またはサブパーティション)に変換できます。ハッシュ・パーティション表をコンポジット* - ハッシュ・パーティション表のパーティションに変換することも、コンポジット* - ハッシュ・パーティション表のパーティションをハッシュ・パーティション表に変換することも可能です。同様に、[レンジ|リスト]パーティション表をコンポジット* - [レンジ|リスト]パーティション表のパーティションに変換することも、コンポジット* - [レンジ|リスト]パーティション表のパーティションを[レンジ|リスト]パーティション表に変換することも可能です。
表パーティションの交換は、非パーティション表を使用するアプリケーションがあり、その表をパーティション表のパーティションに変換する必要がある場合にとても便利です。たとえば、データ・ウェアハウス環境で、パーティションの交換を行うと、新しい増分データの既存のパーティション表への高速データ・ローディングが容易になります。一般的に、データ・ウェアハウス環境だけでなくOLTP環境でも、パーティション表の古いデータ・パーティションを交換することで利点があります。実際には削除されずにパーティション表からデータがパージされ、後から個別にアーカイブできます。
パーティションを交換すると、ロギング属性が保持されます。ローカル索引も交換するかどうか(INCLUDING
INDEXES
句)、および行が適切にマッピングされていることを検証するかどうか(WITH
VALIDATION
句)をオプションで指定できます。
注意: パーティションの交換操作にWITHOUT VALIDATION を指定する場合、これに関連するのはデータ・ディクショナリの更新のみであるため、通常は高速な操作です。ただし、交換操作に関連する表またはパーティション表に主キーがある場合や一意制約が有効化されている場合には、制約の整合性を維持するため、交換操作はWITH VALIDATION が指定されているように実行されます。
この検証アクティビティのオーバーヘッドを避けるには、パーティションの交換操作を実行する前に、各制約に対して次の文を発行します。
ALTER TABLE table_name
DISABLE CONSTRAINT constraint_name KEEP INDEX
交換後に制約を有効化します。
|
UPDATE
INDEXES
を指定しないかぎり、パーティションを交換する表のグローバル索引またはすべてのグローバル索引パーティションが、データベースによりUNUSABLE
とマークされます。交換が行われる表のグローバル索引またはグローバル索引パーティションは、無効化されたままになります。(索引構成表にはUPDATE
INDEXES
を使用できません。かわりにUPDATE
GLOBAL
INDEXES
を使用してください。)
レンジ、ハッシュまたはリスト・パーティション表のパーティションを非パーティション表と交換する場合、またはその逆を行う場合は、ALTER
TABLE
... EXCHANGE
PARTITION
文を使用します。パーティションを非パーティション表に変換する例を次に示します。この例では、表stocks
をレンジ、ハッシュまたはリスト・パーティション化できます。
ALTER TABLE stocks EXCHANGE PARTITION p3 WITH TABLE stock_table_3;
時間隔パーティション表の時間隔パーティションを交換できます。ただし、パーティションを交換する前に、時間隔パーティションが作成されていることを確認する必要があります。時間隔パーティションをロックすることで、データベースによりパーティションが作成されます。
次の例では、2004年1月1日現在に、月単位のパーティションを使用して時間隔パーティション化された、interval_sales
表のパーティションの交換を示します。この例では、パーティション交換ロードを使用して、表に2007年6月のデータを追加する方法を示します。interval_sales
表にはローカル索引のみがあり、interval_sales_june_2007
表に対応する索引が作成されているとします。
LOCK TABLE interval_sales PARTITION FOR (TO_DATE('01-JUN-2007','dd-MON-yyyy')) IN SHARE MODE; 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
データ・ディクショナリ・ビューを問い合せることで、システム生成のパーティション名の検出にパーティション名を使用できます。
参照パーティション表のパーティションを交換できますが、参照するデータが親表のそれぞれのパーティションで使用可能であることを確認する必要があります。
次の例では、レンジ・パーティション化されたorders
表、および参照パーティション化されたorder_items
表のパーティション交換ロードのシナリオを示します。order_items_dec_2006
表のデータには、order_date
が2006年12月の注文の注文アイテム・データのみが含まれていることに注意してください。
ALTER TABLE orders EXCHANGE PARTITION p_2006_dec WITH TABLE orders_dec_2006 UPDATE GLOBAL INDEXES; ALTER TABLE order_items_dec_2006 ADD CONSTRAINT order_items_dec_2006_fk FOREIGN KEY (order_id) REFERENCES orders(order_id) ; ALTER TABLE order_items EXCHANGE PARTITION p_2006_dec WITH TABLE order_items_dec_2006;
主キー索引を使用可能なままにするには、親表のパーティションの交換では、UPDATE GLOBAL INDEXES
またはUPDATE INDEXES
を使用する必要があります。また、参照パーティション表でのパーティションの交換を正常に行うには、order_items_dec_2006
表で外部キー制約を作成するか有効化する必要があります。
仮想列が存在する場合もパーティションを交換できます。仮想列を含むパーティション表でパーティションの交換を正常に行うには、パーティション表の単一のパーティションにある仮想列以外のすべての列の定義に一致する表を作成する必要があります。仮想列に制約または索引が定義されている場合を除き、仮想列の定義を含める必要はありません。
定義されている場合は、パーティション表の制約および索引の定義に一致させるために、仮想列の定義を含める必要があります。このシナリオは、仮想列ベースのパーティション表にも適用されます。
この例では、すべてのパーティションを含むハッシュ・パーティション表全体を、* - ハッシュ・パーティション表のパーティションおよびそのすべてのハッシュ・サブパーティションと交換します。次の例では、レンジ - ハッシュ・パーティション表のこの概念を説明します。
まず、ハッシュ・パーティション表を作成します。
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;
* - ハッシュ・パーティション表のハッシュ・サブパーティションを非パーティション表に変換する場合、またはその逆を行う場合は、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;
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;
ALTER
TABLE
... EXCHANGE
SUBPARTITION
のセマンティックは、「* - ハッシュ・パーティション表のサブパーティションの交換」で説明されているセマンティックと同じです。
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
表のサブパーティション化キーと一致していることが重要です。
次に、パーティションを交換します。時間隔パーティションを交換するため、まずパーティションをロックしてパーティションが作成されることを確認する必要があります。
LOCK TABLE orders PARTITION FOR (TO_DATE('01-MAR-2007','dd-MON-yyyy')) IN SHARE MODE; ALTER TABLE orders EXCHANGE PARTITION FOR (TO_DATE('01-MAR-2007','dd-MON-yyyy')) WITH TABLE orders_mar_2007 WITH VALIDATION;
ALTER
TABLE
... EXCHANGE
SUBPARTITION
のセマンティックは、「* - ハッシュ・パーティション表のサブパーティションの交換」で説明されているセマンティックと同じです。
2つのパーティションのコンテンツを1つのパーティションにマージするには、ALTER
TABLE
... MERGE
PARTITION
文を使用します。元の2つのパーティションと、対応するローカル索引は削除されます。
この文は、ハッシュ・パーティション表、またはコンポジット* - ハッシュ・パーティション表のハッシュ・サブパーティションには使用できません。
参照パーティション表のパーティションはマージできません。かわりに、親表でのマージ操作がすべての子表にカスケードされます。ただし、パーティションまたはサブパーティションをマージするために、マスター表でマージ操作を発行する場合は、DEPENDENT TABLES
句を使用して依存表に特定のプロパティを設定できます。
関連項目: 『Oracle Database SQL言語リファレンス』 |
関連するパーティションまたはサブパーティションにデータが含まれる場合は、次の表で説明するように、索引はUNUSABLE
とマークされます。
表のタイプ | 索引の動作 |
---|---|
通常(ヒープ) | ALTER TABLE 文の一部にUPDATE INDEXES を指定しない場合:
|
索引構成 |
|
隣接する2つのレンジ・パーティションのコンテンツを、1つのパーティションにマージできます。隣接しないレンジ・パーティションはマージできません。結果のパーティションは、マージされた2つのパーティションの高い方の上限を継承します。
レンジ・パーティションをマージする理由の1つは、大規模なパーティションで、履歴データをオンラインに保つためです。たとえば、最も古いパーティションが週次パーティションにロールアップされ、そのパーティションは月次パーティションにロールアップされる日次パーティションを作成できます。
次のスクリプトでは、レンジ・パーティションのマージの例を示します。
まず、パーティション表を作成し、ローカル索引を作成します。
-- Create a Table with four partitions each on its own tablespace -- Partitioned by range on the data 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-1998','dd-mon-yyyy')) TABLESPACE quarter_one, PARTITION quarter_two VALUES LESS THAN ( TO_DATE('01-jul-1998','dd-mon-yyyy')) TABLESPACE quarter_two, PARTITION quarter_three VALUES LESS THAN ( TO_DATE('01-oct-1998','dd-mon-yyyy')) TABLESPACE quarter_three, PARTITION quarter_four VALUES LESS THAN ( TO_DATE('01-jan-1999','dd-mon-yyyy')) TABLESPACE quarter_four ); -- -- Create local PREFIXED index 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 );
次に、パーティションをマージします。
-- -- Merge the first two partitions -- ALTER TABLE four_seasons MERGE PARTITIONS quarter_one, quarter_two INTO PARTITION quarter_two UPDATE INDEXES;
この文からUPDATE
INDEXES
句を除外した場合は、影響を受けるパーティションのローカル索引を再作成する必要があります。
-- Rebuild index for quarter_two, which has been marked unusable -- because it has not had all of the data from Q1 added to it. -- Rebuilding the index will correct this. -- ALTER TABLE four_seasons MODIFY PARTITION quarter_two REBUILD UNUSABLE LOCAL INDEXES;
隣接する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日より大きい値は、時間隔パーティション表の時間隔部分に分類されます。
リスト・パーティションをマージする場合、マージするパーティションは任意の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')
結果のq1_central
パーティションの値リストは、これら2つのパーティションの値リストを合せたセットで構成されます。具体的には次のようになっています。
('SD','WI','OK','TX')
* - ハッシュ・パーティションをマージすると、サブパーティションが、SUBPARTITIONS
n
またはSUBPARTITION
句で指定されたサブパーティション数に再度ハッシュされます。どちらも含まれない場合、表レベルのデフォルトが使用されます。
2つの* - ハッシュ・パーティションをマージする場合とは対照的に、* - ハッシュ・パーティションを分割する場合(「* - ハッシュ・パーティションの分割」を参照)は、プロパティの継承方法が異なることに注意してください。パーティションを分割する場合は親が1つのみであるため、新しいパーティションは元のパーティションからプロパティを継承できます。ただし、パーティションをマージする場合は、表レベルからプロパティを継承する必要があります。
時間隔 - ハッシュ・パーティション表の場合、マージできるのは、隣接する2つの時間隔パーティションか、最高位のレンジ・パーティションと最初の時間隔パーティションのみです。「時間隔パーティションのマージ」に説明されているように、時間隔 - ハッシュ・パーティション表で時間隔をマージすると転移点が移動します。
次の例では、2つのレンジ - ハッシュ・パーティションをマージします。
ALTER TABLE all_seasons MERGE PARTITIONS quarter_1, quarter_2 INTO PARTITION quarter_2 SUBPARTITIONS 8;
パーティションはパーティション・レベルで、サブパーティションはリスト・サブパーティション・レベルでマージできます。
* - リスト・パーティション表のパーティションのマージは、「レンジ・パーティションのマージ」で説明されている内容と同様です。ただし、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
の上限値と、表のサブパーティション・テンプレートの説明からサブパーティションの値リストの説明を継承しています。
結果のパーティションのデータには、両方のパーティションのデータが含まれます。ただし、データベースによりエラーが戻される場合があります。これは、次に示す両方の条件に当てはまる場合には、データが新しいパーティション外にマップされているためです。
マージされたサブパーティションの一部のリテラル値がサブパーティション・テンプレートに含まれていない。
サブパーティション・テンプレートにデフォルトのパーティション定義が含まれていない。
このエラー条件は、デフォルトのサブパーティション・テンプレートに必ずデフォルトのパーティションを指定することでなくすことができます。
同じパーティションに属する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')
結果のサブパーティションが配置されている表領域およびサブパーティションの属性は、明示的に指定されている場合を除き、パーティション・レベルのデフォルト属性によって決定されます。既存のサブパーティション名を再利用する場合、新しいサブパーティションは、名前が再利用されるサブパーティションのサブパーティション属性を継承します。
パーティションはパーティション・レベルで、サブパーティションはレンジ・サブパーティション・レベルでマージできます。
* - レンジ・パーティション表のパーティションのマージは、「レンジ・パーティションのマージ」で説明されている内容と同様です。ただし、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
のサブパーティションをサブパーティション・テンプレートに必ず指定することでなくすことができます。
表またはコンポジット・パーティション表のパーティションのデフォルト属性を変更できます。デフォルト属性を変更する場合、新しい属性の影響を受けるのは、作成される今後のパーティションまたはサブパーティションのみです。新しいパーティションまたはサブパーティションの作成時には、デフォルト値を明示的に上書きできます。参照パーティション表のデフォルト属性を変更できます。
ALTER
TABLE
のMODIFY
DEFAULT
ATTRIBUTES
句を使用して、レンジ、ハッシュ、リスト、時間隔または参照パーティションに継承されるデフォルト属性を変更できます。
ハッシュ・パーティション表の場合、変更できるのはTABLESPACE
属性のみです。
サブパーティションの作成時に継承されたデフォルト属性を変更するには、ALTER
TABLE
... MODIFY
DEFAULT
ATTRIBUTES
FOR
PARTITION
を使用します。次の文では、レンジ - ハッシュ・パーティション表emp
のパーティションp1
の後続のサブパーティションが配置されるTABLESPACE
を変更します。
ALTER TABLE emp MODIFY DEFAULT ATTRIBUTES FOR PARTITION p1 TABLESPACE ts1;
TABLESPACE
を除き、レンジ - ハッシュ・パーティション表のすべてのサブパーティションでは同じ属性を共有する必要があるため、これは変更できる唯一の属性です。
作成されていない時間隔パーティションのデフォルト属性は変更できません。時間隔パーティション表の今後のサブパーティションの作成方法を変更する場合は、サブパーティション・テンプレートを変更する必要があります。
表または索引の既存のパーティションの属性を変更できます。
TABLESPACE
属性は変更できません。新しい表領域にパーティションまたはサブパーティションを移動する場合は、ALTER
TABLESPACE
... MOVE
PARTITION
/SUBPARTITION
を使用します。
レンジ・パーティションまたはリスト・パーティションの既存の属性を変更するには、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;
時間隔パーティション表の場合、変更できるのは、作成済のレンジ・パーティションまたは時間隔パーティションの実際の属性のみです。
ハッシュ・パーティションの属性を変更するには、ALTER
TABLE
... MODIFY
PARTITION
文も使用します。ただし、個々のハッシュ・パーティションの物理属性は(TABLESPACE
を除き)すべて同一である必要があるため、実行できるのは次の操作のみです。
次の例では、表dept
のハッシュ・パーティションP1
に関連付けられた使用できないローカル索引パーティションを再作成します。
ALTER TABLE dept MODIFY PARTITION p1 REBUILD UNUSABLE LOCAL INDEXES;
ALTER
TABLE
のMODIFY
SUBPARTITION
句を使用すると、前の項でパーティションに関してリストされていたのと同じアクションを実行できますが、実行できるのは、特定のコンポジット・パーティション表のサブパーティション・レベルにおいてです。次に例を示します。
ALTER TABLE emp MODIFY SUBPARTITION p3_s1 REBUILD UNUSABLE LOCAL INDEXES;
ALTER
INDEX
のMODIFY
PARTITION
句を使用すると、索引パーティションまたはそのサブパーティションの実際の属性を変更できます。表パーティションのルールに非常に似ていますが、ALTER
INDEX
のMODIFY
PARTITION
句とは異なり、使用できない索引パーティションを再作成するための副次句がありません。ただし、索引パーティションまたはそのサブパーティションを結合するための副次句があります。このコンテキストにおいて、結合は、解放して再利用できる索引ブロックをマージすることを意味します。
MODIFY
PARTITION
句を使用して、ローカル索引のサブパーティションに対する記憶域の割当てや割当て解除、またはそれらをUNUSABLE
とマークすることもできます。
リスト・パーティション化では、定義された値リストのリテラル値を追加するオプションを使用できます。
既存のパーティションの値リストを拡張するには、ALTER
TABLE
文のMODIFY
PARTITION
... ADD
VALUES
句を使用します。追加するリテラル値は、その他のパーティションの値リストに含まれていない必要があります。対応するローカル索引パーティションのパーティションの値リストはそれに応じて拡張され、グローバル索引や、グローバルまたはローカル索引パーティションは使用可能なままです。
次の文では、既存のパーティション・リストに、一連の新しい州コード(OK
、KS
)を追加します。
ALTER TABLE sales_by_region MODIFY PARTITION region_south ADD VALUES ('OK', 'KS');
デフォルトのパーティションがあると、その他のパーティションへの値の追加時にパフォーマンスに影響があります。これは、リスト・パーティションに値を追加するために、追加する値がデフォルトのパーティションに存在しないことをデータベースで確認する必要があるためです。デフォルトのパーティションに存在する値がある場合には、エラーが発生します。
注意: データベースにより、追加されるリテラル値に対応する行がデフォルトのパーティションに存在するかどうかを確認する問合せが実行されます。そのため、表にローカルの同一キー索引を作成することをお薦めします。これにより、問合せの実行および操作全体が高速化されます。 |
デフォルトのリスト・パーティションには値を追加できません。
この操作は、「リスト・パーティションの変更: 値の追加」に説明されている操作と基本的に同じですが、MODIFY
PARTITION
句ではなくMODIFY
SUBPARTITION
句を使用します。たとえば、サブパーティションq1_1999_southeast
の値リストにあるリテラル値のレンジを拡張するには、次の文を使用します。
ALTER TABLE quarterly_regional_sales MODIFY SUBPARTITION q1_1999_southeast ADD VALUES ('KS');
追加するリテラル値が、所有パーティション内のその他のサブパーティションの値リストに含まれていない必要があります。ただし、表内にあるその他のパーティションのサブパーティションの値リストのリテラル値を複製したものであってもかまいません。
時間隔 - リスト・コンポジット・パーティション表の場合、作成済のレンジ・パーティションか時間隔パーティションのサブパーティションにのみ値を追加できます。まだ作成されていない時間隔パーティションのサブパーティションに値を追加する場合は、サブパーティション・テンプレートを変更する必要があります。
リスト・パーティション化では、定義された値リストのリテラル値を削除するオプションを使用できます。
既存のパーティションの値リストからリテラル値を削除するには、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');
注意: データベースにより、削除されるリテラル値に対応する行がパーティションに存在するかどうかを確認する問合せが実行されます。そのため、表にローカルの同一キー索引を作成することをお薦めします。これにより、問合せの実行および操作全体が高速化されます。 |
デフォルトのリスト・パーティションからは値を削除できません。
この操作は、「リスト・パーティションの変更: 値の削除」に説明されている操作と基本的に同じですが、MODIFY
PARTITION
句ではなくMODIFY
SUBPARTITION
句を使用します。たとえば、サブパーティションq1_1999_southeast
の値リストにある一連のリテラル値を削除するには、次の文を使用します。
ALTER TABLE quarterly_regional_sales MODIFY SUBPARTITION q1_1999_southeast DROP VALUES ('KS');
時間隔 - リスト・コンポジット・パーティション表の場合、作成済のレンジ・パーティションか時間隔パーティションのサブパーティションからのみ値を削除できます。まだ作成されていない時間隔パーティションのサブパーティションから値を削除する場合は、サブパーティション・テンプレートを変更する必要があります。
新しいサブパーティション・テンプレートと置き換えることで、コンポジット・パーティション表のサブパーティション・テンプレートを変更できます。サブパーティション・テンプレートを使用する後続の操作(ADD
PARTITION
またはMERGE
PARTITIONS
など)で、新しいサブパーティション・テンプレートが使用されます。既存のサブパーティションは変更されません。
時間隔 - *コンポジット・パーティション表のサブパーティション・テンプレートを変更すると、作成されていない時間隔パーティションに新しいサブパーティション・テンプレートが使用されます。
新しいサブパーティション・テンプレートを指定するには、ALTER
TABLE
... SET
SUBPARTITION
TEMPLATE
文を使用します。次に例を示します。
ALTER TABLE emp_sub_template SET SUBPARTITION TEMPLATE (SUBPARTITION e TABLESPACE ts1, SUBPARTITION f TABLESPACE ts2, SUBPARTITION g TABLESPACE ts3, SUBPARTITION h TABLESPACE ts4 );
空のリストを指定することで、サブパーティション・テンプレートを削除できます。
ALTER TABLE emp_sub_template SET SUBPARTITION TEMPLATE ( );
ALTER
TABLE
文のMOVE
PARTITION
句は、次のような場合に使用します。
データを再クラスタリングして断片化を減らす場合
別の表領域にパーティションを移動する場合
作成時属性を変更する場合
表圧縮を使用してデータを圧縮形式で保存する場合
通常は、ALTER
TABLE
/INDEX
... MODIFY
PARTITION
文を使用して、一度にパーティションの物理記憶域属性を変更できます。ただし、TABLESPACE
などの一部の物理属性は、MODIFY
PARTITION
を使用して変更できません。そのような場合には、MOVE
PARTITION
句を使用します。表圧縮などのその他の属性を変更すると、既存のデータではなく、後続の記憶域のみが影響されます。
注意: ALTER TABLE ...MOVE コマンドの実行中は、パーティションでDMLを使用することはできません。パーティションを移動する際にDML用にそのパーティションを使用可能なままにする場合は、「オンラインでのパーティションの再定義」を参照してください。 |
移動するパーティションにデータが含まれる場合は、次の表で説明するように、索引はUNUSABLE
とマークされます。
表のタイプ | 索引の動作 |
---|---|
通常(ヒープ) | ALTER TABLE 文の一部にUPDATE INDEXES を指定しない場合:
|
索引構成 | 移動するパーティションに定義された任意のローカルまたはグローバル索引は、主キー・ベースの論理行IDであるため使用可能なままです。ただし、これらの行IDの不確定情報は不適切になります。 |
パーティションを移動するには、MOVE
PARTITION
句を使用します。たとえば、(I/Oを調整するために)最もアクティブなパーティションをアクションは記録せずにデータを圧縮し、一連の独自のディスクに存在する表領域に移動するには、次の文を発行します。
ALTER TABLE parts MOVE PARTITION depot2 TABLESPACE ts094 NOLOGGING COMPRESS;
この文では、新しい表領域を指定しない場合でも、古いパーティション・セグメントが削除され、新しいセグメントが作成されます。
パーティション化索引構成表のパーティションを移動する場合は、MOVE
PARTITION
句の一部としてMAPPING
TABLE
句を指定できます。これにより、マッピング表のパーティションは表パーティションとともに新しい場所に移動されます。
時間隔または時間隔 - *パーティション表の場合、移動できるのは、作成済のレンジ・パーティションまたは時間隔パーティションのみです。パーティションの移動操作では、時間隔または時間隔 - *パーティション表の転移点は移動されません。
マスター表のパーティションには関係なく、参照パーティション表のパーティションを移動できます。
Oracle Databaseには、DMLに対するパーティションの可用性にそれほど影響を与えずに、パーティションの移動や、パーティションの物理構造にその他の変更を行うメカニズムがあります。このメカニズムはオンライン表再編成と呼ばれます。
表の単一パーティションの再定義の詳細は、『Oracle Database管理者ガイド』を参照してください。
次に、索引パーティションを再作成する理由をいくつか示します。
領域のリカバリおよびパフォーマンスの向上
メディア障害により破損した索引パーティションの修復
SQL*Loaderまたはインポート・ユーティリティを使用して基礎となる表パーティションをロードした後のローカル索引パーティションの再作成
UNUSABLE
とマークされた索引パーティションの再作成
Bツリー索引のキー圧縮の有効化
次の項では、索引パーティションおよびサブパーティションを再作成するためのオプションを説明します。
グローバル索引パーティションは、2つの方法で再作成できます。
ALTER
INDEX
... REBUILD
PARTITION
文を発行して各パーティションを再作成する方法(再作成は同時に実行できます)。
グローバル索引全体を削除して再作成する方法。表がスキャンされるのは一度のみであるため、この方法はより効率的です。
索引付きのパーティション表におけるほとんどのメンテナンス操作では、DDL文にUPDATE
INDEXES
を指定することにより、オプションで索引の再作成を回避できます。
ALTER
INDEX
またはALTER
TABLE
を使用し、次のようにしてローカル索引を再作成します。
ALTER
INDEX
... REBUILD
PARTITION
/SUBPARTITION
この文では、索引パーティションまたはサブパーティションが無条件に再作成されます。
ALTER
TABLE
... MODIFY
PARTITION
/SUBPARTITION
... REBUILD
UNUSABLE
LOCAL
INDEXES
この文では、指定された表パーティションまたはサブパーティションの使用できない索引がすべて検出されて再作成されます。UNUSABLE
とマークされていた場合、索引パーティションのみが再作成されます。
ALTER
INDEX
... REBUILD
PARTITION
文は、索引の1つのパーティションを再作成します。コンポジット・パーティション表には使用できません。このコマンドで再作成できるのは、実際の物理セグメントのみです。索引を再作成する際には、新しい表領域へのパーティションの移動や属性の変更も選択できます。
コンポジット・パーティション表の場合は、ALTER
INDEX
... REBUILD
SUBPARTITION
を使用して索引のサブパーティションを再作成します。サブパーティションを別の表領域に移動するか、PRALLEL句を指定できます。次の文では、表のローカル索引のサブパーティションを再作成し、索引サブパーティションを別の表領域に移動します。
ALTER INDEX scuba REBUILD SUBPARTITION bcd_types TABLESPACE tbs23 PARALLEL (DEGREE 2);
ALTER
TABLE
... MODIFY
PARTITION
のREBUILD
UNUSABLE
LOCAL
INDEXES
句では、再作成された索引パーティションに新しい属性を指定できません。次の例では、表scubagear
のパーティションP1
の使用できないローカル索引パーティションを検出して再作成します。
ALTER TABLE scubagear MODIFY PARTITION p1 REBUILD UNUSABLE LOCAL INDEXES;
使用できないローカル索引サブパーティションの再作成には、対応するALTER
TABLE
... MODIFY
SUBPARTITION
句も使用できます。
表と索引の両方のパーティションおよびサブパーティション名を変更できます。パーティション名を変更する理由の1つは、別のメンテナンス操作でパーティションに割り当てられたデフォルトのシステム名とは対照的に、意味のわかる名前を割り当てるためです。
すべてのパーティション化メソッドで、パーティションを識別するためのFOR(
value
)
メソッドがサポートされています。このメソッドを使用して、システム生成されたパーティション名をより意味のわかりやすい名前に変更できます。これは、時間隔または時間隔 - *パーティショ表に特に便利です。
参照パーティション化されたマスター表および子表のパーティションやサブパーティション名を個別に変更できます。マスター表での名前の変更操作は、子表にカスケードされません。
ALTER
TABLE
... RENAME
PARTITION
文を使用して、レンジ、ハッシュまたはリスト・パーティションの名前を変更できます。次に例を示します。
ALTER TABLE scubagear RENAME PARTITION sys_p636 TO tanks;
ALTER
TABLE
またはALTER
INDEX
文のSPLIT
PARTITION
句は、パーティションのコンテンツを2つの新しいパーティションに再分散するために使用されます。パーティションが大きくなりすぎてバックアップ、リカバリまたはメンテナンス操作の完了に長い時間がかかるようになった場合や、単純にパーティションのデータが増えすぎた場合に、再分散を検討します。SPLIT
PARTITION
句を使用して、I/Oロードを再分散することもできます。
この句は、ハッシュ・パーティションまたはサブパーティションには使用できません。
分割するパーティションにデータが含まれる場合は、次の表で説明するように、索引はUNUSABLE
とマークされます。
表のタイプ | 索引の動作 |
---|---|
通常(ヒープ) | ALTER TABLE 文の一部にUPDATE INDEXES を指定しない場合:
|
索引構成 |
|
参照パーティション表のパーティションまたはサブパーティションは分割できません。親表のパーティションまたはサブパーティションを分割すると、すべての子表にカスケードされます。ただし、パーティションまたはサブパーティションを分割するために、マスター表でSPLIT
文を発行する場合は、DEPENDENT TABLES
句を使用して依存表に特定のプロパティを設定できます。
関連項目: 『Oracle Database SQL言語リファレンス』 |
ALTER
TABLE
... SPLIT
PARTITION
文を使用して、レンジ・パーティションを分割します。パーティションの分割点である、パーティションのレンジ内のパーティション化キー列の値を指定します。結果の新しい2つのパーティションの1つ目には、パーティション化キー列の値が、指定された値より小さいものをマッピングする元のパーティションのすべての行が含まれます。2つ目のパーティションには、パーティション化キー列値が、指定された値以上のものをマッピングするすべての行が含まれます。
分割の結果である2つのパーティションに、オプションで新しい属性を指定できます。表にローカル索引が定義されている場合、この文では、各ローカル索引の一致するパーティションも分割されます。
次の例で、fee_katy
は、ローカル索引jaf1
を持つ表vet_cats
のパーティションです。この表には、グローバル索引vet
もあります。vet
には、vet_parta
およびvet_partb
の2つのパーティションが含まれます。
パーティション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;
注意: 新しいパーティションの名前を指定しない場合、データベースにより、SYS_P n という書式の名前が割り当てられます。データ・ディクショナリを調査して、新しいローカル索引パーティションに割り当てられた名前を検出できます。それらの名前を変更する必要がある場合もあります。指定しない属性は、元のパーティションから継承されます。 |
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 (NEXT 2M PCTINCREASE 25)) 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つ目のパーティションを作成します。
次の例では、sales_by_region
のデフォルトのパーティションを分割し、それによって新しいパーティションを作成します。
ALTER TABLE sales_by_region SPLIT PARTITION region_unknown VALUES ('MT', 'WY', 'ID') INTO ( PARTITION region_wildwest, PARTITION region_unknown);
時間隔パーティション表で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'));
これは、* - ハッシュ・パーティションのマージの逆の操作です。* - ハッシュ・パーティションを分割すると、新しいサブパーティションが、SUBPARTITIONS
またはSUBPARTITION
句で指定されたサブパーティション数に再度ハッシュされます。または、そのような句が含まれていない場合、新しいパーティションは、分割されるパーティションのサブパーティション(および表領域)の数を継承します。
2つの* - ハッシュ・パーティションをマージする場合と、* - ハッシュ・パーティションを分割する場合では、プロパティの継承方法が異なることに注意してください。パーティションを分割する場合は親が1つのみであるため、新しいパーティションは元のパーティションからプロパティを継承できます。ただし、パーティションをマージする場合は、親が2つあり、新しいパーティションで一方を無視して継承することはできないため、表レベルからプロパティを継承する必要があります。
次の例では、レンジ - ハッシュ・パーティションを分割します。
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);
時間隔 - ハッシュ・パーティション表の分割のルールは、時間隔パーティション表の分割のルールと同じです。「時間隔パーティション表のパーティションの分割」に説明されているように、転移点は分割されたパーティションの上限に変更されます。
パーティションは、パーティション・レベルとリスト・サブパーティション・レベルの両方で分割できます。
* - リスト・パーティション表のパーティションの分割は、「レンジ・パーティション表のパーティションの分割」での説明と似ています。新しいパーティションのいずれにも、サブパーティションのリテラル値のリストを指定できません。新しいパーティションは、分割元のパーティションからサブパーティションの説明を継承します。
次の例では、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 (NEXT 2M PCTINCREASE 25) 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.
* - リスト・パーティション表のリスト・サブパーティションの分割は、「リスト・パーティション表のパーティションの分割」で説明されている内容と似ていますが、構文は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
個々のサブパーティションには、分割されたサブパーティションから継承された新しい物理属性があります。
時間隔 - リスト・パーティション表のサブパーティションは、リスト・サブパーティションまたはマテリアライズ化された時間隔サブパーティションにのみ分割できます。後続の時間隔パーティションのサブパーティション値を変更する場合は、サブパーティション・テンプレートを変更する必要があります。
* - レンジ・パーティション表のパーティションの分割は、「レンジ・パーティション表のパーティションの分割」で説明されている内容と似ています。新しいパーティションのいずれにも、サブパーティションのレンジ値を指定できません。新しいパーティションは、分割元のパーティションからサブパーティションの説明を継承します。
次の例では、時間隔 - レンジ・パーティション表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
* - レンジ・パーティション表のレンジ・サブパーティションの分割は、「レンジ・パーティション表のパーティションの分割」で説明されている内容と似ていますが、構文は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
個々のサブパーティションには、分割されたサブパーティションから継承された新しい物理属性があります。
時間隔 - レンジ・パーティション表のサブパーティションは、レンジ・サブパーティションまたはマテリアライズ化された時間隔サブパーティションにのみ分割できます。後続の時間隔パーティションのサブパーティションの上限を変更する場合は、サブパーティション・テンプレートを変更する必要があります。
ローカル索引のパーティションは明示的に分割できません。ローカル索引パーティションが分割されるのは、基礎となる表のパーティションを分割した場合のみです。ただし、グローバル索引パーティションは、次の例のようにして分割できます。
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
とマークされていなければ、結果のパーティションを再作成する必要はありません。
2つの新しいパーティションを作成し、分割されるパーティションの行を2つの新しいパーティションに再分散することで、Oracle DatabaseにSPLIT
PARTITION
操作が実装されます。分割するパーティションのすべての行をスキャンし、新しいパーティションに1つずつ挿入する必要があるため、これはコストのかかる操作です。さらに、UPDATE
INDEXES
句を使用しない場合、ローカルおよびグローバル索引も再作成する必要があります。
分割操作後、分割されたパーティションのすべての行が新しいパーティションの一方に含まれ、もう一方には行がない場合があります。これは、表の最初のパーティションを分割した場合によく起こります。このような状況はデータベースにより検出され、分割操作が最適化されます。この最適化により、パーティションの追加操作のように動作する分割操作が高速になります。
具体的には、次の条件をすべて満たしている場合に、SPLIT
PARTITION
操作がデータベースにより最適化および高速化されます。
結果の2つのパーティションの一方が空である必要があります。
空ではない結果のパーティションの記憶域特性が、分割されたパーティションの記憶域特性と同一である必要があります。具体的な内容を次に示します。
分割元のパーティションがコンポジットの場合、空ではない新しい結果のパーティションの各サブパーティションの記憶域特性は、分割元のパーティションのサブパーティションの記憶域特性と同一である必要があります。
分割元のパーティションにLOB
列が含まれる場合、空ではない新しい結果のパーティションの各LOB
(サブ)パーティションの記憶域特性は、分割元のパーティションのLOB
(サブ)パーティションの記憶域特性と同一である必要があります。
オーバーフローが含まれる索引構成表のパーティションを分割する場合、空ではない新しい結果のパーティションの各オーバーフロー(サブ)パーティションの記憶域特性は、分割元のパーティションのオーバーフロー(サブ)パーティションの記憶域特性と同一である必要があります。
マッピング表が含まれる索引構成表のパーティションを分割する場合、空ではない新しい結果のパーティションの各マッピング表(サブ)パーティションの記憶域特性は、分割元のパーティションのマッピング表(サブ)パーティションの記憶域特性と同一である必要があります。
分割後にこれらの条件に一致していれば、UPDATE
INDEXES
句を指定しなかった場合でも、グローバル索引はすべて使用可能なままです。分割前に使用可能であった場合、結果のパーティションの両方に関連付けられているローカル索引(サブ)パーティションは使用可能なままです。空ではない結果のパーティションに対応するローカル索引(サブ)パーティションは、分割されたパーティションのローカル索引(サブ)パーティションと同一になります。
SPLIT
SUBPARTITION
操作にも、同じ最適化が行われます。
表パーティションからすべての行を削除するには、ALTER
TABLE
... TRUNCATE
PARTITION
文を使用します。パーティションの切捨ては、パーティションのデータはなくなりますが物理的に削除されないことを除き、パーティションの削除に似ています。
索引パーティションは切り捨てられません。ただし、表にローカル索引が定義されている場合には、ALTER
TABLE
... TRUNCATE
PARTITION
文により各ローカル索引の一致するパーティションが切り捨てられます。UPDATE
INDEXES
を指定しない場合、グローバル索引はUNUSABLE
とマークされ、再作成する必要があります。(索引構成表にはUPDATE
INDEXES
を使用できません。かわりにUPDATE
GLOBAL
INDEXES
を使用してください。)
領域を解放するかどうかに関係なく、表パーティションからすべての行を削除するには、ALTER
TABLE
... TRUNCATE
PARTITION
文を使用します。時間隔パーティション表のパーティションを切り捨てても、転移点は移動されません。参照パーティション表のパーティションおよびサブパーティションは切り捨てられません。
パーティションにデータおよびグローバル索引が含まれている場合は、次のいずれかの方法を使用して表パーティションを切り捨てます。
方法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;
パーティションにデータが含まれ、参照整合性制約がある場合には、パーティションを切り捨てられません。削除するパーティションのデータを参照しているデータがない場合は、次のいずれかの方法を選択して表パーティションを切り捨てます。
方法1
整合性制約を無効化し、ALTER
TABLE
... TRUNCATE
PARTITION
文を発行して、整合性制約を再度有効化します。これは、切り捨てられるパーティションに表の合計データの大部分が含まれる大規模な表に最適な方法です。別の表に参照元のデータがある場合には、そのデータを削除して、整合性制約を再度有効化できるようにする必要があります。
方法2
ALTER
TABLE
... TRUNCATE
PARTITION
文を発行する前に、DELETE
文を発行してパーティションからすべての行を削除します。DELETE
文により参照整合性制約が強制されます。また、トリガーの起動や、REDOおよびUNDOログの生成も行われます。ON DELETE CASCADE
オプションを使用して外部キー制約が作成されている場合は、参照表のデータが削除されます。
注意: すべての行を削除する前に、(ALTER TABLE ... TRUNCATE PARTITION ... NOLOGGING を使用して)パーティションにNOLOGGING 属性を設定すると、ロギングの量を大幅に減らすことができます。 |
DELETE FROM sales partition (dec94); ALTER TABLE sales TRUNCATE PARTITION dec94;
これは、小規模な表、または切り捨てられるパーティションに含まれる表の合計データの割合が少ない場合に、大規模な表に最適な方法です。
Oracle Databaseでは、パーティション表に対するDROP
TABLE
文は、非パーティション表に対する文と同様に処理されます。PURGE
キーワードを使用する場合のみ処理方法が異なり、この点はOracle Database 10gリリース2から異なっています。
リソース制約に該当しないように、パーティション表に対するDROP
TABLE
...PURGE
文では、複数のトランザクションで表を削除します。つまり、各トランザクションで、パーティションまたはサブパーティションのサブセットを削除してコミットします。表は、最後のトランザクションの終わりに完全に削除されます。この動作には、DROP
TABLE
文に対するいくつかの変更が伴い、ユーザーはそれを理解しておく必要があります。
1つ目は、DROP
TABLE
...PURGE
文が失敗した場合には修正処理を実行でき、必要な場合は文を再発行することです。文は失敗した場所から再開されます。
2つ目は、次に示すデータ・ディクショナリ・ビューでSTATUS
列の値をUNUSABLE
に設定すると、DROP
TABLE
...PURGE
文の実行中に表がunusableとマークされることです。
USER_TABLES
、ALL_TABLES
、DBA_TABLES
USER_PART_TABLES
、ALL_PART_TABLES
、DBA_PART_TABLES
USER_OBJECT_TABLES
、ALL_OBJECT_TABLES
、DBA_OBJECT_TABLES
これらのビューのSTATUS
列を問い合せることで、UNUSABLE
とマークされたパーティション表をすべてリストできます。
DBA_TAB_PARTITIONS
およびDBA_TAB_SUBPARTITIONS
など、パーティション化に関連するその他のデータ・ディクショナリ・ビューに対する問合せでは、UNUSABLE
とマークされた表に属する行は除外されます。これらのビューの完全なリストは、「パーティション表および索引の情報の表示」で参照できます。
表がUNUSABLE
とマークされた後に、その表に対して発行できる唯一の文は別のDROP
TABLE
...PURGE
文で、これは前のDROP
TABLE
...PURGE
文が失敗した場合に限られます。UNUSABLE
とマークされた表に対して発行したその他の文はエラーになります。削除操作が完了するまで、表はUNUSABLE
の状態のままです。
関連項目:
|
履歴表は、ある期間のエンタープライズのビジネス・トランザクションを説明します。履歴表は、売上、請求書、注文などの基本情報を含むベース表の場合があります。また、履歴表は、GROUP BY
、AVERAGE
またはCOUNT
などの操作を使用して、基本情報から導出したサマリー情報を含むロールアップ表の場合もあります。
履歴表の時間間隔は、一般的にローリング・ウィンドウです。DBAは、最も古いトランザクションを説明する一連の行を定期的に削除し、かわりに最新のトランザクションを説明する一連の行に領域を割り当てます。たとえば、DBAは、1995年4月30日の業務時間の終了時に、1994年4月のトランザクションを説明する行(およびそれをサポートする索引エントリ)を削除し、1995年4月のトランザクションに領域を割り当てます。
これから特定の例について検討します。13か月分のトランザクション(現在の月の注文と1年分の履歴データ)を含む表order
があるとします。各月にはパーティションが1つあります。これらの月単位のパーティションには、それらが存在する表領域と同じように、order_
yymm
という名前が付けられています。
order
表には2つのローカル索引が含まれています。order_ix_onum
はローカルで接頭辞付の注文番号に対する一意索引で、order_ix_supp
はローカルで接頭辞なしのサプライヤ番号に対する索引です。ローカル索引パーティションには、基礎となる表に一致する接尾辞を使用して名前が付けられます。顧客名に対するグローバル一意索引order_ix_cust
もあります。order_ix_cust
には3つのパーティションがあり、アルファベットの1/3ごとに1つのパーティションに分かれています。1994年10月31日に、order
の時間枠を次のように変更します。
最も古い時間間隔のデータをバックアップします。
ALTER TABLESPACE order_9310 BEGIN BACKUP; ... ALTER TABLESPACE order_9310 END BACKUP;
最も古い時間間隔のパーティションを削除します。
ALTER TABLE order DROP PARTITION order_9310;
最新の時間間隔にパーティションを追加します。
ALTER TABLE order ADD PARTITION order_9411;
グローバル索引パーティションを再作成します。
ALTER INDEX order_ix_cust REBUILD PARTITION order_ix_cust_AH; ALTER INDEX order_ix_cust REBUILD PARTITION order_ix_cust_IP; ALTER INDEX order_ix_cust REBUILD PARTITION order_ix_cust_QZ;
通常、いかなる操作(DML、DDLまたはユーティリティ)も、ALTER
TABLE
... DROP
PARTITION
などの個々のDDL文に影響しないように、データベースによりロックが取得されます。ただし、パーティション・メンテナンス操作に複数の手順がある場合は、アプリケーション(またはその他のメンテナンス操作)が、進行中の複数手順の操作に影響しないようにするのはデータベース管理者の責任です。次に、これを実行する方法を示します。
明確なバッチ期間中はユーザー・レベルのアプリケーションをすべて停止する。
すべてのアプリケーションで使用されるロールからアクセス権限を削除して、表order
にアクセスできないようにする。
次のビューは、パーティション表および索引に固有の情報を表示します。
ビュー | 説明 |
---|---|
DBA_PART_TABLES
|
DBA ビューは、データベース内のすべてのパーティション表に関するパーティション化情報を表示します。ALL ビューは、ユーザーがアクセス可能なすべてのパーティション表に関するパーティション化情報を表示します。USER ビューは、ユーザーが所有するパーティション表に関するパーティション化情報に制限されています。 |
DBA_TAB_PARTITIONS
|
パーティション・レベルのパーティション化情報、パーティションの記憶域パラメータ、およびDBMS_STATS パッケージまたはANALYZE 文により生成されたパーティション統計が表示されます。 |
DBA_TAB_SUBPARTITIONS
|
サブパーティション・レベルのパーティション化情報、サブパーティションの記憶域パラメータ、およびDBMS_STATS パッケージまたはANALYZE 文により生成されたサブパーティション統計が表示されます。 |
DBA_PART_KEY_COLUMNS
|
パーティション表のパーティション化キー列が表示されます。 |
DBA_SUBPART_KEY_COLUMNS
|
コンポジット・パーティション表(およびコンポジット・パーティション表のローカル索引)のサブパーティション化キー列が表示されます。 |
DBA_PART_COL_STATISTICS
|
表のパーティションに関する列統計およびヒストグラム情報が表示されます。 |
DBA_SUBPART_COL_STATISTICS
|
表のサブパーティションに関する列統計およびヒストグラム情報が表示されます。 |
DBA_PART_HISTOGRAMS
|
表パーティションのヒストグラムに関するヒストグラム・データ(各ヒストグラムのエンドポイント)が表示されます。 |
DBA_SUBPART_HISTOGRAMS
|
表サブパーティションのヒストグラムに関するヒストグラム・データ(各ヒストグラムのエンドポイント)が表示されます。 |
DBA_PART_INDEXES
|
パーティション索引のパーティション化情報が表示されます。 |
DBA_IND_PARTITIONS
|
索引パーティションのパーティション・レベルのパーティション化情報、パーティションの記憶域パラメータ、DBMS_STATS パッケージまたはANALYZE 文により収集された統計が表示されます。 |
DBA_IND_SUBPARTITIONS
|
索引サブパーティションのパーティション・レベルのパーティション化情報、パーティションの記憶域パラメータ、DBMS_STATS パッケージまたはANALYZE 文により収集された統計が表示されます。 |
DBA_SUBPARTITION_TEMPLATES
|
既存のサブパーティション・テンプレートの情報が表示されます。 |
関連項目:
|