4.2 表を作成する場合のコンポジット・パーティション化の指定

コンポジット・パーティション表を作成する場合は、CREATE TABLE SQL文のPARTITION句およびSUBPARTITION句を使用します。

コンポジット・パーティション表を作成するには、まずCREATE TABLE文のPARTITION BY {HASH | RANGE [INTERVAL]| LIST}句を使用します。次に、PARTITION BY句と同様の構文とルールに準拠する、SUBPARTITION BY句を指定します。

次の内容について説明します。

4.2.1 コンポジット・ハッシュ - *パーティション表の作成

コンポジット・ハッシュ - *パーティション化では、2つのディメンションに従ってハッシュ・パーティション化できます。

コンポジット・ハッシュ - ハッシュ・パーティション化計画には、コンポジット・ハッシュ - *パーティション表の大部分のビジネス価値が含まれています。この技術は、2つのディメンションでパーティション・ワイズ結合を可能にする利点があります。

次の例では、コンポジット・ハッシュ - ハッシュ・パーティション表の作成時にサブパーティションの数を指定します。ただし、名前は指定しません。システム生成の名前がパーティションおよびサブパーティションに割り当てられます。それらは、表のデフォルト表領域に格納されます。

Live SQL:

関連する例をOracle Live SQLのOracle Live SQL: コンポジット・ハッシュ - ハッシュ・パーティション表の作成で参照して実行してください。

例4-17 コンポジット・ハッシュ - ハッシュ・パーティション表の作成

CREATE TABLE departments_courses_hash (
             department_id NUMBER(4) NOT NULL, 
             department_name VARCHAR2(30),
             course_id NUMBER(4) NOT NULL)
     PARTITION BY HASH(department_id)
     SUBPARTITION BY HASH (course_id) SUBPARTITIONS 32 PARTITIONS 16;

関連項目:

サブパーティション・テンプレートの使用によって、コンポジット・パーティション表の指定がどのように簡素化されるか方法を学習するには、「コンシューマ・グループを使用したユーザーに対するリソース数の制限時期」を参照してください

4.2.2 コンポジット時間隔 - *パーティション表の作成

時間隔 - *コンポジット・パーティション化の概念は、レンジ - *パーティション化に似ています。

INTERVAL定義を含むようにPARTITION BY RANGE句を拡張します。PARTITIONを使用して少なくとも1つのレンジ・パーティションを指定してください。レンジ・パーティション化キーの値は、遷移ポイントと呼ばれるレンジ・パーティションの値の上限を決定します。遷移ポイントを超えるデータのために、データベースによって時間隔パーティションが自動的に作成されます。

時間隔 - *パーティション表の時間隔のサブパーティションは、データベースによる時間隔の作成時に作成されます。後続のサブパーティションの定義は、サブパーティション・テンプレートでのみ指定できます。

次の各トピックでは、各種の時間隔 - *コンポジット・パーティション化メソッドの例を示します。

関連項目:

サブパーティション・テンプレートの使用によって、コンポジット・パーティション表の指定がどのように簡素化されるか方法を学習するには、「コンシューマ・グループを使用したユーザーに対するリソース数の制限時期」を参照してください

4.2.2.1 コンポジット時間隔 - ハッシュ・パーティション表の作成

複数のハッシュ・パーティションを含む時間隔 - ハッシュ・パーティション表は、PARTITION句で複数のハッシュ・パーティションを指定するか、サブパーティション・テンプレートを使用して作成できます。

これらのいずれの方法も使用しない場合、後続の時間隔パーティションにはハッシュ・サブパーティションが1つのみ作成されます。

次の例では、time_idにより月間隔で時間隔パーティション化され、cust_idでハッシュ・サブパーティション化されたsales表を示します。この例では、個々のハッシュ・パーティションに特定の表領域を割り当てずに、複数のハッシュ・パーティションが指定されています。

Live SQL:

関連する例をOracle Live SQLのOracle Live SQL: コンポジット時間隔 - ハッシュ・パーティション表の作成で参照して実行してください。

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;

4.2.2.2 コンポジット時間隔 - リスト・パーティション表の作成

後続の時間隔 - リスト・パーティションのリスト・サブパーティションを定義するには、サブパーティション・テンプレートを使用する必要があります。

