日本語PDF

4.1 表および索引を作成する場合のパーティション化の指定

パーティション表または索引の作成は、非パーティション表または索引の作成と非常に似ています。

パーティション表または索引を作成する場合は、CREATE TABLE文にパーティション化句を含めます。文に含めるパーティション化句および副次句は、実行するパーティション化のタイプによって異なります。

パーティション化は、LONGまたはLONG RAW列を含む表を除き、通常の(ヒープ構成)表および索引構成表の両方で実行できます。パーティション表には、非パーティション・グローバル索引、レンジまたはハッシュ・パーティション・グローバル索引、およびローカル索引を作成できます。

パーティション表を作成(または変更)する際には、行移動句(ENABLE ROW MOVEMENTまたはDISABLE ROW MOVEMENTのいずれか)を指定できます。この句は、キーが更新された場合に、新しいパーティションへの行の移行を有効化または無効化します。デフォルトはDISABLE ROW MOVEMENTです。

単一レベル・パーティション表の1024K-1パーティションまたはコンポジット・パーティション表のサブパーティションの合計まで指定できます。

自動リスト・コンポジット・パーティション表および時間隔サブパーティションを作成することで、領域を節約できます。これは、これらの方法では、データが存在する場合のみサブパーティションが作成されるためです。要求に応じて新しいパーティションを作成する場合にサブパーティション・セグメントの作成を延期することにより、最初の一致行が挿入されるときのみサブパーティション・セグメントが作成されるようになります。

次のトピックでは、様々なタイプのパーティション表および索引に関するパーティション作成の詳細および例を示します。

関連項目:

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_2006sales_q2_2006sales_q3_2006sales_q4_2006)、各パーティションは別の表領域(tsatsbtsctsd)に格納されます。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およびそれより下位のすべてのパーティション(この例ではp0p1および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つの表領域(gear1gear2gear3gear4)に配置されます。

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:0005-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_2005Q2_2005Q3_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);

関連項目:

4.1.8 読取り専用パーティションまたはサブパーティションを含む表の作成

表、パーティションおよびサブパーティションを読取り専用ステータスに設定し、ユーザーまたはトリガーによる意図しないDML操作からデータを保護できます。

読取り専用に設定されているパーティションまたはサブパーティションのデータを更新しようとするとエラーが発生しますが、読取り/書込みに設定されているパーティションまたはサブパーティションのデータの更新は成功します。

CREATE TABLEおよびALTER TABLE SQL文は、パーティションおよびサブパーティションに読取り専用句を指定します。読取り専用句の値は、READ ONLYまたはREAD WRITEです。READ WRITEがデフォルト値です。読取り専用句がパーティションまたはサブパーティションに明示的に設定されていない場合は、読取り専用句の高レベルの設定がパーティションおよびサブパーティションに適用されます。

次に、読取り専用ステータスおよび読取り/書込みステータスのコンポジット・レンジ - リスト・パーティション表の作成例を示します。orders_read_write_onlyREAD 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では、yearmonthおよび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に格納されます。列partnumsupplier_idが10の場合にのみ評価され、partnumが200以上の場合、対応する行はパーティションp1p2またはp3に挿入されます。supplier_partsのレンジのパーティション・サイズを同一にするには、supplier_idでレンジ・パーティション化され、partnumでハッシュ・サブパーティション化されたコンポジット・レンジ - ハッシュ・パーティション表を選択します。

複数列のパーティション表にパーティション・バウンドを定義する場合、いくつかのルールに従う必要があります。たとえば、3つの列abおよびcでレンジ・パーティション化された表があるとします。個々のパーティションには、次のようなレンジ値があります。

P0(a0, b0, c0)
P1(a1, b1, c1)
P2(a2, b2, c2)
...
Pn(an, bn, cn)

各パーティションに指定するレンジ値は、次のルールに準拠している必要があります。

  • a0a1以下で、a1a2以下である必要があります(以降同様)。

  • a0=a1の場合、b0b1以下である必要があります。a0 < a1の場合、b0およびb1は任意の値でかまいません。a0=a1かつb0=b1の場合、c0c1以下である必要があります。b0<b1の場合、c0およびc1は任意の値でかまいません(以降同様)。

  • a1=a2の場合、b1b2以下である必要があります。a1<a2の場合、b1およびb2は任意の値でかまいません。a1=a2かつb1=b2の場合、c1c2以下である必要があります。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_soldquantity_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_CREATIONTRUEまたはFALSEに設定します。

  • SQL文ALTER SESSIONまたはALTER SYSTEMにより、初期化パラメータDEFERRED_SEGMENT_CREATIONTRUEまたはFALSEに設定します。

  • SQL文CREATE TABLEを発行する際に、パーティション句でキーワードSEGMENT CREATION IMMEDIATEまたはSEGMENT CREATION DEFERREDを指定します。

既存の作成済パーティションに対するセグメントの作成は、SQL文ALTER TABLE MODIFY PARTITION ALLOCATE EXTENTにより強制できます。この文により、CREATE TABLE時に指定された初期エクステント数より1つ多くエクステントが割り当てられます。

シリアル化可能トランザクションは、遅延セグメント作成ではサポートされていません。セグメントが作成されていない空の表、またはまだセグメントのない時間隔パーティション表のパーティションにデータを挿入すると、エラーが発生する場合があります。

関連項目:

4.1.14.2 空のセグメントの切捨て

DBMS_SPACE_ADMIN.DROP_EMPTY_SEGMENTSプロシージャにより、表および表フラグメント内の空のセグメントを削除できます。

さらに、パーティションまたサブパーティションにセグメントがある場合は、SQL文ALTER TABLE TRUNCATE PARTITIONDROP ALL STORAGE句を指定すると、切捨て機能によりセグメントが削除されます。

関連項目:

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とは異なります。

関連項目:

4.1.15 索引構成表を作成する場合のパーティション化の指定

索引構成表では、レンジ、リストまたはハッシュ・パーティション化メソッドを使用できます。

パーティション索引構成表を作成する際のセマンティックは、通常の表のセマンティックに似ていますが、次のような違いがあります。

  • 表の作成時に、ORGANIZATION INDEX句、および必要に応じてINCLUDINGOVERFLOW句を指定します。

  • PARTITION句にOVERFLOW副次句を指定できます。この副次句を使用すると、オーバーフロー・セグメントの属性をパーティション・レベルで指定できます。

OVERFLOW句を指定すると、オーバーフロー・データ・セグメント自体が主キー索引セグメントと同一レベル・パーティション化されます。このため、オーバーフローを含むパーティション索引構成表では、各パーティションに索引セグメントおよびオーバーフロー・データ・セグメントがあります。

索引構成表では、一連のパーティション化列は主キー列のサブセットである必要があります。索引構成表の行は表の主キー索引に格納されるため、パーティション化の基準は可用性に影響します。主キーのサブセットになるパーティション化キーを選択することにより、挿入操作では単一パーティションの主キーの一意性のみを検証すればよくなるため、パーティションの独立性が保たれます。

索引構成表の2次索引のサポートは、通常の表のサポートに似ています。2次索引の論理的な特性のため、通常の表ではUNUSABLEとマークされるような特定の操作に、索引構成表のグローバル索引を使用できます。

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

関連項目:

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

関連項目:

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という名前が付けられ、その他すべての属性を表レベルのデフォルトおよび表領域のデフォルトから継承します。

次のパーティション・メンテナンス操作は、コレクション列に対応する記憶域表に対して直接起動する必要があります。

  • パーティションの変更

  • パーティションの移動

  • パーティション名の変更

  • パーティションのデフォルト属性の変更

関連項目:

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;

関連項目: