パーティション表や索引の作成は、非パーティション表や索引の作成によく似ていますが、CREATE TABLE
文にパーティション化句を含めて作成します。文に含めるパーティション化句および副次句は、実行するパーティション化のタイプによって異なります。
パーティション化は、LONG
またはLONG RAW
列を含む表を除き、通常の(ヒープ構成)表および索引構成表の両方で実行できます。パーティション表には、非パーティション・グローバル索引、レンジまたはハッシュ・パーティション・グローバル索引、およびローカル索引を作成できます。
パーティション表を作成(または変更)する際には、行移動句(ENABLE ROW MOVEMENT
またはDISABLE ROW MOVEMENT
のいずれか)を指定できます。この句は、キーが更新された場合に、新しいパーティションへの行の移行を有効化または無効化します。デフォルトはDISABLE ROW MOVEMENT
です。
次の項では、様々なタイプのパーティション表および索引に関するパーティション作成の詳細および例を示します。
関連項目:
|
CREATE TABLE
文のPARTITION BY RANGE
句では、表または索引をレンジ・パーティション化することを指定します。PARTITION
句では個々のパーティション・レンジを特定し、PARTITION
句のオプションの副次句では、パーティション・セグメントに固有の物理属性およびその他の属性を指定できます。パーティション・レベルで上書きされない場合、パーティションは基礎となる表の属性を継承します。
例4-1では、1つのパーティションが各四半期の売上に対応する、4つのパーティションの表が作成されます。列sale_year
、sale_month
およびsale_day
がパーティション化列で、それらの列の値が特定の行のパーティション化キーになります。VALUES LESS THAN
句によってパーティション・バウンドが決まります。この句で指定された値の順序リストと比較して、パーティション化キーの値がそれより小さい行がそのパーティションに保存されます。各パーティションには名前が付けられ(sales_q1
、sales_q2
、...)、各パーティションは別の表領域(tsa
、tsb
、...)に格納されます。
例4-1 レンジ・パーティション表の作成
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
に格納されます。
詳細は、「複数列のパーティション化キーの使用」を参照してください。
例4-2では、レンジ・パーティション表用に使用された前述の例がより複雑になっています。記憶域パラメータおよびLOGGING
属性が表レベルで指定されています。これらは、表自体の表領域レベルから継承された対応するデフォルトを置き換え、レンジ・パーティションに継承されます。ただし、第1四半期には取引が少なかったため、パーティションsales_q1_2006
の記憶域属性は小さく設定されています。ENABLE ROW MOVEMENT
句は、キー値に、行を別のパーティションに配置するような更新が行われた場合に、新しいパーティションへの自動的な行の移行を可能にするために指定されています。
例4-2 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;
レンジ・パーティション・グローバル索引を作成する際のルールは、レンジ・パーティション表を作成する際のルールに似ています。例4-3では、前の例で作成された表のsale_month
にレンジ・パーティション・グローバル索引が作成されます。各索引パーティションには名前が付けられていますが、索引のデフォルトの表領域に保存されています。
例4-3 レンジ・パーティション・グローバル索引表の作成
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つのレンジ・パーティションを指定してください。レンジ・パーティション化キーの値は、遷移ポイントと呼ばれるレンジ・パーティションの値の上限を決定します。遷移ポイントを超えるデータのために、データベースによって時間隔パーティションが自動的に作成されます。各時間隔パーティションの下限は、前の範囲つまり時間隔の上限であり、そのパーティションには含まれません。
たとえば、間隔が月単位で遷移点が2010年1月1日の時間隔パーティション表を作成した場合、2010年1月の間隔の下限は2010年1月1日です。2007年7月の間隔の下限は、2010年6月のパーティションがすでに作成されているかどうかに関係なく2010年7月1日です。ただし、パーティションの上限または下限が、格納のために設定されたレンジの外部になるような日付を使用すると、エラーが発生します。たとえば、TO_DATE('9999-12-01', 'YYYY-MM-DD')
では上限が10000-01-01になりますが、10000が法的なレンジの外になる場合は、格納できなくなります。
時間隔パーティション化の場合、パーティション化キーは表の単一の列名にする必要があります。また、NUMBER
型またはDATE
型であることが必要です。オプションのSTORE IN
句を使用して1つ以上の表領域を指定できます。この表領域には、データベースが、後から作成される時間隔パーティションのために、ラウンドロビン・アルゴリズムを使用して時間隔パーティション・データを格納できます。
例4-4では、時間隔の幅が異なる4つの表を指定しています。また、2010年1月1日の遷移ポイントを超えると、パーティションの時間隔が1か月で作成されることも指定しています。
例4-4 時間隔パーティション表の作成
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-2008', 'DD-MM-YYYY')), PARTITION p1 VALUES LESS THAN (TO_DATE('1-1-2009', 'DD-MM-YYYY')), PARTITION p2 VALUES LESS THAN (TO_DATE('1-7-2009', 'DD-MM-YYYY')), PARTITION p3 VALUES LESS THAN (TO_DATE('1-1-2010', 'DD-MM-YYYY')) );
パーティションp3
の上位バウンドは、遷移点を表しています。p3
およびそれより下位のすべてのパーティション(この例ではp0
、p1
およびp2
)はレンジ・セクションにありますが、それをより上位のすべてのパーティションは時間隔セクションに分類されます。
CREATE TABLE
文のPARTITION BY HASH
句では、表のハッシュ・パーティション化を指定しています。PARTITIONS
句は、作成するパーティション数の指定や、オプションで、パーティションを格納する表領域の指定に使用できます。また、PARTITION
句を使用して、個々のパーティションおよびその表領域に名前を付けることも可能です。
ハッシュ・パーティションに指定できる属性はTABLESPACE
のみです。表のすべてのハッシュ・パーティションで、表レベルから継承される同一のセグメント属性(TABLESPACE
を除く)を共有する必要があります。
例4-5は、ハッシュ・パーティション表を作成します。パーティション化列はid
で、4つのパーティションが作成されてシステム生成の名前が割り当てられます。4つのパーティションは、名前の付けられた4つの表領域(gear1
、gear2
など)に配置されます。
例4-5 ハッシュ・パーティション表の作成
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
述語が含まれる問合せでは、ハッシュ・パーティション・グローバル索引を効率的に使用できます。
ハッシュ・パーティション・グローバル索引を作成する構文は、ハッシュ・パーティション表に使用する構文に似ています。たとえば、例4-6の文では、ハッシュ・パーティション・グローバル索引を作成します。
リスト・パーティションを作成するセマンティックは、レンジ・パーティションを作成するためのセマンティックと非常に似ています。ただし、リスト・パーティションを作成するには、CREATE TABLE文にPARTITION BY LIST
句を指定し、PARTITION
句で、パーティションに含まれる行を修飾するパーティション化列の離散値であるリテラル値のリストを指定します。リスト・パーティションの場合、パーティション化キーは表の単一の列名にする必要があります。
リスト・パーティションでのみ使用可能なキーワードDEFAULT
を使用して、パーティションの値リストを説明できます。これにより、その他のパーティションにマッピングされていない行を格納するパーティションが特定されます。
レンジ・パーティションと同様、PARTITION
句のオプションの副次句で、パーティション・セグメントに固有の物理属性およびその他の属性を指定できます。パーティション・レベルで上書きされない場合、パーティションは親表の属性を継承します。
例4-7はリスト・パーティション表を作成します。アメリカの州のグループを含む地域でパーティション化された表q1_sales_by_region
を作成します。
例4-7 リスト・パーティション表の作成
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_southwest
にマッピングされます。
(50, 'systems engineering', 10, 'CA')は表内のいずれのパーティションにもマッピングされず、エラーが発生します。
レンジ・パーティションとは異なり、リスト・パーティションには、パーティション間に明白な順序はありません。また、その他のパーティションにマッピングされていない行がマッピングされる、デフォルトのパーティションを指定できます。前述の例でデフォルトのパーティションを指定した場合、州CAはそのパーティションにマッピングされます。
例4-8では、表sales_by_region
を作成し、リスト・メソッドを使用してパーティション化します。最初の2つのPARTITION
句には、表レベルのデフォルトを上書きする物理属性が指定されています。残りのPARTITION
句には属性は指定されておらず、パーティションは表レベルのデフォルトから物理属性を継承します。デフォルトのパーティションも指定されています。
例4-8 デフォルトのパーティションを使用したリスト・パーティション表の作成
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 8M) 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
句を指定します。この句では参照制約の名前を指定します。この制約がパーティション化参照制約になり、これに基づいて表の参照パーティション化が行われます。参照制約を有効にして強制する必要があります。
その他のパーティション表と同じように、オブジェクト・レベルのデフォルト属性を指定できます。また、オプションで、パーティションごとにオブジェクト・レベルのデフォルトを上書きするパーティション記述子も指定できます。
例4-9は、order_date
でレンジ・パーティション化された親表orders
を作成します。参照パーティションの子表order_items
は、Q1_2005
、Q2_2005
、Q3_2005
およびQ4_2005
の4つのパーティションとともに作成されています。各パーティションには、それぞれの親パーティションの注文に対応するorder_items
行が含まれています。
例4-9 参照パーティション表の作成
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-10の文は、レンジ・ハッシュ・パーティション表を作成します。4つのレンジ・パーティションが作成され、それぞれに8つのサブパーティションが含まれています。サブパーティションには名前が付けられていないため、システム生成の名前が割り当てられていますが、STORE IN
句で指定された4つの表領域(ts1
からts4
)に格納されます。
例4-10 レンジ - ハッシュ・パーティション表の作成
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
句のリスト・サブパーティションの説明は、指定できる唯一の物理属性が表領域(オプション)であることを除き、非コンポジット・リスト・パーティションと同様に記述されます。サブパーティションは、パーティションの説明からその他すべての物理属性を継承します。
例4-11では、レンジ - リスト・パーティション化の使用方法を示します。この例では、製品の販売データを四半期ごとに追跡し、各四半期内で、指定された州ごとにグループ化しています。
例4-11 コンポジット・レンジ - リスト・パーティション表の作成
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
句のレンジ・サブパーティションの記述は、指定できる唯一の物理属性がオプションの表領域であることを除き、非コンポジット・レンジ・パーティションと似ています。サブパーティションは、パーティションの説明からその他すべての物理属性を継承します。
例4-12では、レンジ - レンジ・パーティション化の使用方法を示します。この例では出荷を追跡しています。顧客とのサービス内容合意書には、すべての注文品は、注文が行われてから1か月以内に配送すると記載されています。注文には次のタイプがあります。
e(早期): 注文が行われた次の月の中旬までに配送される注文。これらの注文は、顧客の予想より早く配送されます。
a(合意どおり): 注文が行われてから1か月以内に配送される注文(ただし早期の注文ではありません)。
l(遅延): 注文が行われた後、1か月を過ぎてから配送される注文。
例4-12 コンポジット・レンジ - レンジ・パーティション表の作成
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
句のサブパーティションの説明は、レンジ - *コンポジット・パーティション化に似ています。
リスト - ハッシュ・コンポジット・パーティション化メソッドのサブパーティションの定義の詳細は、「コンポジット・レンジ - ハッシュ・パーティション表の作成」を参照してください。リスト - リスト・コンポジット・パーティション化メソッドのサブパーティションの定義の詳細は、「コンポジット・レンジ - リスト・パーティション表の作成」を参照してください。リスト - レンジ・コンポジット・パーティション化メソッドのサブパーティションの定義の詳細は、「コンポジット・レンジ - レンジ・パーティション表の作成」を参照してください。
後続の項では、各種のリスト - *コンポジット・パーティション化メソッドの例を示します。
例4-13では、リージョンでリスト・パーティション化され、顧客IDによるハッシングを使用してサブパーティション化されたaccounts
表を示します。
例4-13 リスト - ハッシュ・パーティション表の作成
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') );
サブパーティション・テンプレートを使用することで、コンポジット・パーティション表の指定がどのように簡略化されるかの詳細は、「コンポジット・パーティション表を説明するサブパーティション・テンプレートの使用」を参照してください。
例4-14では、リージョンでリスト・パーティション化され、アカウント・ステータスによるリスト化を使用してサブパーティション化されたaccounts
表を示します。
例4-14 コンポジット・リスト - リスト・パーティション表の作成
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') ) );
サブパーティション・テンプレートを使用することで、コンポジット・パーティション表の指定がどのように簡略化されるかの詳細は、「コンポジット・パーティション表を説明するサブパーティション・テンプレートの使用」を参照してください。
例4-15では、リージョンでリスト・パーティション化され、勘定残高によるレンジ化を使用してサブパーティション化されたaccounts
表を示します。行移動が有効化されていることに注意してください。異なるリスト・パーティションのサブパーティションには、別々のレンジを指定できます。
例4-15 コンポジット・レンジ - レンジ・パーティション表の作成
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;
サブパーティション・テンプレートを使用することで、コンポジット・パーティション表の指定がどのように簡略化されるかの詳細は、「コンポジット・パーティション表を説明するサブパーティション・テンプレートの使用」を参照してください。
時間隔 - *コンポジット・パーティション化の概念は、レンジ - *パーティション化に似ています。INTERVAL
定義を含むようにPARTITION BY RANGE
句を拡張します。PARTITION
を使用して少なくとも1つのレンジ・パーティションを指定してください。レンジ・パーティション化キーの値は、遷移ポイントと呼ばれるレンジ・パーティションの値の上限を決定します。遷移ポイントを超えるデータのために、データベースによって時間隔パーティションが自動的に作成されます。
時間隔 - *パーティション表の時間隔のサブパーティションは、データベースによる時間隔の作成時に作成されます。後続のサブパーティションの定義は、サブパーティション・テンプレートでのみ指定できます。サブパーティション・テンプレートの使用方法の詳細は、「コンポジット・パーティション表を説明するサブパーティション・テンプレートの使用」を参照してください。
時間隔 - ハッシュ・パーティション表は、次のいずれかの方法を使用して複数のハッシュ・パーティションとともに作成できます。
PARTITIONS
句に複数のハッシュ・パーティションを指定する。
サブパーティション・テンプレートを使用する。
これらのいずれの方法も使用しない場合、後続の時間隔パーティションにはハッシュ・サブパーティションが1つのみ作成されます。
例4-16では、time_id
により月間隔で時間隔パーティション化され、cust_id
でハッシュ・サブパーティション化されたsales
表を示します。この例では、個々のハッシュ・パーティションに特定の表領域を割り当てずに、複数のハッシュ・パーティションが指定されていることに注意してください。
例4-16 コンポジット時間隔 - ハッシュ・パーティション表の作成
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
サブパーティションのみです。サブパーティション・テンプレートの使用方法の詳細は、「コンポジット・パーティション表を説明するサブパーティション・テンプレートの使用」を参照してください。
例4-17では、time_id
により日間隔で時間隔パーティション化され、channel_id
でリスト・サブパーティション化されたsales
表を示します。
例4-17 コンポジット時間隔 - リスト・パーティション表の作成
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;
後続の時間隔パーティションのレンジ・サブパーティションは、サブパーティション・テンプレートでのみ定義できます。サブパーティション・テンプレートを使用しない場合、各時間隔パーティションに作成されるサブパーティションは上限MAXVALUE
付きのレンジ・サブパーティションのみです。サブパーティション・テンプレートの使用方法の詳細は、「コンポジット・パーティション表を説明するサブパーティション・テンプレートの使用」を参照してください。
例4-18では、time_id
により日次間隔で時間隔パーティション化され、amount_sold
でレンジ・サブパーティション化されたsales
表を示します。
例4-18 コンポジット時間隔 - レンジ・パーティション表の作成
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;
サブパーティション・テンプレートを使用して、コンポジット・パーティション表にサブパーティションを作成できます。サブパーティション・テンプレートを使用すると、表の各パーティションにサブパーティション記述子を指定する必要がないため、サブパーティションの指定を簡略化できます。かわりに、テンプレートに一度のみサブパーティションを記述し、そのサブパーティション・テンプレートを表の各パーティションに適用します。時間隔 - *コンポジット・パーティション表の場合、時間隔パーティションのサブパーティションを定義するには、サブパーティション・テンプレートを使用する必要があります。
サブパーティション・テンプレートは、パーティションにサブパーティション記述子が指定されていない場合に適用されます。サブパーティション記述子が指定されている場合は、そのパーティションのサブパーティション・テンプレートのかわりに適用されます。サブパーティション・テンプレートが指定されておらず、パーティションにもサブパーティション記述子が指定されていない場合は、デフォルトのサブパーティションが1つ作成されます。
レンジ - ハッシュ、時間隔 - ハッシュおよびリスト - ハッシュ・パーティション表の場合、サブパーティション・テンプレートでサブパーティションを詳細に指定することも、ハッシュ・サブパーティションの数のみを指定することも可能です。
例4-19では、サブパーティション・テンプレートを使用して、レンジ - ハッシュ・パーティション表を作成します。
例4-19 サブパーティション・テンプレートを使用したレンジ - ハッシュ・パーティション表の作成
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.
例4-20では、レンジ - リスト・パーティション表について、サブパーティション・テンプレートを使用して表領域間でデータをストライプ化する方法を示します。この例では、表が作成されると、表のサブパーティションは縦にストライプ化されます。つまり、すべてのパーティションのサブパーティションnが同じ表領域にあります。
例4-20 サブパーティション・テンプレートを使用したレンジ - リスト・パーティション表の作成
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
キーです。
複数列のパーティション化キーを評価するとき、データベースが第2の値を使用するのは、第1の値で1つのターゲット・パーティションを一意に特定できない場合のみです。第3の値を使用するのは、第1の値と第2の値で正しいパーティションが判別できない場合のみで、第4以降も同様です。1つの値で正しいパーティションを判別できないのは、パーティション・バウンドがその値とまったく同一であり、次のパーティションに同じ上限が定義されている場合だけです。n番目の列が調査されるのは、複数列キーの(n-1)より前のすべての値が、パーティションの(n-1)の上限に正確に一致する場合のみです。たとえば、第2の列が評価されるのは、最初の列がパーティション・バウンド値と正確に一致する場合のみです。すべての列値がパーティションのすべてのバウンド値に正確に一致する場合、データベースでは、行がこのパーティションには適合しないとみなされ、次のパーティションに適合すると判断されます。
決定性のないバウンド定義(少なくとも1列に対して同一の値が設定された連続するパーティション)の場合、パーティション・バウンド値は、「以下」を表す上限を含む値になります。値の上限が常に「より小さい」であるとみなされる、決定性のあるバウンドとは対照的です。
例4-21では、year
、month
およびday
の別々の3列に実際のDATE
情報が格納されている複数列のレンジ・パーティション表の列評価を示します。パーティション化の粒度は四半期です。評価されるパーティション表は、次のように作成されます。
例4-21 複数列のレンジ・パーティション表の作成
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言語リファレンス』を参照してください。 |
例4-22では、サブパーティション化キーに仮想列を使用して、レンジ - レンジでパーティション化されたsales
表を示します。仮想列では、amount_sold
とquantity_sold
を掛けて販売の合計値が計算されます。
例4-22 サブパーティション化キーに仮想列を使用した表の作成
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;
この例で示されているように、仮想列では行移動もサポートされています。行移動が有効化されている場合、仮想列が別のパーティションに属する値に評価されると、行はあるパーティションから別のパーティションに移行されます。
ヒープ構成パーティション表では、表圧縮を使用してパーティションの一部またはすべてを圧縮できます。表領域、表、または表のパーティションに対して圧縮属性を宣言できます。圧縮属性が指定されていない場合は、その他の記憶域属性と同じように継承されます。
例4-23では、圧縮されたパーティションcosts_old
を含むリスト・パーティション表を作成します。表およびその他すべてのパーティションの圧縮属性は、表領域レベルから継承されます。
例4-23 圧縮されたパーティションを含むリスト・パーティション表の作成
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
とマークされます。
注意: この機能は、Oracle Database 11gリリース2(11.2.0.2)以降で使用可能です。 |
ここでは、セグメントによるパーティション化を使用する場合の機能について説明します。
パーティション表を作成する際に、パーティションに最初の行が挿入されるまでセグメントの作成を遅延させることができます。その後、パーティションに最初の行が挿入されたときに、実表のパーティション、LOB列、すべてのグローバル索引およびローカル索引パーティションのセグメントが作成されます。遅延セグメント作成は、次の方法で制御できます。
初期化パラメータ・ファイルで初期化パラメータDEFERRED_SEGMENT_CREATION
をTRUE
またはFALSE
に設定します。
SQL文ALTER
SESSION
またはALTER
SYSTEM
により、初期化パラメータDEFERRED_SEGMENT_CREATION
をTRUE
またはFALSE
に設定します。
SQL文CREATE
TABLE
を発行する際に、パーティション句でキーワードSEGMENT
CREATION
IMMEDIATE
またはSEGMENT
CREATION
DEFERRED
を指定します。
既存の作成済みパーティションに対するセグメントの作成は、SQL文ALTER
TABLE
... MODIFY
PARTITION
... ALLOCATE
EXTENT
により強制できます。この文により、CREATE
TABLE
時に指定された初期エクステント数より1つ多くエクステントが割り当てられます。
遅延セグメント作成では、シリアル化可能なトランザクションは使用できません。セグメントが作成されていない空の表、またはまだセグメントのない時間隔パーティション表のパーティションにデータを挿入すると、エラーが発生します。
関連項目:
|
DBMS_SPACE_ADMIN.DROP_EMPTY_SEGMENTS
プロシージャにより、表および表フラグメント内の空のセグメントを削除できます。
さらに、パーティションまたサブパーティションにセグメントがある場合は、SQL文ALTER
TABLE
TRUNCATE
PARTITION
でDROP
ALL
STORAGE
句を指定すると、切捨て機能によりセグメントが削除されます。
関連項目:
|
DBMS_SPACE_ADMIN
パッケージでMATERIALIZE_DEFERRED_SEGMENTS
プロシージャを使用して、表のセグメントと表の従属オブジェクトを遅延セグメント・プロパティで作成できます。
DBMS_SPACE_ADMIN.MATERIALIZE_DEFERRED_SEGMENTS
プロシージャを使用すると、作成済の既存の表や表フラグメントで、セグメントを強制的に作成することもできます。MATERIALIZE_DEFERRED_SEGMENTS
プロシージャは、表または表フラグメントにエクステントを1つ追加で割り当てることはしません。この点で、SQL文ALTER
TABLE
... MODIFY
PARTITION
... ALLOCATE
EXTENT
とは異なります。
関連項目:
|
索引構成表では、レンジ、リストまたはハッシュ・パーティション化メソッドを使用できます。パーティション索引構成表を作成する際のセマンティックは、通常の表のセマンティックに似ていますが、次のような違いがあります。
表の作成時に、ORGANIZATION INDEX
句、および必要に応じてINCLUDING
とOVERFLOW
句を指定します。
PARTITION
またはPARTITIONS
句にOVERFLOW
副次句を指定できます。この副次句を使用すると、オーバーフロー・セグメントの属性をパーティション・レベルで指定できます。
OVERFLOW
句を指定すると、オーバーフロー・データ・セグメント自体が主キー索引セグメントと同一レベル・パーティション化されます。このため、オーバーフローを含むパーティション索引構成表では、各パーティションに索引セグメントおよびオーバーフロー・データ・セグメントがあります。
索引構成表では、一連のパーティション化列は主キー列のサブセットである必要があります。索引構成表の行は表の主キー索引に格納されるため、パーティション化の基準は可用性に影響します。主キーのサブセットになるパーティション化キーを選択することにより、挿入操作では単一パーティションの主キーの一意性のみを検証すればよくなるため、パーティションの独立性が保たれます。
索引構成表の2次索引のサポートは、通常の表のサポートに似ています。2次索引の論理的な特性のため、通常の表ではUNUSABLE
とマークされるような特定の操作に、索引構成表のグローバル索引を使用できます。詳細は、 「パーティションのメンテナンス」を参照してください。
関連項目:
|
索引構成表およびその2次索引をレンジ・パーティション化できます。例4-24では、レンジ・パーティション化された索引構成表sales
を作成します。INCLUDING
句は、week_no
の後のすべての列がオーバーフロー・セグメントに格納されるように指定します。各パーティションには1つのオーバーフロー・セグメントがあり、すべて同じ表領域(overflow_here
)に格納されます。オプションで、個々のパーティション・レベルでOVERFLOW TABLESPACE
を指定できます。そうすると、一部またはすべてのオーバーフロー・セグメントが別のTABLESPACE
属性を持つことができます。
例4-24 レンジ・パーティションの索引構成表の作成
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);
索引構成表のパーティション化のその他のオプションは、ハッシュ・メソッドの使用です。例4-25では、ハッシュ・メソッドでsales
索引構成表をパーティション化しています。
例4-25 ハッシュ・パーティションの索引構成表の作成
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
索引構成表をパーティション化しています。例4-26では、シード・データベースのサンプル・スキーマの一部であるexample
表領域が使用されています。通常、異なるパーティションには、別の表領域記憶域を指定します。
例4-26 リスト・パーティションの索引構成表の作成
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
列は、ブロック・サイズが異なる表領域に格納してもかまいません。
パーティション表またはパーティション索引を作成または変更するとき、各エンティティのパーティションとサブパーティションに明示的に指定する表領域は、同じブロック・サイズであることが必要です。表領域記憶域をエンティティに明示的に指定しない場合、データベースがデフォルトで使用する表領域は、同じブロック・サイズである必要があります。そのため、パーティション・オブジェクトの各レベルのデフォルト表領域を把握している必要があります。
説明のために、 ここではコレクション表という語を、(1)XMLType
の表または列内のOrdered Collection Tables、(2)オブジェクトの表または列内のネスト表、という2つのカテゴリに使用します。
XMLType
またはオブジェクトの表と列を使用する際のパーティション化は、パーティション化の基本的なルールに従います。コレクション表をパーティション化するときは、実表のパーティション化方法がOracle Databaseによって使用されます。また、コレクション表は、実表がパーティション化されるときに自動的にパーティション化されます。パーティション化されたネスト表に対するDMLは、参照パーティション表に対する場合と似た方法で動作します。
例4-27の文によって、ネストした表のパーティションが作成されます。
例4-27 ネスト表パーティションの作成
CREATE TABLE print_media_part ( product_id NUMBER(6), ad_id NUMBER(6), ad_composite BLOB, ad_sourcetext CLOB, ad_finaltext CLOB, ad_fltextn NCLOB, ad_textdocs_ntab TEXTDOC_TAB, ad_photo BLOB, ad_graphic BFILE, ad_header ADHEADER_TYP) NESTED TABLE ad_textdocs_ntab STORE AS textdoc_nt PARTITION BY RANGE (product_id) (PARTITION p1 VALUES LESS THAN (100), PARTITION p2 VALUES LESS THAN (200));
パーティション化されたネスト表に対して問合せを発行し、EXPLAIN
PLAN
を使用してパフォーマンスを改善する方法の例は、「コレクション表」を参照してください。
Oracle Databaseで提供されるLOCAL
キーワードを使用して、コレクション表を、パーティション化された実表に対応するように同一レベル・パーティション化します。これはこのリリースでのデフォルトの動作です。以前のリリースのデフォルトでは、コレクション表は、パーティション化された実表に対して同一レベル・パーティション化されませんでした。現在、パーティション化されていないコレクション表をパーティション化された実表と一緒に格納するためには、GLOBAL
キーワードを指定する必要があります。詳細は、『Oracle Database SQL言語リファレンス』を参照してください。また、既存のパーティション化されていないコレクション表をパーティション化されたコレクション表に変換するには、「オンラインでのパーティションの再定義」に示すように、オンライン再定義を使用します。
アウトオブライン(OOL)表のパーティション化がサポートされています。ただし、アウトオブライン表を持つ同じXMLスキーマの表を2つ作成することはできません。つまり、同じスキーマの表を2つ持つことはできないため、OOL表を含むスキーマでは、パーティションの交換は行えません。
パーティションにコレクション表が含まれるかどうかは、パーティションのメンテナンス操作(PMO)の実行にそれほど影響しません。通常、コレクション表のメンテナンス操作は実表に対して行われます。次の例は、前に示したネストした表のパーティションに基づいて、典型的なADD
PARTITION
操作を示します。
ALTER TABLE print_media_part ADD PARTITION p4 VALUES LESS THAN (400) LOB(ad_photo, ad_composite) STORE AS (TABLESPACE omf_ts1) LOB(ad_sourcetext, ad_finaltext) STORE AS (TABLESPACE omf_ts1) NESTED TABLE ad_textdocs_ntab STORE AS nt_p3;
ネストした表の記憶域列ad_textdocs_ntab
の記憶域表はnt_p3
という名前が付けられ、その他すべての属性を表レベルのデフォルトおよび表領域のデフォルトから継承します。
次のパーティション・メンテナンス操作は、コレクション列に対応する記憶域表に対して直接起動する必要があります。
パーティションの変更
パーティションの移動
パーティション名の変更
パーティションのデフォルト属性の変更
関連項目: 構文は『Oracle Database SQL言語リファレンス』 を参照してください。また、パーティション表およびコンポジット・パーティション表に対して実行できるパーティション・メンテナンス操作のリストは、表4-1「表パーティションに対するALTER TABLEメンテナンス操作」を参照してください。 |