サブパーティション・テンプレートを使用しない場合、各時間隔パーティションに作成されるサブパーティションはDEFAULTサブパーティションのみです。

例4-18では、sales_dateにより月間隔で時間隔パーティション化され、channel_idでリスト・サブパーティション化されたsales_interval_list表を示します。

例4-18 コンポジット時間隔 - リスト・パーティション表の作成

CREATE TABLE sales_interval_list
  ( product_id       NUMBER(6)
  , customer_id      NUMBER
  , channel_id       CHAR(1)
  , promo_id         NUMBER(6)
  , sales_date       DATE
  , quantity_sold    INTEGER
  , amount_sold      NUMBER(10,2)
  )
 PARTITION BY RANGE (sales_date) INTERVAL (NUMTOYMINTERVAL(1,'MONTH'))
 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_2017 VALUES LESS THAN (TO_DATE('01-JAN-2017','dd-MON-yyyy'))
  )
PARALLEL;

SELECT TABLE_NAME, PARTITION_NAME, SUBPARTITION_NAME FROM USER_TAB_SUBPARTITIONS WHERE TABLE_NAME ='SALES_INTERVAL_LIST';

4.2.2.3 コンポジット時間隔 - レンジ・パーティション表の作成

後続の時間隔 - レンジ・パーティションのレンジ・サブパーティションを定義するには、サブパーティション・テンプレートを使用する必要があります。

サブパーティション・テンプレートを使用しない場合、各時間隔パーティションに作成されるサブパーティションは上限MAXVALUE付きのレンジ・サブパーティションのみです。

例4-19では、time_idにより日次間隔で時間隔パーティション化され、amount_soldでレンジ・サブパーティション化されたsales表を示します。

例4-19 コンポジット時間隔 - レンジ・パーティション表の作成

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;

4.2.3 コンポジット・リスト - *パーティション表の作成

リスト - ハッシュ、リスト - リストおよびリスト - レンジのコンポジット・パーティション化の概念は、レンジ - ハッシュ、レンジ - リストおよびレンジ - レンジのパーティション化の概念と似ています。

ただし、リスト - *コンポジット・パーティション化の場合、PARTITION BY LISTを指定してパーティション化計画を定義します。

リスト - *コンポジット・パーティション表のリスト・パーティションは、非コンポジット・レンジ・パーティション表に似ています。この構成により、PARTITION句のオプションの副次句で、パーティション・セグメントに固有の物理属性およびその他の属性(表領域を含む)を指定できます。パーティション・レベルで上書きされない場合、パーティションは基礎となる表の属性を継承します。

SUBPARTITIONまたはSUBPARTITIONS句のサブパーティションの説明は、レンジ - *コンポジット・パーティション化に似ています。

次の各トピックでは、各種のリスト - *コンポジット・パーティション化メソッドの例を示します。

関連項目:

4.2.3.1 コンポジット・リスト - ハッシュ・パーティション表の作成

このトピックの例は、コンポジット・リスト - ハッシュ・パーティション表の作成方法を示します。

例4-20では、リージョンでリスト・パーティション化され、顧客IDによるハッシングを使用してサブパーティション化されたaccounts表を示します。

例4-20 リスト - ハッシュ・パーティション表の作成

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.2.3.2 コンポジット・リスト - リスト・パーティション表の作成

このトピックの例は、コンポジット・リスト - リスト・パーティション表の作成方法を示します。

例4-21では、リージョンでリスト・パーティション化され、アカウント・ステータスによるリスト化を使用してサブパーティション化されたaccounts表を示します。

Live SQL:

関連する例をOracle Live SQLのOracle Live SQL: コンポジット・リスト - リスト・パーティション表の作成で参照して実行してください。

例4-21 コンポジット・リスト - リスト・パーティション表の作成

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.2.3.3 コンポジット・リスト - レンジ・パーティション表の作成

このトピックの例は、コンポジット・リスト - レンジ・パーティション表の作成方法を示します。

例4-22では、リージョンでリスト・パーティション化され、勘定残高によるレンジ化を使用してサブパーティション化され、行移動が有効化されたaccounts表を示します。異なるリスト・パーティションのサブパーティションには、別々のレンジを指定できます。

例4-22 コンポジット・レンジ - レンジ・パーティション表の作成

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;

4.2.4 コンポジット・レンジ - *パーティション表の作成

このトピックでは、コンポジット・レンジ - *パーティション表の作成方法を紹介します。

次の各トピックでは、各種のレンジ - *コンポジット・パーティション化メソッドの例を示します。

関連項目:

サブパーティション・テンプレートの使用によって、コンポジット・パーティション表の指定がどのように簡素化されるか方法を学習するには、「コンシューマ・グループを使用したユーザーに対するリソース数の制限時期」を参照してください

4.2.4.1 コンポジット・レンジ - ハッシュ・パーティション表の作成について

レンジ - ハッシュ・パーティション表のパーティションは、そのデータがサブパーティションのセグメントに格納されるため、論理構造のみです。

パーティション同様、これらのサブパーティションでも同じ論理属性を共有します。レンジ・パーティション表のレンジ・パーティションとは異なり、所有パーティションと同じ表領域に存在する必要はありませんが、サブパーティションの物理属性は所有パーティションの属性と同一である必要があります。

次の内容について説明します。

関連項目:

サブパーティション・テンプレートの使用によって、コンポジット・パーティション表の指定がどのように簡素化されるか方法を学習するには、「コンシューマ・グループを使用したユーザーに対するリソース数の制限時期」を参照してください

4.2.4.1.1 同じ表領域のコンポジット・レンジ - ハッシュ・パーティション表の作成

このトピックの例は、同じ表領域を使用するコンポジット・レンジ - ハッシュ・パーティション表の作成方法を示します。

例4-23の文は、レンジ - ハッシュ・パーティション表を作成します。4つのレンジ・パーティションが作成され、それぞれに8つのサブパーティションが含まれています。サブパーティションには名前が付けられていないため、システム生成の名前が割り当てられていますが、STORE IN句で指定された4つの表領域(ts1ts2ts3ts4)に格納されます。

例4-23 1つのSTORE IN句を使用した複合レンジ - ハッシュ・パーティション表の作成

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'))
 );
4.2.4.1.2 異なる表領域のコンポジット・レンジ - ハッシュ・パーティション表の作成

このトピックの例は、異なる表領域を使用するコンポジット・レンジ - ハッシュ・パーティション表の作成方法を示します。

レンジ・パーティションに指定された属性は、そのパーティションのすべてのサブパーティションに適用されます。各レンジ・パーティションに異なる属性を指定することができ、そのパーティションのサブパーティションを格納する表領域のリストが、その他のパーティションのリストと異なる場合は、パーティション・レベルでSTORE IN句を指定することもできます。これは、次の例に示されています。

CREATE TABLE employees_range_hash 
         (department_id NUMBER(4) NOT NULL, 
          last_name VARCHAR2(25), 
          job_id VARCHAR2(10))   
     PARTITION BY RANGE(department_id) SUBPARTITION BY HASH(last_name)
        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));
4.2.4.1.3 複数の表領域にまたがるローカル索引の作成

このトピックの例は、複数の表領域にまたがるローカル索引の作成方法を示します。

次の文で、索引セグメントが表領域ts7ts8およびts9に分散している表にローカル索引を作成する例を示します。

CREATE INDEX employee_ix ON employees_range_hash(department_id)
     LOCAL STORE IN (ts7, ts8, ts9);

このローカル索引は、ベース表と同じ量のパーティションで構成されるように、ベース表と同一レベルでパーティション化されます。各索引パーティションには、対応するベース表のパーティションと同じ数のサブパーティションが含まれます。ベース表の指定されたサブパーティションに存在する行の索引エントリは、索引の対応するサブパーティションに格納されます。

4.2.4.2 コンポジット・レンジ - リスト・パーティション表の作成について

レンジ - リスト・コンポジット・パーティション表のレンジ・パーティションは、非コンポジット・レンジ・パーティション表と同様に記述されます。

この構成により、PARTITION句のオプションの副次句で、パーティション・セグメントに固有の物理属性およびその他の属性(表領域を含む)を指定できます。パーティション・レベルで上書きされない場合、パーティションは基礎となる表の属性を継承します。

