4.1 表および索引を作成する場合のパーティション化の指定
パーティション表または索引の作成は、非パーティション表または索引の作成と非常に似ています。
パーティション表または索引を作成する場合は、CREATE TABLE
文にパーティション化句を含めます。文に含めるパーティション化句および副次句は、実行するパーティション化のタイプによって異なります。
パーティション化は、LONG
またはLONG RAW
列を含む表を除き、通常の(ヒープ構成)表および索引構成表の両方で実行できます。パーティション表には、非パーティション・グローバル索引、レンジまたはハッシュ・パーティション・グローバル索引、およびローカル索引を作成できます。
パーティション表を作成(または変更)する際には、行移動句(ENABLE ROW MOVEMENT
またはDISABLE ROW MOVEMENT
のいずれか)を指定できます。この句は、キーが更新された場合に、新しいパーティションへの行の移行を有効化または無効化します。デフォルトはDISABLE ROW MOVEMENT
です。
単一レベル・パーティション表の1024K-1パーティションまたはコンポジット・パーティション表のサブパーティションの合計まで指定できます。
自動リスト・コンポジット・パーティション表および時間隔サブパーティションを作成することで、領域を節約できます。これは、これらの方法では、データが存在する場合のみサブパーティションが作成されるためです。要求に応じて新しいパーティションを作成する場合にサブパーティション・セグメントの作成を延期することにより、最初の一致行が挿入されるときのみサブパーティション・セグメントが作成されるようになります。
次のトピックでは、様々なタイプのパーティション表および索引に関するパーティション作成の詳細および例を示します。
関連項目:
-
パーティション表や索引を作成および変更するためのパーティション化句の正確な構文、その使用に関する制限、および表の作成や変更に必要な特定の権限の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
-
LOB
またはLOB
として保存されているその他のオブジェクトがある列を含むパーティション表の作成に固有の情報は、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』を参照してください -
オブジェクト・タイプ、ネストした表またはVARRAYを含む表の作成に固有の情報は、『Oracle Databaseオブジェクト・リレーショナル開発者ガイド』を参照してください。
4.1.1 レンジ・パーティション表およびグローバル索引の作成について
CREATE TABLE
文のPARTITION BY RANGE
句では、表または索引をレンジ・パーティション化することを指定します。
PARTITION
句では個々のパーティション・レンジを特定し、PARTITION
句のオプションの副次句では、パーティション・セグメントに固有の物理属性およびその他の属性を指定できます。パーティション・レベルで上書きされない場合、パーティションは基礎となる表の属性を継承します。
次の内容について説明します。
4.1.1.1 レンジ・パーティション表の作成
レンジ・パーティション表を作成するには、CREATE TABLE
文のPARTITION BY RANGE
句を使用します。
例4-1では、1つのパーティションが各四半期の売上に対応する、4つのパーティションの表が作成されます。time_id
はパーティション化列で、その値は特定の行のパーティション化キーを含みます。VALUES LESS THAN
句によってパーティション・バウンドが決まります。この句で指定された値の順序リストと比較して、パーティション化キーの値がそれより小さい行がそのパーティションに保存されます。各パーティションには名前が付けられ(sales_q1_2006
、sales_q2_2006
、sales_q3_2006
、sales_q4_2006
)、各パーティションは別の表領域(tsa
、tsb
、tsc
、tsd
)に格納されます。time_id=17-MAR-2006
を含む行は、パーティションsales_q1_2006
に格納されます。
Live SQL:
関連する例をOracle Live SQLのOracle Live SQL: レンジ・パーティション表の作成で参照して実行してください。
例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 );
4.1.1.2 より複雑なレンジ・パーティション表の作成
属性および記憶域パラメータにより、より複雑なレンジ・パーティション表を作成できます。
例4-2では、記憶域パラメータおよびLOGGING
属性が表レベルで指定されています。これらは、表自体の表領域レベルから継承された対応するデフォルトを置き換え、レンジ・パーティションに継承されます。ただし、第1四半期には取引が少なかったため、パーティションsales_q1_2006
の記憶域属性は小さく設定されています。ENABLE ROW MOVEMENT
句は、キー値に、行を別のパーティションに配置するような更新が行われた場合に、新しいパーティションへの自動的な行の移行を可能にするために指定されています。
例4-2 LOGGINGおよび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.1.1.3 レンジ・パーティション・グローバル索引の作成
レンジ・パーティション・グローバル索引を作成する際のルールは、レンジ・パーティション表を作成する際のルールに似ています。
例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グローバリゼーション・サポート・ガイド』を参照してください
4.1.2 レンジ時間隔パーティション表の作成
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が法的なレンジの外になる場合は、格納できなくなります。
オプションのSTORE IN
句を使用して1つ以上の表領域を指定できます。この表領域には、データベースが、後から作成される時間隔パーティションのために、ラウンドロビン・アルゴリズムを使用して時間隔パーティション・データを格納できます。
時間隔パーティション化では、1つのパーティション化キー列のみを指定でき、そのデータ型は制限されています。
次の例では、時間隔の幅が異なる4つの表を指定しています。また、2010年1月1日の遷移ポイントを超えると、パーティションの時間隔が1か月で作成されることも指定しています。パーティションp3
の上位バウンドは、遷移点を表しています。p3
およびそれより下位のすべてのパーティション(この例ではp0
、p1
およびp2
)はレンジ・セクションにありますが、それをより上位のすべてのパーティションは時間隔セクションに分類されます。
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')) );
関連項目:
パーティション化キーの制限、パーティション表や索引を作成および変更するためのパーティション化句の正確な構文、その使用に関する制限、および表の作成や変更に必要な特定の権限の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
4.1.3 ハッシュ・パーティション表およびグローバル索引の作成について
CREATE TABLE
文のPARTITION BY HASH
句では、表のハッシュ・パーティション化を指定しています。
PARTITIONS
句は、作成するパーティション数の指定や、オプションで、パーティションを格納する表領域の指定に使用できます。また、PARTITION
句を使用して、個々のパーティションおよびその表領域に名前を付けることも可能です。
ハッシュ・パーティションに指定できる属性はTABLESPACE
のみです。表のすべてのハッシュ・パーティションで、表レベルから継承される同一のセグメント属性(TABLESPACE
を除く)を共有する必要があります。
次の内容について説明します。
4.1.3.1 ハッシュ・パーティション表の作成
このトピックの例は、ハッシュ・パーティション表の作成方法を示します。
パーティション化列はid
で、4つのパーティションが作成されてシステム生成の名前が割り当てられます。4つのパーティションは、名前の付けられた4つの表領域(gear1
、gear2
、gear3
、gear4
)に配置されます。
CREATE TABLE scubagear (id NUMBER, name VARCHAR2 (60)) PARTITION BY HASH (id) PARTITIONS 4 STORE IN (gear1, gear2, gear3, gear4);
次の例では、ハッシュ・パーティション表を作成する場合のパーティション数が指定されていますが、システム生成の名前が割り当てられ、表のデフォルトの表領域に格納されます。
CREATE TABLE departments_hash (department_id NUMBER(4) NOT NULL, department_name VARCHAR2(30)) PARTITION BY HASH(department_id) PARTITIONS 16;
次の例では、個々のパーティション名、およびそれらのパーティションを配置する表領域が指定されています。各ハッシュ・パーティション(セグメント)の初期エクステント・サイズも表レベルで明示的に指定されており、すべてのパーティションでこの属性が継承されます。
CREATE TABLE departments_hash (department_id NUMBER(4) NOT NULL, department_name VARCHAR2(30)) STORAGE (INITIAL 10K) PARTITION BY HASH(department_id) (PARTITION p1 TABLESPACE ts1, PARTITION p2 TABLESPACE ts2, PARTITION p3 TABLESPACE ts1, PARTITION p4 TABLESPACE ts3);
この表にローカル索引を作成すると、データベースにより、基礎となる表と同一レベル・パーティション化されるように索引が作成されます。また、基礎となる表でメンテナンス操作が実行された場合には、データベースにより自動的に索引がメンテナンスされます。次に、表にローカル索引を作成する例を示します。
CREATE INDEX loc_dept_ix ON departments_hash(department_id) LOCAL;
オプションで、ハッシュ・パーティションおよびローカル索引パーティションが格納される表領域に名前を付けることができますが、そうしない場合、データベースでは対応する基礎となるパーティションの名前が索引パーティション名として使用され、索引パーティションは表パーティションと同じ表領域に格納されます。
関連項目:
キー列のパーティション化の詳細は、「キー列に対するパーティション化の指定」を参照してください
4.1.3.2 ハッシュ・パーティション・グローバル索引の作成
ハッシュ・パーティション・グローバル索引を使用すると、マルチ・ユーザーのOLTP環境において、索引内の少数のリーフ・ブロックの競合率が高い索引のパフォーマンスが向上します。
ハッシュ・パーティション・グローバル索引でも、増加し続ける列値における索引の誤差の影響を限定できます。索引パーティション化キーに等価およびIN
述語が含まれる問合せでは、ハッシュ・パーティション・グローバル索引を効率的に使用できます。
ハッシュ・パーティション・グローバル索引を作成する構文は、ハッシュ・パーティション表に使用する構文に似ています。たとえば、例4-4の文では、ハッシュ・パーティション・グローバル索引を作成します。
例4-4 ハッシュ・パーティション・グローバル索引の作成
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);
4.1.4 リスト・パーティション表の作成について
リスト・パーティションを作成するセマンティックは、レンジ・パーティションを作成するためのセマンティックと非常に似ています。
ただし、リスト・パーティションを作成するには、CREATE TABLE
文にPARTITION BY LIST
句を指定し、PARTITION
句で、パーティションに含まれる行を修飾するパーティション化列の離散値であるリテラル値のリストを指定します。リスト・パーティション化の場合、パーティション化キーは表の1つ以上の列名にすることができます。
リスト・パーティションでのみ使用可能なキーワードDEFAULT
を使用して、パーティションの値リストを説明できます。これにより、その他のパーティションにマッピングされていない行を格納するパーティションが特定されます。
レンジ・パーティションと同様、PARTITION
句のオプションの副次句で、パーティション・セグメントに固有の物理属性およびその他の属性を指定できます。パーティション・レベルで上書きされない場合、パーティションは親表の属性を継承します。
次の内容について説明します。
4.1.4.1 リスト・パーティション表の作成
このトピックの例は、リスト・パーティション表の作成方法を示します。
例4-5では、アメリカの州のグループを含む地域でパーティション化された表q1_sales_by_region
が作成されます。行のパーティション化列の値が、パーティションを説明する値リストの値に一致するかどうかを確認して、行がパーティションにマッピングされます。たとえば、次のリストは、いくつかのサンプル行の表への挿入を示します。
-
(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')は表内のいずれのパーティションにもマッピングされず、エラーが発生します。
Live SQL:
関連する例をOracle Live SQLのOracle Live SQL: リスト・パーティション表の作成で参照して実行してください。
例4-5 リスト・パーティション表の作成
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'));
4.1.4.2 デフォルトのパーティションを使用したリスト・パーティション表の作成
レンジ・パーティションとは異なり、リスト・パーティションには、パーティション間に明白な順序はありません。
また、その他のパーティションにマッピングされていない行がマッピングされる、デフォルトのパーティションを指定できます。前述の例でデフォルトのパーティションを指定した場合、州CAはそのパーティションにマッピングされます。
例4-6では、表sales_by_region
を作成し、リスト・メソッドを使用してパーティション化します。最初の2つのPARTITION
句には、表レベルのデフォルトを上書きする物理属性が指定されています。残りのPARTITION
句には属性は指定されておらず、パーティションは表レベルのデフォルトから物理属性を継承します。デフォルトのパーティションも指定されています。
例4-6 デフォルトのパーティションを使用したリスト・パーティション表の作成
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) );
4.1.4.3 自動リスト・パーティション表の作成
自動リスト・パーティション化メソッドを使用すると、要求に応じてリスト・パーティションを作成できます。
自動リスト・パーティション表は、このパーティション表がより管理しやすいという点を除いて、通常のリスト・パーティション表に似ています。自動リスト・パーティション表は、既知のパーティション化キー値のみを使用して作成できます。データはこの表にロードされるため、ロードされたパーティション化キー値が既存のパーティションのいずれにも対応しない場合は、データベースで新しいパーティションが自動的に作成されます。パーティションは要求に応じて自動的に作成されるため、自動リスト・パーティション化メソッドは、既存の間隔パーティション化メソッドと概念的に似ています。
値が頻繁に変わるデータ型での自動リスト・パーティション化は、データを調整できる場合を除いて、このメソッドには不向きです。たとえば、日付値を含むSALES_DATE
フィールドは、フォーマットが削除されない場合、毎秒増加します。各SALES_DATE
値(05-22-2016 08:00:00
、05-22-2016 08:00:01
など)は、独自のパーティションを生成します。膨大な数のパーティションの作成を避けるには、入力されるデータに注意し、適宜調整する必要があります。たとえば、必要なパーティションの数に応じて、SALES_DATE
の日付値を日または他の特定の時間に切り捨てることができます。
CREATE
およびALTER
TABLE
SQL文は、AUTOMATIC
またはMANUAL
リスト・パーティション化を指定する追加の句を使用して更新されます。自動リスト・パーティション表の作成時には、少なくとも1つのパーティションが必要です。新規および不明のパーティション・キー値に対して新しいパーティションが自動的に作成されるため、自動リスト・パーティションはDEFAULT
パーティションを持つことができません。
*_PART_TABLES
ビューのAUTOLIST
列を確認して、表が自動リスト・パーティションであるかどうかを判断できます。
Live SQL:
Oracle Live SQLのOracle Live SQL: 自動リスト・パーティション表の作成で関連する例を参照して実行してください。
例4-7は、sales_state
フィールドで自動リスト・パーティション化のAUTOMATIC
キーワードを使用するCREATE
TABLE
文の例です。CREATE TABLE SQL文により、必要に応じて少なくとも1つのパーティションが作成されます。追加の行が挿入されると、新しいsales_state
値が追加されるとパーティションの数が増加します。
例4-7 自動リスト・パーティション表の作成
CREATE TABLE sales_auto_list ( salesman_id NUMBER(5) NOT NULL, salesman_name VARCHAR2(30), sales_state VARCHAR2(20) NOT NULL, sales_amount NUMBER(10), sales_date DATE NOT NULL ) PARTITION BY LIST (sales_state) AUTOMATIC (PARTITION P_CAL VALUES ('CALIFORNIA') ); SELECT TABLE_NAME, PARTITIONING_TYPE, AUTOLIST, PARTITION_COUNT FROM USER_PART_TABLES WHERE TABLE_NAME ='SALES_AUTO_LIST'; TABLE_NAME PARTITIONING_TYPE AUTOLIST PARTITION_COUNT ---------------- ----------------- -------- --------------- SALES_AUTO_LIST LIST YES 1 SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE FROM USER_TAB_PARTITIONS WHERE TABLE_NAME ='SALES_AUTO_LIST'; TABLE_NAME PARTITION_NAME HIGH_VALUE –--------------- –-------------- –--------------- SALES_AUTO_LIST P_CAL 'CALIFORNIA' INSERT INTO SALES_AUTO_LIST VALUES(021, 'Mary Smith', 'FLORIDA', 41000, TO_DATE ('21-DEC-2018','DD-MON-YYYY')); 1 row inserted. INSERT INTO SALES_AUTO_LIST VALUES(032, 'Luis Vargas', 'MICHIGAN', 42000, TO_DATE ('31-DEC-2018','DD-MON-YYYY')); 1 row inserted. SELECT TABLE_NAME, PARTITIONING_TYPE, AUTOLIST, PARTITION_COUNT FROM USER_PART_TABLES WHERE TABLE_NAME ='SALES_AUTO_LIST'; TABLE_NAME PARTITIONING_TYPE AUTOLIST PARTITION_COUNT ---------------- ----------------- -------- --------------- SALES_AUTO_LIST LIST YES 3 INSERT INTO SALES_AUTO_LIST VALUES(015, 'Simone Blair', 'CALIFORNIA', 45000, TO_DATE ('11-JAN-2019','DD-MON-YYYY')); 1 row inserted. INSERT INTO SALES_AUTO_LIST VALUES(015, 'Simone Blair', 'OREGON', 38000, TO_DATE ('18-JAN-2019','DD-MON-YYYY')); 1 row inserted. SELECT TABLE_NAME, PARTITIONING_TYPE, AUTOLIST,PARTITION_COUNT FROM USER_PART_TABLES WHERE TABLE_NAME ='SALES_AUTO_LIST'; TABLE_NAME PARTITIONING_TYPE AUTOLIST PARTITION_COUNT ---------------- ----------------- -------- --------------- SALES_AUTO_LIST LIST YES 4 SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE FROM USER_TAB_PARTITIONS WHERE TABLE_NAME ='SALES_AUTO_LIST'; TABLE_NAME PARTITION_NAME HIGH_VALUE –--------------- –-------------- –--------------- SALES_AUTO_LIST P_CAL 'CALIFORNIA' SALES_AUTO_LIST SYS_P478 'FLORIDA' SALES_AUTO_LIST SYS_P479 'MICHIGAN' SALES_AUTO_LIST SYS_P480 'OREGON'
関連項目:
*_PART_TABLES
ビューの詳細は、Oracle Databaseリファレンスを参照してください
4.1.4.4 複数列リスト・パーティション表の作成
複数列リスト・パーティション化では、複数列のリスト値に基づいて表をパーティション化できます。
単一列リスト・パーティション化と同様に、各パーティションには、値のリストを含むセットを含めることができます。
複数列リスト・パーティション化は、表の複数列でPARTITION
BY
LIST
句を使用する表でサポートされます。例:
PARTITION BY LIST (column1,column2)
複数列リスト・パーティション表に含めることができるのは、1つのDEFAULT
パーティションのみです。
Live SQL:
Oracle Live SQLのOracle Live SQL: 複数列リスト・パーティション表の作成で関連する例を参照して実行してください。
次に、state
およびchannel
列で複数列パーティション化を使用するCREATE TABLE
文の例を示します。
例4-8 複数列リスト・パーティション表の作成
CREATE TABLE sales_by_region_and_channel (dept_number NUMBER NOT NULL, dept_name VARCHAR2(20), quarterly_sales NUMBER(10,2), state VARCHAR2(2), channel VARCHAR2(1) ) PARTITION BY LIST (state, channel) ( PARTITION yearly_west_direct VALUES (('OR','D'),('UT','D'),('WA','D')), PARTITION yearly_west_indirect VALUES (('OR','I'),('UT','I'),('WA','I')), PARTITION yearly_south_direct VALUES (('AZ','D'),('TX','D'),('GA','D')), PARTITION yearly_south_indirect VALUES (('AZ','I'),('TX','I'),('GA','I')), PARTITION yearly_east_direct VALUES (('PA','D'), ('NC','D'), ('MA','D')), PARTITION yearly_east_indirect VALUES (('PA','I'), ('NC','I'), ('MA','I')), PARTITION yearly_north_direct VALUES (('MN','D'),('WI','D'),('MI','D')), PARTITION yearly_north_indirect VALUES (('MN','I'),('WI','I'),('MI','I')), PARTITION yearly_ny_direct VALUES ('NY','D'), PARTITION yearly_ny_indirect VALUES ('NY','I'), PARTITION yearly_ca_direct VALUES ('CA','D'), PARTITION yearly_ca_indirect VALUES ('CA','I'), PARTITION rest VALUES (DEFAULT) ); SELECT PARTITION_NAME, HIGH_VALUE FROM USER_TAB_PARTITIONS WHERE TABLE_NAME ='SALES_BY_REGION_AND_CHANNEL'; PARTITION_NAME HIGH_VALUE --------------------- ------------------------------------------- REST DEFAULT YEARLY_CA_DIRECT ( 'CA', 'D' ) YEARLY_CA_INDIRECT ( 'CA', 'I' ) YEARLY_EAST_DIRECT ( 'PA', 'D' ), ( 'NC', 'D' ), ( 'MA', 'D' ) YEARLY_EAST_INDIRECT ( 'PA', 'I' ), ( 'NC', 'I' ), ( 'MA', 'I' ) YEARLY_NORTH_DIRECT ( 'MN', 'D' ), ( 'WI', 'D' ), ( 'MI', 'D' ) YEARLY_NORTH_INDIRECT ( 'MN', 'I' ), ( 'WI', 'I' ), ( 'MI', 'I' ) YEARLY_NY_DIRECT ( 'NY', 'D' ) YEARLY_NY_INDIRECT ( 'NY', 'I' ) YEARLY_SOUTH_DIRECT ( 'AZ', 'D' ), ( 'TX', 'D' ), ( 'GA', 'D' ) YEARLY_SOUTH_INDIRECT ( 'AZ', 'I' ), ( 'TX', 'I' ), ( 'GA', 'I' ) YEARLY_WEST_DIRECT ( 'OR', 'D' ), ( 'UT', 'D' ), ( 'WA', 'D' ) YEARLY_WEST_INDIRECT ( 'OR', 'I' ), ( 'UT', 'I' ), ( 'WA', 'I' ) 13 rows selected. INSERT INTO SALES_BY_REGION_AND_CHANNEL VALUES (005, 'AUTO DIRECT', 701000, 'OR', 'D' ); INSERT INTO SALES_BY_REGION_AND_CHANNEL VALUES (006, 'AUTO INDIRECT', 1201000, 'OR', 'I' ); INSERT INTO SALES_BY_REGION_AND_CHANNEL VALUES (005, 'AUTO DIRECT', 625000, 'WA', 'D' ); INSERT INTO SALES_BY_REGION_AND_CHANNEL VALUES (006, 'AUTO INDIRECT', 945000, 'WA', 'I' ); INSERT INTO SALES_BY_REGION_AND_CHANNEL VALUES (005, 'AUTO DIRECT', 595000, 'UT', 'D' ); INSERT INTO SALES_BY_REGION_AND_CHANNEL VALUES (006, 'AUTO INDIRECT', 825000, 'UT', 'I' ); INSERT INTO SALES_BY_REGION_AND_CHANNEL VALUES (003, 'AUTO DIRECT', 1950000, 'CA', 'D' ); INSERT INTO SALES_BY_REGION_AND_CHANNEL VALUES (004, 'AUTO INDIRECT', 5725000, 'CA', 'I' ); INSERT INTO SALES_BY_REGION_AND_CHANNEL VALUES (010, 'AUTO DIRECT', 925000, 'IL', 'D' ); INSERT INTO SALES_BY_REGION_AND_CHANNEL VALUES (010, 'AUTO INDIRECT', 3250000, 'IL', 'I' ); SELECT DEPT_NUMBER, DEPT_NAME, QUARTERLY_SALES, STATE, CHANNEL FROM SALES_BY_REGION_AND_CHANNEL PARTITION(yearly_west_direct); DEPT_NUMBER DEPT_NAME QUARTERLY_SALES ST C ----------- -------------------- --------------- -- - 5 AUTO DIRECT 701000 OR D 5 AUTO DIRECT 625000 WA D 5 AUTO DIRECT 595000 UT D SELECT DEPT_NUMBER, DEPT_NAME, QUARTERLY_SALES, STATE, CHANNEL FROM SALES_BY_REGION_AND_CHANNEL PARTITION(yearly_west_indirect); DEPT_NUMBER DEPT_NAME QUARTERLY_SALES ST C ----------- -------------------- --------------- -- - 6 AUTO INDIRECT 1201000 OR I 6 AUTO INDIRECT 945000 WA I 6 AUTO INDIRECT 825000 UT I SELECT DEPT_NUMBER, DEPT_NAME, QUARTERLY_SALES, STATE, CHANNEL FROM SALES_BY_REGION_AND_CHANNEL PARTITION(yearly_ca_direct); DEPT_NUMBER DEPT_NAME QUARTERLY_SALES ST C ----------- -------------------- --------------- -- - 3 AUTO DIRECT 1950000 CA D SELECT DEPT_NUMBER, DEPT_NAME, QUARTERLY_SALES, STATE, CHANNEL FROM SALES_BY_REGION_AND_CHANNEL PARTITION(yearly_ca_indirect); DEPT_NUMBER DEPT_NAME QUARTERLY_SALES ST C ----------- -------------------- --------------- -- - 4 AUTO INDIRECT 5725000 CA I SELECT DEPT_NUMBER, DEPT_NAME, QUARTERLY_SALES, STATE, CHANNEL FROM SALES_BY_REGION_AND_CHANNEL PARTITION(rest); DEPT_NUMBER DEPT_NAME QUARTERLY_SALES ST C ----------- -------------------- --------------- -- - 10 AUTO DIRECT 925000 IL D 10 AUTO INDIRECT 3250000 IL I
4.1.5 参照パーティション表の作成
参照パーティション表を作成するには、CREATE TABLE
文にPARTITION BY REFERENCE
句を指定します。
PARTITION BY REFERENCE
句では参照制約の名前を指定します。この制約がパーティション化参照制約になり、これに基づいて表の参照パーティション化が行われます。参照制約を有効にして強制する必要があります。
その他のパーティション表と同じように、オブジェクト・レベルのデフォルト属性を指定できます。また、オプションで、パーティションごとにオブジェクト・レベルのデフォルトを上書きするパーティション記述子も指定できます。
例4-9は、order_date
でレンジ・パーティション化された親表orders
を作成します。参照パーティションの子表order_items
は、Q1_2005
、Q2_2005
、Q3_2005
およびQ4_2005
の4つのパーティションとともに作成されています。各パーティションには、それぞれの親パーティションの注文に対応するorder_items
行が含まれています。
パーティション記述子を指定する場合、指定するパーティション数は、参照表のパーティションまたはサブパーティションの数と正確に一致する必要があります。親表がコンポジット・パーティション表の場合、表は、親の各サブパーティションに対して1つのパーティションを含みます。それ以外の場合、親の各パーティションに対して1つのパーティションを含みます。
参照パーティション表のパーティションには、パーティション・バウンドを指定できません。
参照パーティション表のパーティションには名前を付けることができます。パーティションに明示的に名前が付けられていない場合は、親表の対応するパーティションの名前が既存の明示的に付けられた名前と競合しないかぎり、その名前が継承されます。この場合、パーティションにはシステム生成の名前が使用されます。
参照パーティション表のパーティションに明示的に表領域が指定されていない場合、参照パーティション表のパーティションは、親表の対応するパーティションと連結されます。
例4-9 参照パーティション表の作成
CREATE TABLE orders ( order_id NUMBER(12), order_date DATE, 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);
4.1.6 時間隔 - 参照パーティション表の作成
時間隔パーティション表を参照パーティション化の親表として使用できます。レコードを参照パーティション表に挿入すると、親表の時間隔パーティションに対応する参照パーティション表のパーティションが作成されます。
子表に時間隔パーティションを作成すると、パーティション名が関連付けられている親表フラグメントから継承されます。子表に表レベルのデフォルトの表領域がある場合、新しい時間隔パーティションの表領域として使用され、それ以外の場合は表領域が親表フラグメントから継承されます。
SQL ALTER
TABLE
SET
INTERVAL
文は参照パーティション表に使用できませんが、参照パーティションの子を持つ表で実行できます。特に、ALTER
TABLE
SET
INTERVAL
は、ターゲット表から時間隔プロパティを削除して、時間隔 - 参照の子を通常の参照パーティション表に変換します。SQL ALTER
TABLE
SET
STORE
IN
文も参照パーティション表に使用できませんが、参照パーティションの子を持つ表で実行できます。
時間隔パーティションのALTER
TABLE
SPLIT
PARTITION
など、親表の時間隔パーティションを従来のパーティションに変換する操作は、子表に対応する変換を作成し、必要に応じて子表にパーティションを作成します。
たとえば、次のSQL文では、親表に3つの時間隔パーティションを指定し、子表には何も指定していません。
CREATE TABLE par(pk INT CONSTRAINT par_pk PRIMARY KEY, i INT) PARTITION BY RANGE(i) INTERVAL (10) (PARTITION p1 VALUES LESS THAN (10)); CREATE TABLE chi(fk INT NOT NULL, i INT, CONSTRAINT chi_fk FOREIGN KEY(fk) REFERENCES par(pk)) PARTITION BY REFERENCE(chi_fk); INSERT INTO par VALUES(15, 15); INSERT INTO par VALUES(25, 25); INSERT INTO par VALUES(35, 35);
USER_TAB_PARTITIONS
ビューを使用して、パーティションの情報を表示できます。
SELECT table_name, partition_position, high_value, interval FROM USER_TAB_PARTITIONS WHERE table_name IN ('PAR', 'CHI') ORDER BY 1, 2; TABLE_NAME PARTITION_POSITION HIGH_VALUE INT ---------------- ------------------ ---------- --- CHI 1 NO PAR 1 10 NO PAR 2 20 YES PAR 3 30 YES PAR 4 40 YES
時間隔パーティションが親表で分割される場合、階層のすべての表に対して一部の時間隔パーティションが従来のパーティションに変換され、処理中に子表に従来のパーティションを作成します。例:
ALTER TABLE par SPLIT PARTITION FOR (25) AT (25) INTO (partition x, partition y); SELECT table_name, partition_position, high_value, interval FROM USER_TAB_PARTITIONS WHERE table_name IN ('PAR', 'CHI') ORDER BY 1, 2; TABLE_NAME PARTITION_POSITION HIGH_VALUE INT ---------------- ------------------ ---------- --- CHI 1 NO CHI 2 NO CHI 3 NO CHI 4 NO PAR 1 10 NO PAR 2 20 NO PAR 3 25 NO PAR 4 30 NO PAR 5 40 YES
時間隔 - 参照機能は、データベース互換性レベル(Oracle Database COMPATIBLE
初期化パラメータ設定)を12.0.0.0
以上に設定する必要があります。
4.1.7 インメモリー列ストアとパーティション化を使用した表の作成
INMEMORY
句によりインメモリー列ストアを使用してパーティション表を作成できます。
次の例では、各パーティションがINMEMORY
句とCREATE
TABLE
SQL文のパーティショニング句を使用してインメモリー列ストアにロードされることを示しています。
CREATE TABLE list_customers ( customer_id NUMBER(6) , cust_first_name VARCHAR2(20) , cust_last_name VARCHAR2(20) , cust_address CUST_ADDRESS_TYP , nls_territory VARCHAR2(30) , cust_email VARCHAR2(40)) PARTITION BY LIST (nls_territory) ( PARTITION asia VALUES ('CHINA', 'THAILAND') INMEMORY MEMCOMPRESS FOR CAPACITY HIGH, PARTITION europe VALUES ('GERMANY', 'ITALY', 'SWITZERLAND') INMEMORY MEMCOMPRESS FOR CAPACITY LOW, PARTITION west VALUES ('AMERICA') INMEMORY MEMCOMPRESS FOR CAPACITY LOW, PARTITION east VALUES ('INDIA') INMEMORY MEMCOMPRESS FOR CAPACITY HIGH, PARTITION rest VALUES (DEFAULT);
関連項目:
-
インメモリー列ストアの概要は、『Oracle Database In-Memoryガイド』を参照してください
- インメモリー列ストアおよびADOのサポートにおける、移入のためのオブジェクトの有効化の詳細は、『Oracle Database In-Memoryガイド』を参照してください
-
インメモリー列ストアに関連するSQL構文については、『Oracle Database SQL言語リファレンス』を参照してください
4.1.8 読取り専用パーティションまたはサブパーティションを含む表の作成
表、パーティションおよびサブパーティションを読取り専用ステータスに設定し、ユーザーまたはトリガーによる意図しないDML操作からデータを保護できます。
読取り専用に設定されているパーティションまたはサブパーティションのデータを更新しようとするとエラーが発生しますが、読取り/書込みに設定されているパーティションまたはサブパーティションのデータの更新は成功します。
CREATE
TABLE
およびALTER
TABLE
SQL文は、パーティションおよびサブパーティションに読取り専用句を指定します。読取り専用句の値は、READ
ONLY
またはREAD
WRITE
です。READ
WRITE
がデフォルト値です。読取り専用句がパーティションまたはサブパーティションに明示的に設定されていない場合は、読取り専用句の高レベルの設定がパーティションおよびサブパーティションに適用されます。
次に、読取り専用ステータスおよび読取り/書込みステータスのコンポジット・レンジ - リスト・パーティション表の作成例を示します。orders_read_write_only
はREAD
WRITE
として明示的に指定されているため、表のデフォルト属性は読取り/書込みです。パーティションorder_p1
のデフォルト属性は読取り専用として指定されているため、サブパーティションord_p1_northwest
およびorder_p1_southwest
は、パーティションorder_p1
から読取り専用ステータスを継承します。サブパーティションord_p2_southwest
およびorder_p3_northwest
は読取り専用として明示的に指定されているため、デフォルトの読取り/書込みステータスが上書きされます。
例4-10 読取り専用および読取り/書込みパーティションを含む表の作成
CREATE TABLE orders_read_write_only ( order_id NUMBER (12), order_date DATE CONSTRAINT order_date_nn NOT NULL, state VARCHAR2(2) ) READ WRITE PARTITION BY RANGE (order_date) SUBPARTITION BY LIST (state) ( PARTITION order_p1 VALUES LESS THAN (TO_DATE ('01-DEC-2015','DD-MON-YYYY')) READ ONLY ( SUBPARTITION order_p1_northwest VALUES ('OR', 'WA'), SUBPARTITION order_p1_southwest VALUES ('AZ', 'UT', 'NM') ), PARTITION order_p2 VALUES LESS THAN (TO_DATE ('01-MAR-2016','DD-MON-YYYY')) ( SUBPARTITION order_p2_northwest VALUES ('OR', 'WA'), SUBPARTITION order_p2_southwest VALUES ('AZ', 'UT', 'NM') READ ONLY ), PARTITION order_p3 VALUES LESS THAN (TO_DATE ('01-JUL-2016','DD-MON-YYYY')) ( SUBPARTITION order_p3_northwest VALUES ('OR', 'WA') READ ONLY, SUBPARTITION order_p3_southwest VALUES ('AZ', 'UT', 'NM') ) );
読取り専用ステータスは、*_PART_TABLES
ビューのDEF_READ_ONLY
列、*_TAB_PARTITIONS
ビューのREAD_ONLY
列、および*_TAB_SUBPARTITIONS
ビューのREAD_ONLY
列を使用して確認できます。物理セグメント(単一レベル・パーティション化のパーティションおよびコンポジット・パーティション化のサブパーティション)にのみ、ステータスがあることに注意してください。その他のすべてのレベルは論理的で、デフォルト・ステータスのみになります。
SQL> SELECT PARTITION_NAME, READ_ONLY FROM USER_TAB_PARTITIONS WHERE TABLE_NAME ='ORDERS_READ_WRITE_ONLY'; PARTITION_NAME READ ------------------------------- ---- ORDER_P1 YES ORDER_P2 NONE ORDER_P3 NONE SQL> SELECT PARTITION_NAME, SUBPARTITION_NAME, READ_ONLY FROM USER_TAB_SUBPARTITIONS WHERE TABLE_NAME ='ORDERS_READ_WRITE_ONLY'; PARTITION_NAME SUBPARTITION_NAME REA ------------------------------ ----------------------------- --- ORDER_P1 ORDER_P1_NORTHWEST YES ORDER_P1 ORDER_P1_SOUTHWEST YES ORDER_P2 ORDER_P2_NORTHWEST NO ORDER_P2 ORDER_P2_SOUTHWEST YES ORDER_P3 ORDER_P3_NORTHWEST YES ORDER_P3 ORDER_P3_SOUTHWEST NO
関連項目:
*_PART_TABLES
、*_TAB_PARTITIONS
および*_TAB_SUBPARTITIONS
ビューの詳細は、Oracle Databaseリファレンスを参照してください
4.1.9 パーティション化された外部表の作成
外部表のためにパーティションを作成できます。
構成外部句は、外部表の仕様およびアクセス・パラメータに従い、表を外部表として識別します。デフォルト・ディレクトリなどのパラメータはパーティションまたはサブパーティション・レベルでオーバーライドできますが、外部表タイプおよびそのアクセス・パラメータは、表レベル属性であり、すべてのパーティションまたはサブパーティションに適用できます。
例4-11で作成した表には、様々な場所からアクセスされる外部データのための3つのパーティションがあります。パーティションp1
は、表のデフォルト・ディレクトリにあり、Californiaの顧客データを格納します。パーティションp2
は、Washingtonのデータを格納するファイルを指し示します。パーティションp3
は、ファイル記述子がなく、空となります。
例4-11 パーティション化された外部表の作成
CREATE TABLE sales (loc_id number, prod_id number, cust_id number, amount_sold number, quantity_sold number) ORGANIZATION EXTERNAL (TYPE oracle_loader DEFAULT DIRECTORY load_d1 ACCESS PARAMETERS ( RECORDS DELIMITED BY NEWLINE CHARACTERSET US7ASCII NOBADFILE LOGFILE log_dir:'sales.log' FIELDS TERMINATED BY "," ) ) REJECT LIMIT UNLIMITED PARTITION BY RANGE (loc_id) (PARTITION p1 VALUES LESS THAN (1000) LOCATION ('california.txt'), PARTITION p2 VALUES LESS THAN (2000) DEFAULT DIRECTORY load_d2 LOCATION ('washington.txt'), PARTITION p3 VALUES LESS THAN (3000)) ;
関連項目:
外部表のパーティション化の詳細は、『Oracle Database管理者ガイド』を参照してください
4.1.10 キー列に対するパーティション化の指定
レンジ・パーティション表およびハッシュ・パーティション表では、最大16のパーティション化キー列を指定できます。
パーティション化キーが複数の列で構成されていて、後続の列に前の列より細かい粒度が定義されている場合は、複数列のパーティション化を使用してください。最も一般的なシナリオは、年、月、日が別々の列で構成され、分解されているDATE
またはTIMESTAMP
キーです。
複数列のパーティション化キーを評価するとき、データベースが第2の値を使用するのは、第1の値で1つのターゲット・パーティションを一意に特定できない場合のみです。第3の値を使用するのは、第1の値と第2の値で正しいパーティションが判別できない場合のみで、第4以降も同様です。1つの値で正しいパーティションを判別できないのは、パーティション・バウンドがその値とまったく同一であり、次のパーティションに同じ上限が定義されている場合だけです。n番目の列が調査されるのは、複数列キーの(n-1)より前のすべての値が、パーティションの(n-1)の上限に正確に一致する場合のみです。たとえば、第2の列が評価されるのは、最初の列がパーティション・バウンド値と正確に一致する場合のみです。すべての列値がパーティションのすべてのバウンド値に正確に一致する場合、データベースでは、行がこのパーティションには適合しないとみなされ、次のパーティションに適合すると判断されます。
決定性のないバウンド定義(少なくとも1列に対して同一の値が設定された連続するパーティション)の場合、パーティション・バウンド値は、「以下」を表す上限を含む値になります。値の上限が常に「より小さい」であるとみなされる、決定性のあるバウンドとは対照的です。
次の内容について説明します。
4.1.10.1 複数列の日付別レンジ・パーティション表の作成
このトピックの例は、複数列の日付別レンジ・パーティション表の作成方法を示します。
例4-12では、year
、month
およびday
の別々の3列に実際のDATE
情報が格納されている複数列のレンジ・パーティション表の列評価を示します。パーティション化の粒度は四半期です。評価されるパーティション表は、次のように作成されます。
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
)と同一です。
例4-12 複数列のレンジ・パーティション表の作成
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);
4.1.10.2 同一サイズのパーティションを強制する複数列のレンジ・パーティション表の作成
このトピックの例は、同一サイズのパーティションを強制する複数列のレンジ・パーティション表の作成方法を示します。
次の例では、どのサプライヤがどの部品を配送するかに関する情報が格納されている表supplier_parts
に対して、複数列のパーティション化を使用する方法を示します。少数の専門の部品のみを提供するサプライヤが存在する一方で、非常に多くの部品を提供するサプライヤも存在するため、同じサイズのパーティションにデータを分散するには、表をsupplier_id
に基づいてパーティション化するのでは十分ではありません。かわりに、(supplier_id
, partnum
)で表をパーティション化し、同じサイズのパーティションを手動で強制します。
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
は任意の値でかまいません(以降同様)。
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
4.1.11 仮想列ベースのパーティション化の使用
パーティション化では、仮想列を任意の正規列として使用できます。
仮想列を使用する場合、時間隔パーティション化およびコンポジット・パーティション化のすべての組合せを含み、パーティション・メソッドがすべてサポートされます。パーティション化列として使用する仮想列では、PL/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;
関連項目:
仮想列を作成する構文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください
4.1.12 パーティション表での表圧縮の使用
ヒープ構成パーティション表では、表圧縮を使用してパーティションの一部またはすべてを圧縮できます。
表領域、表、または表のパーティションに対して圧縮属性を宣言できます。圧縮属性が指定されていない場合は、その他の記憶域属性と同じように継承されます。
例4-13では、圧縮されたパーティションcosts_old
を含むレンジ・パーティション表を作成します。表およびその他すべてのパーティションの圧縮属性は、表領域レベルから継承されます。
例4-13 圧縮されたパーティションを含むレンジ・パーティション表の作成
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));
4.1.13 パーティション索引でのキー圧縮の使用
キー圧縮を使用して、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
とマークされます。
4.1.14 セグメントによるパーティション化の指定
このトピックでは、セグメントによるパーティション化を紹介します。
このトピックでは、セグメントによるパーティション化を使用する場合の機能について説明します。
4.1.14.1 パーティションの遅延セグメント作成
パーティション表を作成する際に、パーティションに最初の行が挿入されるまでセグメントの作成を遅延させることができます。
最初の行が挿入されると、実表のパーティション、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つ多くエクステントが割り当てられます。
シリアル化可能トランザクションは、遅延セグメント作成ではサポートされていません。セグメントが作成されていない空の表、またはまだセグメントのない時間隔パーティション表のパーティションにデータを挿入すると、エラーが発生する場合があります。
関連項目:
-
初期化パラメータ
DEFERRED_SEGMENT_CREATION
の詳細は、『Oracle Databaseリファレンス』を参照してください -
SQL文
ALTER
SESSION
およびALTER
SYSTEM
の詳細は、『Oracle Database SQL言語リファレンス』を参照してください -
SQL文
CREATE
TABLE
のキーワードSEGMENT
CREATION
IMMEDIATE
およびSEGMENT
CREATION
DEFERRED
の詳細は、『Oracle Database SQL言語リファレンス』を参照してください
4.1.14.2 空のセグメントの切捨て
DBMS_SPACE_ADMIN.DROP_EMPTY_SEGMENTS
プロシージャにより、表および表フラグメント内の空のセグメントを削除できます。
さらに、パーティションまたサブパーティションにセグメントがある場合は、SQL文ALTER
TABLE
TRUNCATE
PARTITION
でDROP
ALL
STORAGE
句を指定すると、切捨て機能によりセグメントが削除されます。
関連項目:
-
DBMS_SPACE_ADMIN
パッケージの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください -
ALTER
TABLE
のDROP
ALL
STORAGE
句の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
4.1.14.3 オンデマンドでのセグメント作成のメンテナンス・プロシージャ
DBMS_SPACE_ADMIN
パッケージでMATERIALIZE_DEFERRED_SEGMENTS
プロシージャを使用して、表のセグメントと表の従属オブジェクトを遅延セグメント・プロパティで作成できます。
DBMS_SPACE_ADMIN.MATERIALIZE_DEFERRED_SEGMENTS
プロシージャを使用すると、作成済の既存の表や表フラグメントで、セグメントを強制的に作成することもできます。MATERIALIZE_DEFERRED_SEGMENTS
プロシージャは、表または表フラグメントにエクステントを1つ追加で割り当てることはしません。この点で、SQL文ALTER
TABLE
MODIFY
PARTITION
ALLOCATE
EXTENT
とは異なります。
関連項目:
-
DBMS_SPACE_ADMIN
パッケージの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください
4.1.15 索引構成表を作成する場合のパーティション化の指定
索引構成表では、レンジ、リストまたはハッシュ・パーティション化メソッドを使用できます。
パーティション索引構成表を作成する際のセマンティックは、通常の表のセマンティックに似ていますが、次のような違いがあります。
-
表の作成時に、
ORGANIZATION INDEX
句、および必要に応じてINCLUDING
とOVERFLOW
句を指定します。 -
PARTITION
句にOVERFLOW
副次句を指定できます。この副次句を使用すると、オーバーフロー・セグメントの属性をパーティション・レベルで指定できます。
OVERFLOW
句を指定すると、オーバーフロー・データ・セグメント自体が主キー索引セグメントと同一レベル・パーティション化されます。このため、オーバーフローを含むパーティション索引構成表では、各パーティションに索引セグメントおよびオーバーフロー・データ・セグメントがあります。
索引構成表では、一連のパーティション化列は主キー列のサブセットである必要があります。索引構成表の行は表の主キー索引に格納されるため、パーティション化の基準は可用性に影響します。主キーのサブセットになるパーティション化キーを選択することにより、挿入操作では単一パーティションの主キーの一意性のみを検証すればよくなるため、パーティションの独立性が保たれます。
索引構成表の2次索引のサポートは、通常の表のサポートに似ています。2次索引の論理的な特性のため、通常の表ではUNUSABLE
とマークされるような特定の操作に、索引構成表のグローバル索引を使用できます。
次の内容について説明します。
関連項目:
-
索引構成表のメンテナンス操作の詳細は、「パーティション表および索引のメンテナンス操作」を参照してください
-
索引構成表の管理の詳細は、『Oracle Database管理者ガイド』を参照してください
-
索引構成表の詳細は、『Oracle Database概要』を参照してください。
4.1.15.1 レンジ・パーティションの索引構成表の作成
索引構成表およびその2次索引をレンジ・パーティション化できます。
例4-14では、レンジ・パーティション化された索引構成表sales
を作成します。INCLUDING
句は、week_no
の後のすべての列がオーバーフロー・セグメントに格納されるように指定します。各パーティションには1つのオーバーフロー・セグメントがあり、すべて同じ表領域(overflow_here
)に格納されます。オプションで、個々のパーティション・レベルでOVERFLOW TABLESPACE
を指定できます。そうすると、一部またはすべてのオーバーフロー・セグメントが別のTABLESPACE
属性を持つことができます。
例4-14 レンジ・パーティションの索引構成表の作成
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.1.15.2 ハッシュ・パーティションの索引構成表の作成
索引構成表のパーティション化のその他のオプションは、ハッシュ・メソッドの使用です。
例4-15では、ハッシュ・メソッドでsales
索引構成表をパーティション化しています。
ノート:
ハッシュ関数は、パーティション間にバランスよく行を分散するよう綿密に設計されています。そのため、行の主キー列を更新すると、その行は高確率で別のパーティションに移動されます。変更可能なパーティション化キーを使用してハッシュ・パーティションの索引構成表を作成する場合には、明示的にENABLE ROW MOVEMENT
句を指定することをお薦めします。デフォルトでは、ENABLE ROW MOVEMENT
は無効化されています。
例4-15 ハッシュ・パーティションの索引構成表の作成
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);
4.1.15.3 リスト・パーティションの索引構成表の作成
索引構成表のパーティション化の別のオプションは、リスト・メソッドの使用です。
例4-16では、リスト・メソッドでsales
索引構成表をパーティション化しています。
例4-16 リスト・パーティションの索引構成表の作成
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 ts1 PARTITION BY LIST (week_no) (PARTITION VALUES (1, 2, 3, 4) TABLESPACE ts2, PARTITION VALUES (5, 6, 7, 8) TABLESPACE ts3 OVERFLOW TABLESPACE ts4, PARTITION VALUES (DEFAULT) TABLESPACE ts5);
4.1.16 複数ブロック・サイズのパーティション化制限
ブロック・サイズの異なる表領域を含むデータベースに、パーティション・オブジェクトを作成する際には注意してください。
そのような表領域のパーティション・オブジェクトの記憶域は、一部の制限の対象です。特に、次に示すエンティティのすべてのパーティションは、同じブロック・サイズの表領域に存在する必要があります。
-
従来型の表
-
索引
-
索引構成表の主キーの索引セグメント
-
索引構成表のオーバーフロー・セグメント
-
表外に格納されている
LOB
列
したがって、次のようになります。
-
従来型の各表では、その表のすべてのパーティションをブロック・サイズが同一の表領域に格納する必要があります。
-
各索引構成表では、すべての主キーの索引パーティション、およびその表のすべてのオーバーフロー・パーティションが、ブロック・サイズが同一の表領域に存在する必要があります。ただし、索引パーティションおよびオーバーフロー・パーティションは、ブロック・サイズが異なる表領域に存在してもかまいません。
-
各索引(グローバルまたはローカル)では、その索引の各パーティションはブロック・サイズが同一の表領域に存在する必要があります。ただし、同じオブジェクトに定義されている異なる索引のパーティションは、ブロック・サイズが異なる表領域に存在してもかまいません。
-
各
LOB
列では、その列の各パーティションをブロック・サイズが同一の表領域に格納する必要があります。ただし、異なるLOB
列は、ブロック・サイズが異なる表領域に格納してもかまいません。
パーティション表またはパーティション索引を作成または変更するとき、各エンティティのパーティションとサブパーティションに明示的に指定する表領域は、同じブロック・サイズであることが必要です。表領域記憶域をエンティティに明示的に指定しない場合、データベースがデフォルトで使用する表領域は、同じブロック・サイズである必要があります。そのため、パーティション・オブジェクトの各レベルのデフォルト表領域を把握している必要があります。
4.1.17 XMLTypeおよびオブジェクトのコレクションのパーティション化
XMLType
またはオブジェクトの表と列を使用する際のパーティション化は、パーティション化の基本的なルールに従います。
説明のために、 ここではコレクション表という語を、(1)XMLType
の表または列内のOrdered Collection Tables、(2)オブジェクトの表または列内のネスト表、という2つのカテゴリに使用します。
コレクション表をパーティション化するときは、実表のパーティション化方法がOracle Databaseによって使用されます。また、コレクション表は、実表がパーティション化されるときに自動的にパーティション化されます。パーティション化されたネスト表に対するDMLは、参照パーティション表に対する場合と似た方法で動作します。
Oracle Databaseで提供されるLOCAL
キーワードを使用して、コレクション表を、パーティション化された実表に対応するように同一レベル・パーティション化します。これは、このリリースでのデフォルト動作です。以前のリリースのデフォルトでは、コレクション表は、パーティション化された実表に対して同一レベル・パーティション化されませんでした。現在、パーティション化されていないコレクション表をパーティション化された実表と一緒に格納するためには、GLOBAL
キーワードを指定する必要があります。
アウトオブライン(OOL)表のパーティション化がサポートされています。ただし、アウトオブライン表を持つ同じXMLスキーマの表を2つ作成することはできません。つまり、同じスキーマの表を2つ持つことはできないため、OOL表を含むスキーマでは、パーティションの交換は行えません。
次の例の文によって、ネストした表のパーティションが作成されます。
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));
関連項目:
-
その他の関連する例については、「コレクション表を含むパーティションに対するPMOの実行」および「バイナリXML表のXMLIndexのパーティション化」を参照してください
-
パーティション化されたネスト表に対して問合せを発行し、
EXPLAIN
PLAN
を使用してパフォーマンスを改善する方法の例は、「コレクション表」を参照してください -
オンライン再定義を使用した既存の非パーティション・コレクション表からパーティション表への変換の詳細は「パーティション表への非パーティション表の変更」を参照してください
-
CREATE
TABLE
構文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください
4.1.17.1 コレクション表を含むパーティションに対するPMOの実行
パーティションにコレクション表が含まれるかどうかは、パーティションのメンテナンス操作(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
という名前が付けられ、その他すべての属性を表レベルのデフォルトおよび表領域のデフォルトから継承します。
次のパーティション・メンテナンス操作は、コレクション列に対応する記憶域表に対して直接起動する必要があります。
-
パーティションの変更
-
パーティションの移動
-
パーティション名の変更
-
パーティションのデフォルト属性の変更
関連項目:
-
ADD
PARTITION
の構文については、『Oracle Database SQL言語リファレンス』を参照してください -
パーティション表およびコンポジット・パーティション表に対して実行できるパーティション・メンテナンス操作のリストは、「パーティションでサポートされているメンテナンス操作」を参照してください
4.1.17.2 バイナリXML表のXMLIndexのパーティション化
バイナリXML表の場合、XMLIndexは、レンジ、ハッシュ、リスト、時間隔および参照パーティションの実表で同一レベル・パーティション化されます。
次の例では、レンジ・パーティション表でXMLIndexが作成されます。
CREATE TABLE purchase_order (id NUMBER, doc XMLTYPE) PARTITION BY RANGE (id) (PARTITION p1 VALUES LESS THAN (10), PARTITION p2 VALUES LESS THAN (MAXVALUE)); CREATE INDEX purchase_order_idx ON purchase_order(doc) INDEXTYPE IS XDB.XMLINDEX LOCAL;
関連項目:
-
Oracle XML DBおよびバイナリXML表のXMLIndexのパーティション化の詳細は、『Oracle Databaseデータ・カートリッジ開発者ガイド』を参照してください
-
XMLIndexの詳細は、『Oracle XML DB開発者ガイド』を参照してください
-
XMLTypeの表および列のパーティション化の詳細は、『Oracle XML DB開発者ガイド』を参照してください