SUBPARTITION句のリスト・サブパーティションの説明は、指定できる唯一の物理属性が表領域(オプション)であることを除き、非コンポジット・リスト・パーティションと同様に記述されます。サブパーティションは、パーティションの説明からその他すべての物理属性を継承します。

次の内容について説明します。

関連項目:

サブパーティション・テンプレートの使用によって、コンポジット・パーティション表の指定がどのように簡素化されるか方法を学習するには、「コンシューマ・グループを使用したユーザーに対するリソース数の制限時期」を参照してください

4.2.4.2.1 コンポジット・レンジ - リスト・パーティション表の作成

このトピックの例は、コンポジット・レンジ - リスト・パーティション表の作成方法を示します。

例4-24では、レンジ - リスト・パーティション化の使用方法を示します。この例では、製品の販売データを四半期ごとに追跡し、各四半期内で、指定された州ごとにグループ化しています。

行のパーティション化列の値が、特定のパーティション・レンジに含まれているかどうかを確認して、行がパーティションにマッピングされます。その後、記述子の値リストにサブパーティション列の値と一致する値が含まれるサブパーティションを特定して、そのパーティション内のサブパーティションに行がマッピングされます。たとえば、次のリストは、いくつかのサンプル行の挿入を示します。

  • (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')は表内のいずれのサブパーティションにもマッピングされないため、エラーが表示されます。

Live SQL:

関連する例をOracle Live SQLのOracle Live SQL: コンポジット・レンジ - リスト・パーティション表の作成で参照して実行してください。

例4-24 コンポジット・レンジ - リスト・パーティション表の作成

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')
         )
      );
4.2.4.2.2 表領域を指定するコンポジット・レンジ - リスト・パーティション表の作成

このトピックの例は、表領域を指定するコンポジット・レンジ - リスト・パーティション表の作成方法を示します。

レンジ - リスト・パーティション表のパーティションは、そのデータがサブパーティションのセグメントに格納されるため、論理構造のみです。リスト・サブパーティションの特性は、リスト・パーティションと同様です。リスト・パーティション化にデフォルトのパーティションを指定する場合と同じように、デフォルトのサブパーティションを指定できます。

次の例では、パーティション・レベルおよびサブパーティション・レベルで表領域を指定する表を作成します。各パーティション内のサブパーティションの数は様々で、デフォルトのサブパーティションが指定されています。この例のサブパーティションの説明は次のようになります。

  • すべてのサブパーティションで、表領域レベルのデフォルトから、表領域以外の物理属性が継承されます。これは、パーティションまたはサブパーティションに指定された唯一の物理属性が表領域であるためです。表レベルで物理属性が指定されていないため、表領域レベルのデフォルトがすべてのレベルで継承されます。

  • 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_SUBPnという書式でシステム生成されます。

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
      );

4.2.4.3 コンポジット・レンジ - レンジ・パーティション表の作成

レンジ - レンジ・コンポジット・パーティション表のレンジ・パーティションは、非コンポジット・レンジ・パーティション表に似ています。

この構成により、PARTITION句のオプションの副次句で、パーティション・セグメントに固有の物理属性およびその他の属性(表領域を含む)を指定できます。パーティション・レベルで上書きされない場合、パーティションは基礎となる表の属性を継承します。

SUBPARTITION句のレンジ・サブパーティションの記述は、指定できる唯一の物理属性がオプションの表領域であることを除き、非コンポジット・レンジ・パーティションと似ています。サブパーティションは、パーティションの説明からその他すべての物理属性を継承します。

次の例では、レンジ - レンジ・パーティション化の使用方法を示します。この例では出荷を追跡しています。顧客とのサービス内容合意書には、すべての注文品は、注文が行われてから1か月以内に配送すると記載されています。注文には次のタイプがあります。

行のパーティション化列の値が、特定のパーティション・レンジに含まれているかどうかを確認して、行がパーティションにマッピングされます。その後、サブパーティション化列の値が特定のレンジ内に含まれているかどうかを確認して、そのパーティション内のサブパーティションに行がマッピングされます。たとえば、発注日が2006年9月で配送日が2006年10月28の出荷は、パーティションp06_oct_aに含まれます。

  • 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)
  )
);

関連項目:

サブパーティション・テンプレートの使用によって、コンポジット・パーティション表の指定がどのように簡素化されるか方法を学習するには、「コンシューマ・グループを使用したユーザーに対するリソース数の制限時期」を参照してください

4.2.5 コンポジット・パーティション表を説明するサブパーティション・テンプレートの指定

サブパーティション・テンプレートを使用して、コンポジット・パーティション表にサブパーティションを作成できます。

サブパーティション・テンプレートを使用すると、表の各パーティションにサブパーティション記述子を指定する必要がないため、サブパーティションの指定を簡略化できます。かわりに、テンプレートに一度のみサブパーティションを記述し、そのサブパーティション・テンプレートを表の各パーティションに適用します。時間隔 - *コンポジット・パーティション表の場合、時間隔パーティションのサブパーティションを定義するには、サブパーティション・テンプレートを使用する必要があります。

サブパーティション・テンプレートは、パーティションにサブパーティション記述子が指定されていない場合に適用されます。サブパーティション記述子が指定されている場合は、そのパーティションのサブパーティション・テンプレートのかわりに適用されます。サブパーティション・テンプレートが指定されておらず、パーティションにもサブパーティション記述子が指定されていない場合は、デフォルトのサブパーティションが1つ作成されます。

次の内容について説明します。

4.2.5.1 * - ハッシュ・パーティション表へのサブパーティション・テンプレートの指定

レンジ - ハッシュ、時間隔 - ハッシュおよびリスト - ハッシュ・パーティション表の場合、サブパーティション・テンプレートでサブパーティションを詳細に指定することも、ハッシュ・サブパーティションの数のみを指定することも可能です。

例4-25では、サブパーティション・テンプレートを使用して、レンジ - ハッシュ・パーティション表を作成し、サブパーティションの名前と表領域を表示します。

この例では、次の説明を含む表を作成します。

  • 各パーティションには、サブパーティション・テンプレートに記述されているように4つのサブパーティションがあります。

  • 各サブパーティションには表領域が指定されています。サブパーティション・テンプレートで1つのサブパーティションに表領域が指定されている場合は、すべてのサブパーティションに表領域を1つ指定する必要があります。

  • 時間隔 - *サブパーティション化を使用している場合以外、サブパーティションの名前は、次の書式でパーティション名とサブパーティション名を連結して生成されます。

    partition name_subpartition name

    時間隔 - *サブパーティション化の場合、サブパーティション名は次の書式でシステム生成されます。

    SYS_SUBPn

例4-25 サブパーティション・テンプレートを使用したレンジ - ハッシュ・パーティション表の作成

CREATE TABLE employees_sub_template (department_id NUMBER(4) NOT NULL, 
             last_name VARCHAR2(25), job_id VARCHAR2(10))   
     PARTITION BY RANGE(department_id) SUBPARTITION BY HASH(last_name)
     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)
    );

SQL> SELECT TABLESPACE_NAME, PARTITION_NAME, SUBPARTITION_NAME
  2  FROM DBA_TAB_SUBPARTITIONS WHERE TABLE_NAME='EMPLOYEEES_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.2.5.2 * - リスト・パーティション表へのサブパーティション・テンプレートの指定

- リスト・パーティション表の場合、サブパーティション・テンプレートではサブパーティションを詳細に記述できます。

例4-26では、レンジ - リスト・パーティション表について、サブパーティション・テンプレートを使用して表領域間でデータをストライプ化する方法を示します。この例では、表が作成されると、表のサブパーティションは縦にストライプ化されます。つまり、すべてのパーティションのサブパーティションnが同じ表領域にあります。

サブパーティション・テンプレートではなく、パーティション・レベルで表領域を指定した場合(パーティションq1_1999tbs_1、パーティションq2_1999tbs_2、パーティションq3_1999tbs_3およびパーティションq4_1999tbs_4など)、表は水平にストライプ化されます。すべてのサブパーティションは、所有パーティションの表領域に格納されます。

例4-26 サブパーティション・テンプレートを使用したレンジ - リスト・パーティション表の作成

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'))
  );