4 パーティションの管理

パーティションの管理は、パーティション表および索引を使用する際の重要なタスクです。

この章では、パーティション表や索引の作成およびメンテナンスの様々な局面について説明します。

この章の構成は、次のとおりです。

ノート:

パーティション表や索引を作成する前、または任意のパーティション表でメンテナンス操作を実行する前に、「パーティション化の概念」の情報を確認することをお薦めします。

関連項目:

パーティション化の一般的な制限、パーティション表や索引を作成および変更するためのパーティション化句の正確な構文、その使用に関する制限、および表の作成や変更に必要な特定の権限の詳細は、『Oracle Database SQL言語リファレンス』を参照してください

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
(
   salesperson_id   NUMBER(5)    NOT NULL,
   salesperson_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))
; 

ノート:

Hive列名は、外部パーティション表では[a-zA-Z0-9_]+のみを使用する必要があります。このルールに従わないOracle列名を使用する場合は、2つのアクセス・パラメータcom.oracle.bigdata.fieldscom.oracle.bigdata.colmapを一緒に使用して、"拡張"Oracle列名を単純なHive識別子に再マップします。

関連項目:

外部表のパーティション化の詳細は、『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;

関連項目:

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

4.3 パーティションでサポートされているメンテナンス操作

パーティション、サブパーティションおよび索引パーティションで実行できる、様々なメンテナンス操作があります。

次の表およびトピックで、パーティション、サブパーティションおよび索引パーティションでサポートされているメンテナンス操作について説明します。

表4-1および表4-2にパーティション化およびサブパーティション化の種類ごとに、メンテナンス操作の実行に使用されるALTER TABLE文の特定の句が示されます。

ノート:

複数のパーティションのパーティション・メンテナンス操作は、ドメイン索引を使用した表でサポートされていません。

表4-1 表パーティションに対するALTER TABLEメンテナンス操作

メンテナンス操作 レンジ・コンポジット・レンジ - * 時間隔コンポジット時間隔 - * ハッシュ リスト・コンポジット・リスト - * 参照

パーティションの追加。「パーティションおよびサブパーティションの追加について」を参照してください

ADD PARTITION、単一および複数のパーティション

N/A

ADD PARTITION

ADD PARTITION、単一および複数のパーティション

N/A。(これらの操作は、参照パーティション表では実行できません。これらの操作は、親表で実行するとすべての子表にカスケードされます。)

パーティションの結合。「パーティションおよびサブパーティションの結合について」を参照してください

N/A

N/A

COALESCE PARTITION

N/A

N/A (これらの操作は、参照パーティション表では実行できません。これらの操作は、親表で実行するとすべての子表にカスケードされます。)

パーティションの削除。「パーティションおよびサブパーティションの削除について」を参照してください

DROP PARTITION、単一および複数のパーティション

DROP PARTITION、単一および複数のパーティション

N/A

DROP PARTITION、単一および複数のパーティション

N/A (これらの操作は、参照パーティション表では実行できません。これらの操作は、親表で実行するとすべての子表にカスケードされます。)

パーティションの交換。「パーティションおよびサブパーティションの交換について」を参照してください

EXCHANGE PARTITION

EXCHANGE PARTITION

EXCHANGE PARTITION

EXCHANGE PARTITION

EXCHANGE PARTITION

パーティションのマージ。「パーティションおよびサブパーティションのマージについて」を参照してください

MERGE PARTITIONS、単一および複数のパーティション

MERGE PARTITIONS、単一および複数のパーティション

N/A

MERGE PARTITIONS、単一および複数のパーティション

N/A (これらの操作は、参照パーティション表では実行できません。これらの操作は、親表で実行するとすべての子表にカスケードされます。)

デフォルトの属性の変更について

MODIFY DEFAULT ATTRIBUTES

MODIFY DEFAULT ATTRIBUTES

MODIFY DEFAULT ATTRIBUTES

MODIFY DEFAULT ATTRIBUTES

MODIFY DEFAULT ATTRIBUTES

パーティションの実際の属性の変更について

MODIFY PARTITION

MODIFY PARTITION

MODIFY PARTITION

MODIFY PARTITION

MODIFY PARTITION

リスト・パーティションの変更について: 値の追加

N/A

N/A

N/A

MODIFY PARTITION ADD VALUES

N/A

リスト・パーティションの変更について: 値の削除

N/A

N/A

N/A

MODIFY PARTITION DROP VALUES

N/A

パーティションの移動。「パーティションおよびサブパーティションの移動について」を参照してください

MOVE SUBPARTITION

MOVE SUBPARTITION

MOVE PARTITION

MOVE SUBPARTITION

MOVE PARTITION

パーティション名の変更。「パーティションおよびサブパーティション名の変更について」を参照してください

RENAME PARTITION

RENAME PARTITION

RENAME PARTITION

RENAME PARTITION

RENAME PARTITION

パーティションの分割。「パーティションおよびサブパーティションの分割について」を参照してください

SPLIT PARTITION、単一および複数のパーティション

SPLIT PARTITION、単一および複数のパーティション

N/A

SPLIT PARTITION、単一および複数のパーティション

N/A (これらの操作は、参照パーティション表では実行できません。これらの操作は、親表で実行するとすべての子表にカスケードされます。)

パーティションの切捨て。「パーティションおよびサブパーティションの切捨てについて」を参照してください

TRUNCATE PARTITION、単一および複数のパーティション

TRUNCATE PARTITION、単一および複数のパーティション

TRUNCATE PARTITION、単一および複数のパーティション

TRUNCATE PARTITION、単一および複数のパーティション

TRUNCATE PARTITION、単一および複数のパーティション

表4-2 表サブパーティションに対するALTER TABLEメンテナンス操作

メンテナンス操作 コンポジット* - レンジ コンポジット* - ハッシュ コンポジット* - リスト

サブパーティションの追加。「パーティションおよびサブパーティションの追加について」を参照してください

MODIFY PARTITION ADD SUBPARTITION、単一および複数のサブパーティション

MODIFY PARTITION ADD SUBPARTITION

MODIFY PARTITION ADD SUBPARTITION、単一および複数のサブパーティション

サブパーティションの結合。「パーティションおよびサブパーティションの結合について」を参照してください

N/A

MODIFY PARTITION COALESCE SUBPARTITION

N/A

サブパーティションの削除。「パーティションおよびサブパーティションの削除について」を参照してください

DROP SUBPARTITION、単一および複数のサブパーティション

N/A

DROP SUBPARTITION、単一および複数のサブパーティション

サブパーティションの交換。「パーティションおよびサブパーティションの交換について」を参照してください

EXCHANGE SUBPARTITION

N/A

EXCHANGE SUBPARTITION

サブパーティションのマージ。「パーティションおよびサブパーティションのマージについて」を参照してください

MERGE SUBPARTITIONS、単一および複数のサブパーティション

N/A

MERGE SUBPARTITIONS、単一および複数のサブパーティション

デフォルトの属性の変更について

MODIFY DEFAULT ATTRIBUTES FOR PARTITION

MODIFY DEFAULT ATTRIBUTES FOR PARTITION

MODIFY DEFAULT ATTRIBUTES FOR PARTITION

サブパーティションの実際の属性の変更。「パーティションの実際の属性の変更について」を参照してください

MODIFY SUBPARTITION

MODIFY SUBPARTITION

MODIFY SUBPARTITION

リスト・サブパーティションの変更。「リスト・パーティションの変更について: 値の追加」を参照してください

N/A

N/A

MODIFY SUBPARTITION ADD VALUES

リスト・サブパーティションの変更。「リスト・パーティションの変更について: 値の削除」を参照してください

N/A

N/A

MODIFY SUBPARTITION DROP VALUES

サブパーティション・テンプレートの変更

SET SUBPARTITION TEMPLATE

SET SUBPARTITION TEMPLATE

SET SUBPARTITION TEMPLATE

サブパーティションの移動。「パーティションおよびサブパーティションの移動について」を参照してください

MOVE SUBPARTITION

MOVE SUBPARTITION

MOVE SUBPARTITION

サブパーティション名の変更。「パーティションおよびサブパーティション名の変更について」を参照してください

RENAME SUBPARTITION

RENAME SUBPARTITION

RENAME SUBPARTITION

サブパーティションの分割。「パーティションおよびサブパーティションの分割について」を参照してください

SPLIT SUBPARTITION、単一および複数のサブパーティション

N/A

SPLIT SUBPARTITION、単一および複数のサブパーティション

サブパーティションの切捨て。「パーティションおよびサブパーティションの切捨てについて」を参照してください

TRUNCATE SUBPARTITION、単一および複数のサブパーティション

TRUNCATE SUBPARTITION、単一および複数のサブパーティション

TRUNCATE SUBPARTITION、単一および複数のサブパーティション

ノート:

ビットマップ索引のあるパーティション表や、現在圧縮されていないパーティションのみを含むパーティション表に、圧縮されたパーティションを組み込むために最初に表圧縮を使用する場合は、次の手順を実行する必要があります。

  • 既存のすべてのビットマップ索引およびビットマップ索引パーティションを削除するか、UNUSABLEとマークします。

  • 表圧縮属性を設定します。

  • 索引を再作成します。

これらの処理は、パーティションにデータが含まれているかどうかには関係なく、圧縮されたパーティションを組み込む操作です。

これは、Bツリー索引を含むパーティション表、またはパーティション索引構成表には適用されません。

表4-3に索引パーティションで実行可能なメンテナンス操作を示し、どのタイプの索引(グローバルまたはローカル)で実行可能かを記載します。メンテナンス操作に使用するALTER INDEX句を表示します。

グローバル索引は、基礎となる表の構造を反映しません。パーティション化されている場合は、レンジまたはハッシュでパーティション化できます。

ローカル索引では基礎となる表の構造が反映されるため、表パーティションおよびサブパーティションがメンテナンス・アクティビティの影響を受けると、パーティション化も自動的にメンテナンスされます。そのため、ローカル索引でのパーティション・メンテナンスの必要性は低く、オプションの数も少なくなっています。

表4-3 索引パーティションに対するALTER INDEXメンテナンス操作

メンテナンス操作 索引のタイプ 索引パーティション化のタイプ
レンジ ハッシュおよびリスト コンポジット

索引パーティションの追加

グローバル

-

ADD PARTITION(ハッシュのみ)

-

索引パーティションの追加

ローカル

N/A

N/A

N/A

索引パーティションの削除

グローバル

DROP PARTITION

-

-

索引パーティションの削除

ローカル

N/A

N/A

N/A

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

グローバル

MODIFY DEFAULT ATTRIBUTES

-

-

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

ローカル

MODIFY DEFAULT ATTRIBUTES

MODIFY DEFAULT ATTRIBUTES

MODIFY DEFAULT ATTRIBUTES

MODIFY DEFAULT ATTRIBUTES FOR PARTITION

索引パーティションの実際の属性の変更

グローバル

MODIFY PARTITION

-

-

索引パーティションの実際の属性の変更

ローカル

MODIFY PARTITION

MODIFY PARTITION

MODIFY PARTITION

MODIFY SUBPARTITION

索引パーティションの再作成について

グローバル

REBUILD PARTITION

-

-

索引パーティションの再作成について

ローカル

REBUILD PARTITION

REBUILD PARTITION

REBUILD SUBPARTITION

索引パーティション名の変更について

グローバル

RENAME PARTITION

-

-

索引パーティション名の変更について

ローカル

RENAME PARTITION

RENAME PARTITION

RENAME PARTITION

RENAME SUBPARTITION

索引パーティションの分割

グローバル

SPLIT PARTITION

-

-

索引パーティションの分割

ローカル

N/A

N/A

N/A

4.3.1 索引の自動更新

パーティション表および索引に対する個々のメンテナンス操作を説明する前に、ALTER TABLE文に指定可能なUPDATE INDEXES句の影響を説明します。

デフォルトでは、パーティション表に対する表メンテナンス操作の多くにより、対応する索引または索引パーティションが無効化(UNUSABLEとマーク)されます。索引全体または各パーティション(グローバル索引の場合)を再作成する必要があります。メンテナンス操作で、ALTER TABLE文にUPDATE INDEXESを指定すると、データベースによりこのデフォルトの動作が上書きされます。この句を指定すると、メンテナンス操作のDDL文の実行時に、データベースにより索引が更新されます。これには、次の利点があります。

  • 索引が、ベース表操作とともに更新されます。後で更新して、個別に索引を再作成する必要はありません。

  • グローバル索引はUNUSABLEとマークされないため、高い可用性を備えています。パーティションDDLの実行中でもこれらの索引は使用可能なままで、表内の影響を受けないパーティションにアクセスできます。

  • すべての無効な索引を再作成するために、名前を調べる必要はありません。

ローカル索引のオプションの句で、更新されたローカル索引やそのパーティションに物理特性および記憶域特性を指定できます。

  • 各ローカル索引のそれぞれのパーティションに物理属性、表領域記憶域およびロギングを指定できます。または、PARTITIONキーワードのみを指定して、次のようにデータベースによるパーティション属性の更新を行うことも可能です。

    • 単一の表パーティションに対する操作(MOVE PARTITIONSPLIT PARTITIONなど)では、対応する索引パーティションは影響を受ける表パーティションの属性を継承します。データベースでは新しい索引パーティションの名前は生成されないため、この操作により作成される新しい索引パーティションは、対応する新しい表パーティションから名前を継承します。

    • MERGE PARTITION操作の場合、この操作によって作成されたローカル索引パーティションは、作成された表パーティションの名前とローカル索引の属性を継承します。

  • コンポジット・パーティション索引では、各サブパーティションに表領域記憶域を指定できます。

次の操作では、UPDATE INDEXES句がサポートされています。

  • ADD PARTITION | SUBPARTITION

  • COALESCE PARTITION | SUBPARTITION

  • DROP PARTITION | SUBPARTITION

  • EXCHANGE PARTITION | SUBPARTITION

  • MERGE PARTITION | SUBPARTITION

  • MOVE PARTITION | SUBPARTITION

  • SPLIT PARTITION | SUBPARTITION

  • TRUNCATE PARTITION | SUBPARTITION

SKIP_UNUSABLE_INDEXES初期化パラメータ

SKIP_UNUSABLE_INDEXESは、デフォルト値がTRUEの初期化パラメータです。この設定により、UNUSABLEとマークされた索引および索引パーティションのエラー・レポートが無効化されます。使用できない要素を避けるために、データベースが別の実行計画を選択しないようにするには、このパラメータをFALSEに設定する必要があります。

索引を自動更新する際の考慮事項

UPDATE INDEXESを指定する際は、次の影響に注意してください。

  • 事前にUNUSABLEとマークされていた索引が更新されるため、パーティションDDL文の実行時間が長くなる可能性があります。ただし、この増加した時間を、索引を更新せずにDDLを実行し、すべての索引を再作成する場合にかかる時間と比較する必要があります。パーティションのサイズが表サイズの5%に満たない場合は、経験則から言って、索引を更新する方が短時間ですみます。

  • EXCHANGE操作が高速な操作ではなくなりました。こちらも、DDLを実行してすべての索引を再作成する場合にかかる時間と比較する必要があります。

  • グローバル索引を含む表を更新する際の考慮事項は、次のとおりです。

    • 索引はその場で更新されます。索引の更新は記録され、REDOおよびUNDOレコードが生成されます。反対に、グローバル索引全体を再作成する場合は、NOLOGGINGモードで実行できます。

    • 索引全体を手動で再作成すると、領域がより有効に使用されて圧縮されるため、より効率的な索引が作成されます。

  • UPDATE INDEXES句は、索引構成表ではサポートされていません。ただし、DROP PARTITIONTRUNCATE PARTITIONおよびEXCHANGE PARTITION操作でUPDATE GLOBAL INDEXES句を使用して、索引構成表のグローバル索引を使用可能なままにできます。前述のリストのその他の操作では、索引構成表のグローバル索引は使用可能なままになります。また、索引構成表のローカル索引パーティションは、MOVE PARTITION操作後も使用可能なままです。

関連項目:

索引の更新の構文のALTER TABLEupdate_all_indexes_clauseの詳細は、『Oracle Database SQL言語リファレンス』を参照してください

4.3.2 パーティションを削除および切り捨てる非同期グローバル索引メンテナンス

パーティション・メンテナンス操作DROP PARTITIONおよびTRUNCATE PARTITIONは、メタデータのみの索引メンテナンスを実行して最適化されます。

DROPおよびTRUNCATEの非同期グローバル索引メンテナンスはデフォルトで実行されますが、UPDATE INDEXES句が下位互換性のために引き続き必要です。

次のリストは、非同期グローバル索引メンテナンスの制限事項をまとめています。

  • ヒープ表にのみ実行されます

  • オブジェクト型を含む表はサポートされません

  • ドメイン索引を含む表はサポートされません

  • ユーザーSYSには実行されません

索引のメンテナンス操作は、自動スケジューラ・ジョブSYS.PMO_DEFERRED_GIDX_MAINT_JOBを使用して実行し、すべてのグローバル索引をクリーンアップできます。デフォルトでは、このジョブは定期的に実行するようスケジュールされます。索引を事前にクリーンアップする場合、DBMS_SCHEDULER.RUN_JOBを使用していつでもこのジョブを実行できます。ジョブを変更して、特定の要件に基づくスケジュールで実行することもできます。ジョブを削除しないことをお薦めします。

次のオプションのいずれかを使用して、メンテナンスを必要とする索引のクリーンアップを強制することもできます。

  • DBMS_PART.CLEANUP_GIDX - このPL/SQLプロシージャは、クリーンアップを必要とする可能性があるシステムのグローバル索引のリストを収集し、索引をクリーンな状態にリストアするために必要な操作を実行します。

  • ALTER INDEX REBUILD [PARTITION] – このSQL文は、Oracle Database 12cリリース1 (12.1)より前のリリースで実行されるように、索引全体または索引パーティションを再作成します。結果の索引(パーティション)は、古いエントリを含みません。

  • ALTER INDEX [PARTITION] COALESCE CLEANUP - このSQL文は、索引ブロックの親がないエントリをクリーンアップします。

関連項目:

Oracle Schedulerによるジョブの管理の詳細は、『Oracle Database管理者ガイド』を参照してください

4.3.3 サブパーティション・テンプレートの変更

新しいサブパーティション・テンプレートと置き換えることで、コンポジット・パーティション表のサブパーティション・テンプレートを変更できます。

サブパーティション・テンプレートを使用する後続の操作(ADD PARTITIONまたはMERGE PARTITIONSなど)で、新しいサブパーティション・テンプレートが使用されます。既存のサブパーティションは変更されません。

時間隔 - *コンポジット・パーティション表のサブパーティション・テンプレートを変更すると、作成されていない時間隔パーティションに新しいサブパーティション・テンプレートが使用されます。

新しいサブパーティション・テンプレートを指定するには、ALTER TABLE SET SUBPARTITION TEMPLATE文を使用します。たとえば:

ALTER TABLE employees_sub_template
   SET SUBPARTITION TEMPLATE
         (SUBPARTITION e TABLESPACE ts1,
          SUBPARTITION f TABLESPACE ts2,
          SUBPARTITION g TABLESPACE ts3,
          SUBPARTITION h TABLESPACE ts4
         );

空のリストを指定することで、サブパーティション・テンプレートを削除できます。

ALTER TABLE employees_sub_template
   SET SUBPARTITION TEMPLATE ( );

4.3.4 メンテナンス操作のフィルタ処理

パーティション・メンテナンス操作は、データのフィルタ処理の追加をサポートするため、パーティションとデータ・メンテナンスを組み合せることができます。

フィルタ処理されたパーティション・メンテナンス操作は、パーティション・メンテナンスの一部としてデータのフィルタ処理を満たすデータのみを保持します。データのフィルタ処理の機能は、MOVE PARTITIONMERGE PARTITIONおよびSPLIT PARTITIONに適用されます。

例4-27に、ALTER TABLE文を使用してオープンでない注文(クローズ済注文)をすべて削除すると同時にパーティションを移動する方法を示します。

パーティション表にはフィルタ処理述語が必要です。また、オンラインで実行できるすべてのパーティション・メンテナンス操作(MOVEおよびSPLIT)は、フィルタ処理されたパーティション・メンテナンス操作として実行することもできます。ONLINEを指定すると、メンテナンス対象のパーティションに対するDML操作が許可されます。

オンライン・モードで実行されるフィルタ処理されたパーティション・メンテナンス操作は、同時進行中のDML操作にフィルタ述語を使用しません。フィルタ条件は、パーティション・メンテナンス操作の最初に一度だけ適用されます。そのため、後続のDMLは成功しますが、フィルタ処理の観点からは無視されます。どのようなDML操作であっても、パーティション・メンテナンスの開始時にフィルタ条件に一致しないレコードは保持されません。新しく挿入されたレコードは、パーティション・メンテナンス操作のフィルタ条件を満たすかどうかに関係なく、パーティション・キー基準に一致すると挿入されます。フィルタ条件はパーティション表自体に制限され、結合や副問合せ式など、他の表への参照は許可されません。

キーワードONLINE例4-27のSQL文で指定されている、次のシナリオを考えてみます。

  • パーティション・メンテナンス操作の開始後にstatus='open'に更新されるパーティションq1_2016の既存の注文レコードが、このパーティションに保持されていません。

  • パーティション・メンテナンス操作の開始後およびパーティション・メンテナンス操作の進行中に、status='closed'の新しい注文レコードをパーティションq1_2016に挿入できます。

例4-27 メンテナンス操作実行時のフィルタ処理句の使用

ALTER TABLE orders_move_part
  MOVE PARTITION q1_2016 TABLESPACE open_orders COMPRESS ONLINE
  INCLUDING ROWS WHERE order_state = 'open';

関連項目:

パーティション表や索引を作成および変更するためのパーティション化句の正確な構文、その使用に関する制限、および表の作成や変更に必要な特定の権限の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

4.4 パーティション表および索引のメンテナンス操作

パーティション表および索引で実行できる、様々なメンテナンス操作があります。

次の各トピックで、表と索引の両方に対するパーティションおよびサブパーティション・メンテナンスを実行する操作について説明します。

ノート:

  • メンテナンス操作に影響される索引または索引パーティションの使用性が説明されている箇所では、次のことを考慮してください。
    • UNUSABLEとマークできるのは、空ではない索引と索引パーティションのみです。空の場合には、USABLE/UNUSABLEのステータスは変更されません。

    • ステータスがUSABLEの索引または索引パーティションは、後続のDMLで更新されます。

  • パーティションおよびサブパーティションに対するSPLITMERGEMOVETRUNCATEおよびDROP操作を行うと、ORPHANED_ENTRIES AS YESになります。これは予期された動作です。

関連項目:

4.4.1 ドメイン索引がある表に対するマルチパーティション操作の制限事項と特殊要件

これらの制約は、ドメイン索引が作成されている表に対するマルチパーティションADDMERGESPLITDROPおよびTRUNCATE操作に適用されます。

ローカル・ドメイン索引がある表について

表にローカル・ドメイン索引がある場合、同じ文での複数のパーティションまたはサブパーティションに対するADDSPLITおよびDROP操作は許可されていません。各パーティションまたはサブパーティションは、別の文でのみ操作できます。

ローカル・ドメイン索引がある表に対するMERGE操作の場合は、2つのパーティションを使用できます。

表にローカル・ドメイン索引がある場合の、単一パーティションまたは表全体に対するTRUNCATEの実行はサポートされています。ローカル・ドメイン索引が存在する場合、単一のALTER TABLE文での複数パーティションの切り捨ては許可されていません。

グローバル・ドメイン索引がある表について

前述のマルチパーティション操作に関する制限事項は、ローカル・ドメイン索引にのみ適用されます。グローバル・ドメイン索引がある表の場合は、マルチパーティション操作がサポートされています。

ノート:

グローバル索引がある表の場合、単一の文を使用して複数のパーティションを操作するときは、その文にUPDATE INDEXES句を含めることが重要です。そうしないと、索引を使用できなくなります。

索引のチェック

複数のパーティションに対してADDSPLITDROPまたはMERGE操作を実行する前に、ALL_INDEXESビューを使用して索引をチェックできます。たとえば:

SELECT owner, index_name FROM SYS.ALL_INDEXES WHERE index_type IN ('DOMAIN', 'FUNCTION-BASED DOMAIN'); 

特定のTABLE_OWNER述語とTABLE_NAME述語を追加することで、問合せを絞り込みできます。たとえば:

SELECT owner, index_name FROM SYS.ALL_INDEXES WHERE index_type IN ('DOMAIN', 'FUNCTION-BASED DOMAIN') WHERE table_owner = 'MY_USER' AND table_name = 'MY_PART_TABLE'; 

4.4.2 パーティションおよびサブパーティションの追加について

この項では、パーティション表に新しいパーティションを手動で追加する方法、および多くのパーティション索引に明示的にパーティションを追加できない理由を説明します。

この項では、次の項目について説明します。

4.4.2.1 レンジ・パーティション表へのパーティションの追加

表の最後の既存パーティションの後、あるいは表の最初または表の中間にパーティションを追加できます。

ハイエンド(既存の最後のパーティションの後ろのポイント)に新しいパーティションを追加するには、ALTER TABLE ADD PARTITION文を使用します。表の最初または中間にパーティションを追加するには、SPLIT PARTITION句を使用します。

たとえば、前の12か月分に加え、今月のデータも含む表salesがあるとします。1999年1月1日を基準に、表領域tsxに格納される1月用のパーティションを追加します。

ALTER TABLE sales
      ADD PARTITION jan99 VALUES LESS THAN ( '01-FEB-1999' )
      TABLESPACE tsx;

レンジ・パーティション表に関連付けられているローカルおよびグローバル索引は、使用可能なままです。

4.4.2.2 ハッシュ・パーティション表へのパーティションの追加

ハッシュ・パーティション表にパーティションを追加すると、データベースにより、新しいパーティションに既存のパーティション(データベースが選択)から再度ハッシュされた行が、ハッシュ関数で決定されたとおりに移入されます。

その結果、表にデータが含まれる場合、ハッシュ・パーティションの追加に時間がかかる場合があります。

次の文では、表scubagearにハッシュ・パーティションを追加する2つの方法を示します。最初の文では、パーティション名がシステム生成される新しいハッシュ・パーティションが追加され、デフォルトの表領域に配置されます。2番目の文でも、新しいハッシュ・パーティションが追加されますが、そのパーティションには明示的にp_namedという名前が付けられ、表領域gear5に作成されます。

ALTER TABLE scubagear ADD PARTITION;

ALTER TABLE scubagear
      ADD PARTITION p_named TABLESPACE gear5;

次の表で説明するように、索引はUNUSABLEとマークされます。

表のタイプ 索引の動作

通常(ヒープ)

ALTER TABLE文の一部にUPDATE INDEXESを指定しない場合:

  • 新しいパーティションおよび行の再配布元の既存のパーティションのローカル索引がUNUSABLEとマークされ、再作成する必要があります。

  • すべてのグローバル索引またはパーティション・グローバル索引のすべてのパーティションがUNUSABLEとマークされ、再作成する必要があります。

索引構成

  • ローカル索引の場合、動作はヒープ表と同じです。

  • すべてのグローバル索引は使用可能なままです。

4.4.2.3 リスト・パーティション表へのパーティションの追加

このトピックの例は、パーティションをリスト - パーティション表に追加する方法を示します。

次の文で、リスト・パーティション表に新しいパーティションを追加する方法を示します。この例では、追加されるパーティションに物理属性およびNOLOGGINGが指定されています。

ALTER TABLE q1_sales_by_region 
   ADD PARTITION q1_nonmainland VALUES ('HI', 'PR')
      STORAGE (INITIAL 20K NEXT 20K) TABLESPACE tbs_3
      NOLOGGING;

追加するパーティションを説明する一連のリテラル値は、表のどのパーティションにも存在していない必要があります。

デフォルトのパーティションがあるリスト・パーティション表にはパーティションを追加できませんが、デフォルトのパーティションを分割することはできます。分割することで、指定した値で定義された新しいパーティションと、デフォルトのパーティションとして残る2つ目のパーティションを効率的に作成できます。

リスト・パーティション表に関連付けられているローカルおよびグローバル索引は、使用可能なままです。

4.4.2.4 時間隔パーティション表へのパーティションの追加

時間隔パーティション表には、明示的にパーティションを追加できません。ある時間隔のデータが挿入されると、データベースによってその時間隔のパーティションが自動的に作成されます。

ただし、データ・ディクショナリのマテリアライズ化されていない時間隔パーティション表のパーティションの交換、つまり時間隔定義を超えてデータ・ディクショナリの明示的なエントリを持つ場合、ALTER TABLE LOCK PARTITIONコマンドを使用して、パーティションを手動でマテリアライズ化する必要があります。

後続のパーティションの時間隔を変更するには、ALTER TABLE文のSET INTERVAL句を使用します。SET INTERVAL句は、既存の時間隔パーティションをレンジ・パーティションに変換し、定義済レンジ・パーティションの上限を決定し、その上限を超えるデータのために必要な場合は指定された時間隔のパーティションを自動的に作成します。副次的作用として、時間隔パーティション表にはMAXVALUESの表記がありません。

既存のレンジ・パーティションまたはレンジ - *コンポジット・パーティション表を、時間隔または時間隔 - *パーティション表に移行するには、SET INTERVAL句も使用します。後続の時間隔パーティションの作成を無効化し、効率的にレンジ・パーティション表に戻すには、SET INTERVAL句に空の値を使用します。作成された時間隔パーティションは、現在の上限値を使用してレンジ・パーティションに変換されます。

日付レンジの時間隔を増加するには、新しい時間隔の関連する上限値を指定していることを確認する必要があります。たとえば、1日単位の時間隔パーティション表トランザクションの時間隔パーティションの上限値が2007年1月30日で、月単位の時間隔パーティションに変更する場合、次の文ではエラーが発生します。

ALTER TABLE transactions SET INTERVAL (NUMTOYMINTERVAL(1,'MONTH');

ORA-14767: Cannot specify this interval with existing high bounds

月単位の時間隔に正常に変更するには、上限値が2007年2月1日の日付単位の別のパーティションを作成する必要があります。

LOCK TABLE transactions PARTITION FOR(TO_DATE('31-JAN-2007','dd-MON-yyyy') 
   IN SHARE MODE;

ALTER TABLE transactions SET INTERVAL (NUMTOYMINTERVAL(1,'MONTH');

時間隔パーティション表の下位パーティションはレンジ・パーティションです。時間隔パーティション表のレンジ部分にさらにパーティションを追加するには、レンジ・パーティションを分割します。

transactions表の時間隔パーティション化を無効化するには、次の文を使用します。

ALTER TABLE transactions SET INTERVAL ();
4.4.2.5 コンポジット* - ハッシュ・パーティション表へのパーティションの追加について

パーティションは、パーティション・レベルとハッシュ・サブパーティション・レベルの両方で追加できます。

4.4.2.5.1 * - ハッシュ・パーティション表へのパーティションの追加

このトピックの例は、新規パーティションを[レンジ | リスト | 時間隔] - ハッシュ・パーティション表に追加する方法を示します。

時間隔 - ハッシュ・パーティション表の場合、時間隔パーティションは自動的に作成されます。指定した数のサブパーティションを追加できるSUBPARTITIONS句を指定することも、特定のサブパーティションに名前を付けるSUBPARTITION句を指定することも可能です。SUBPARTITIONSまたはSUBPARTITION句が指定されていない場合、パーティションはサブパーティションの表レベルのデフォルトを継承します。時間隔 - ハッシュ・パーティション表の場合、マテリアライズ化されたレンジまたは時間隔パーティションに追加できるのはサブパーティションのみです。

この例では、2000年の第1四半期のデータが移入されるレンジ・パーティション q1_2000を、レンジ - ハッシュ・パーティション表salesに追加しています。表領域tbs5に格納される8つのサブパーティションがあります。サブパーティションを、表圧縮を使用するように明示的に設定することはできません。サブパーティションはパーティション・レベルから圧縮属性を継承し、この例では圧縮された形式で格納されます。

ALTER TABLE sales ADD PARTITION q1_2000
      VALUES LESS THAN (2000, 04, 01) COMPRESS
      SUBPARTITIONS 8 STORE IN tbs5;
4.4.2.5.2 * - ハッシュ・パーティション表へのサブパーティションの追加

ハッシュ・サブパーティションを[レンジ | リスト | 時間隔] - ハッシュ・パーティション表に追加するには、ALTER TABLE文のMODIFY PARTITION ADD SUBPARTITION句を使用します。

新しく追加されたサブパーティションには、同じパーティションのその他のサブパーティションから再度ハッシュされた行が、ハッシュ関数で決定されたとおりに移入されます。時間隔 - ハッシュ・パーティション表の場合、マテリアライズ化されたレンジまたは時間隔パーティションに追加できるのはサブパーティションのみです。

次の例では、表divingのレンジ・パーティションlocations_usに、表領域us1に格納される新しいハッシュ・サブパーティションus_loc5が追加されています。

ALTER TABLE diving MODIFY PARTITION locations_us
      ADD SUBPARTITION us_locs5 TABLESPACE us1;

UPDATE INDEXESを指定しない場合は、追加および再度ハッシュされたサブパーティションに対応する索引サブパーティションを再作成する必要があります。

4.4.2.6 コンポジット* - リスト・パーティション表へのパーティションの追加について

パーティションは、パーティション・レベルとリスト・サブパーティション・レベルの両方で追加できます。

4.4.2.6.1 * - リスト・パーティション表へのパーティションの追加

このトピックの例は、新規パーティションを[レンジ | リスト | 時間隔] - リスト・パーティション表に追加する方法を示します。

特定の時間隔のデータが挿入されると、データベースにより時間隔パーティションが自動的に作成されます。サブパーティションに名前を付け、値リストを提供するには、SUBPARTITION句を指定できます。SUBPARTITION句が指定されていない場合、パーティションはサブパーティション・テンプレートを継承します。サブパーティション・テンプレートがない場合には、単一のデフォルトのサブパーティションが作成されます。

例4-28の文では、レンジ - リスト・メソッドでパーティション化されたquarterly_regional_sales表に、新しいパーティションを追加しています。指定されていないパーティションでは表レベルのデフォルトが継承されますが、この新しいパーティションにはいくつかの新しい物理属性が指定されています。

例4-28 レンジ - リスト・パーティション表へのパーティションの追加

ALTER TABLE quarterly_regional_sales 
   ADD PARTITION q1_2000 VALUES LESS THAN (TO_DATE('1-APR-2000','DD-MON-YYYY'))
      STORAGE (INITIAL 20K NEXT 20K) TABLESPACE ts3 NOLOGGING
         (
          SUBPARTITION q1_2000_northwest VALUES ('OR', 'WA'),
          SUBPARTITION q1_2000_southwest VALUES ('AZ', 'UT', 'NM'),
          SUBPARTITION q1_2000_northeast VALUES ('NY', 'VM', 'NJ'),
          SUBPARTITION q1_2000_southeast VALUES ('FL', 'GA'),
          SUBPARTITION q1_2000_northcentral VALUES ('SD', 'WI'),
          SUBPARTITION q1_2000_southcentral VALUES ('OK', 'TX')
         );
4.4.2.6.2 * - リスト・パーティション表へのサブパーティションの追加

リスト・サブパーティションを[レンジ | リスト | 時間隔] - リスト・パーティション表に追加するには、ALTER TABLE文のMODIFY PARTITION ADD SUBPARTITION句を使用します。

時間隔 - リスト・パーティション表の場合、マテリアライズ化されたレンジまたは時間隔パーティションに追加できるのはサブパーティションのみです。

次の文では、レンジ - リスト・パーティション表quarterly_regional_salesの一連の既存のサブパーティションに、新しいサブパーティションを追加します。新しいサブパーティションは、表領域ts2に作成されます。

ALTER TABLE quarterly_regional_sales
   MODIFY PARTITION q1_1999 
      ADD SUBPARTITION q1_1999_south
         VALUES ('AR','MS','AL') tablespace ts2;
4.4.2.7 コンポジット* - レンジ・パーティション表へのパーティションの追加について

パーティションは、パーティション・レベルとレンジ・サブパーティション・レベルの両方で追加できます。

4.4.2.7.1 * - レンジ・パーティション表へのパーティションの追加

このトピックの例は、新規パーティションを[レンジ | リスト | 時間隔] - レンジ・パーティション表に追加する方法を示します。

特定の時間隔のデータが挿入されると、データベースにより時間隔 - レンジ・パーティション表に時間隔パーティションが自動的に作成されます。特定のサブパーティションに名前を付け、レンジを指定するには、SUBPARTITION句を指定します。SUBPARTITION句が指定されていない場合、パーティションは、表レベルに指定されたサブパーティション・テンプレートを継承します。サブパーティション・テンプレートがない場合には、最大値がMAXVALUEの単一のサブパーティションが作成されます。

例4-29では、2007年1月に注文された出荷品に関するデータが移入されるレンジ・パーティションp_2007_janを、レンジ - レンジ・パーティション表shipmentsに追加します。3つのサブパーティションがあります。サブパーティションはパーティション・レベルから圧縮属性を継承し、この例では圧縮された形式で格納されます。

例4-29 レンジ - レンジ・パーティション表へのパーティションの追加

ALTER TABLE shipments
   ADD PARTITION p_2007_jan
      VALUES LESS THAN (TO_DATE('01-FEB-2007','dd-MON-yyyy')) COMPRESS
      ( SUBPARTITION p07_jan_e VALUES LESS THAN (TO_DATE('15-FEB-2007','dd-MON-yyyy'))
      , SUBPARTITION p07_jan_a VALUES LESS THAN (TO_DATE('01-MAR-2007','dd-MON-yyyy'))
      , SUBPARTITION p07_jan_l VALUES LESS THAN (TO_DATE('01-APR-2007','dd-MON-yyyy'))
      ) ;
4.4.2.7.2 * - レンジ・パーティション表へのサブパーティションの追加

レンジ・サブパーティションを[レンジ | リスト | 時間隔] - レンジ・パーティション表に追加するには、ALTER TABLE文のMODIFY PARTITION ADD SUBPARTITION句を使用します。

時間隔 - レンジ・パーティション表の場合、パーティションを追加できるのは、マテリアライズ化されたレンジまたは時間隔パーティションのみです。

次の例では、order_dateが2007年1月で、delivery_dateが2007年4月1日以降のすべての値が含まれるshipments表に、レンジ・サブパーティションを追加します。

ALTER TABLE shipments
   MODIFY PARTITION p_2007_jan
      ADD SUBPARTITION p07_jan_vl VALUES LESS THAN (MAXVALUE) ;
4.4.2.8 参照パーティション表へのパーティションまたはサブパーティションの追加について

レンジ、ハッシュ、リストまたはコンポジット・パーティション表にパーティションやサブパーティションを追加できるのと同じように、参照パーティション定義の親表にもパーティションまたはサブパーティションを追加できます。

追加操作は、子参照パーティション表に自動的にカスケードされます。親表へのパーティションまたはサブパーティションの追加時に、DEPENDENT TABLES句により、依存表に特定のプロパティを設定できます。

4.4.2.9 索引パーティションの追加

ローカル索引には、明示的にパーティションを追加できません。かわりに、基礎となる表にパーティションを追加する場合にのみ、ローカル索引に新しいパーティションが追加されます。

特に、表にローカル索引が定義されていて、パーティションを追加するALTER TABLE文を発行する場合には、一致するパーティションがローカル索引にも追加されます。データベースにより、新しい索引パーティションに名前とデフォルトの物理記憶域属性が割り当てられますが、ADD PARTITION操作が完了した後にそれらを変更できます。

ADD PARTITION操作で、最初に索引のデフォルト属性を変更することにより、索引パーティションの新しい表領域を事実上指定できます。たとえば、リスト・パーティション表q1_sales_by_regionに、ローカル索引q1_sales_by_region_locixを作成したとします。「リスト・パーティション表へのパーティションの追加」に示されているように、新しいパーティションq1_nonmainlandを追加する前に次の文を発行した場合、対応する索引パーティションは表領域tbs_4に作成されます。

ALTER INDEX q1_sales_by_region_locix
   MODIFY DEFAULT ATTRIBUTES TABLESPACE tbs_4;

それ以外の場合は、追加した後に、次の文を使用して索引パーティションをtbs_4に移動する必要があります。

ALTER INDEX q1_sales_by_region_locix 
   REBUILD PARTITION q1_nonmainland TABLESPACE tbs_4;
 

ALTER INDEXADD PARTITION構文を使用して、ハッシュ・パーティション・グローバル索引にパーティションを追加できます。データベースによりハッシュ・パーティションが追加され、索引の既存のハッシュ・パーティションから再度ハッシュされた索引エントリが、ハッシュ関数で決定されたとおりに移入されます。次の文では、「ハッシュ・パーティション・グローバル索引の作成」に示されている索引hgidxに、パーティションを追加します

ALTER INDEX hgidx ADD PARTITION p5;

最高位パーティションにはMAXVALUEというパーティション・バウンドがあるため、レンジ・パーティション・グローバル索引にはパーティションを追加できません。新しい最高位パーティションを追加するには、ALTER INDEX SPLIT PARTITION文を使用します。

4.4.2.10 複数のパーティションの追加

同じALTER TABLE文のADD PARTITION句およびADD SUBPARTITION句を使用して、複数の新しいパーティションおよびサブパーティションを追加できます。

複数のパーティションを追加する場合、ローカルおよびグローバル索引操作は、単一のパーティションを追加する場合と同じ操作です。複数のパーティションおよびサブパーティションの追加は、レンジ、リストおよびシステムのパーティションまたはサブパーティションにのみサポートされています。

MAXVALUEパーティションが定義されていない場合、レンジ・パーティションまたはコンポジット・レンジ・パーティション表の最高位(既存の最後のパーティションの後)に上限値の昇順で示される複数のレンジ・パーティションを追加できます。同様に、DEFAULTパーティションが存在しない場合、一連の新しいパーティション値を使用して、複数のリスト・パーティションを表に追加できます。

個々のパーティションを指定することで、単一のSQL文を使用して複数のシステム・パーティションを追加できます。たとえば、次のSQL文は、複数のパーティションを例4-1で作成されたレンジ・パーティション表salesに追加します。

ALTER TABLE sales ADD 
  PARTITION sales_q1_2007 VALUES LESS THAN (TO_DATE('01-APR-2007','dd-MON-yyyy')),
  PARTITION sales_q2_2007 VALUES LESS THAN (TO_DATE('01-JUL-2007','dd-MON-yyyy')),
  PARTITION sales_q3_2007 VALUES LESS THAN (TO_DATE('01-OCT-2007','dd-MON-yyyy')),
  PARTITION sales_q4_2007 VALUES LESS THAN (TO_DATE('01-JAN-2008','dd-MON-yyyy'))
;

BEFORE句を使用して、1つの既存のパーティションのみとの関係で複数の新しいシステム・パーティションを追加できます。次のSQL文は、BEFORE句を使用して複数の個々のパーティションを追加する例を示します。

CREATE TABLE system_part_tab1 (number1 integer, number2 integer) 
PARTITION BY SYSTEM
( PARTITION p1,
  PARTITION p2,
  PARTITION p3,
  PARTITION p_last);

ALTER TABLE system_part_tab1 ADD 
  PARTITION p4,
  PARTITION p5,
  PARTITION p6
  BEFORE PARTITION p_last;

SELECT SUBSTR(TABLE_NAME,1,18) table_name, TABLESPACE_NAME, 
   SUBSTR(PARTITION_NAME,1,16) partition_name 
   FROM USER_TAB_PARTITIONS WHERE TABLE_NAME='SYSTEM_PART_TAB1';
TABLE_NAME         TABLESPACE_NAME                PARTITION_NAME
------------------ ------------------------------ ----------------
SYSTEM_PART_TAB1   USERS                          P_LAST
SYSTEM_PART_TAB1   USERS                          P6
SYSTEM_PART_TAB1   USERS                          P5
SYSTEM_PART_TAB1   USERS                          P4
SYSTEM_PART_TAB1   USERS                          P3
SYSTEM_PART_TAB1   USERS                          P2
SYSTEM_PART_TAB1   USERS                          P1

4.4.3 パーティションおよびサブパーティションの結合について

パーティションの結合は、ハッシュ・パーティション表または索引のパーティション数や、* - ハッシュ・パーティション表のサブパーティション数を減らす方法の1つです。

ハッシュ・パーティションを結合すると、そのコンテンツはハッシュ関数で決定された1つ以上の残りのパーティションに再配布されます。結合される特定のパーティションはデータベースにより選択され、コンテンツの再配布後に削除されます。参照パーティション表定義の親表のハッシュ・パーティションまたはサブパーティションを結合すると、参照パーティション表は新しいパーティション化定義を自動的に継承します。

次の表で説明するように、索引パーティションはUNUSABLEとマークされます。

表のタイプ 索引の動作

通常(ヒープ)

ALTER TABLE文の一部にUPDATE INDEXESを指定しない場合:

  • 選択したパーティションに対応するローカル索引パーティションも削除されます。取り込む側の1つ以上のパーティションに対応するローカル索引パーティションはUNUSABLEとマークされ、再作成する必要があります。

  • すべてのグローバル索引またはパーティション・グローバル索引のすべてのパーティションがUNUSABLEとマークされ、再作成する必要があります。

索引構成

  • ヒープ索引で説明したように、一部のローカル索引はUNUSABLEとマークされます。

  • すべてのグローバル索引は使用可能なままです。

この項では、次の項目について説明します。

4.4.3.1 ハッシュ・パーティション表でのパーティションの結合

ハッシュ・パーティション表でパーティションを結合する場合には、ALTER TABLE COALESCE PARTITION文が使用されます。

次の文では、パーティションを結合することにより、表のパーティション数が1つ削減されています。

ALTER TABLE ouu1
     COALESCE PARTITION;
4.4.3.2 * - ハッシュ・パーティション表でのサブパーティションの結合

ALTER TABLE COALESCE SUBPARTITION文は、ハッシュ・パーティション表内のサブパーティションの結合に使用されます。

次の文により、パーティションus_locationsのサブパーティションのコンテンツが、同じパーティションの1つ以上の残りのサブパーティション(ハッシュ関数で決定)に分散されます。時間隔パーティション表の場合、結合できるのは、マテリアライズ化されたレンジまたは時間隔パーティションのハッシュ・サブパーティションのみです。基本的に、この操作は、「* - ハッシュ・パーティション表へのサブパーティションの追加」で説明したMODIFY PARTITION ADD SUBPARTITION句の逆の操作です。

ALTER TABLE diving MODIFY PARTITION us_locations
     COALESCE SUBPARTITION;
4.4.3.3 ハッシュ・パーティション・グローバル索引の結合

ALTER INDEXCOALESCE PARTITION句を使用して、ハッシュ・パーティション・グローバル索引の索引パーティション数を1つ減らすようにデータベースに指示できます。

データベースにより、ハッシュ・パーティションの要件に基づいて、結合するパーティションが選択されます。次の文では、「ハッシュ・パーティション・グローバル索引の作成」で作成されたhgidx索引のパーティション数が1つ削減されます。

ALTER INDEX hgidx COALESCE PARTITION;

4.4.4 パーティションおよびサブパーティションの削除について

レンジ、時間隔、リストまたはコンポジット* - [レンジ | リスト]パーティション表からパーティションを削除できます。

時間隔パーティション表の場合は、マテリアライズ化されたレンジまたは時間隔パーティションのみ削除できます。ハッシュ・パーティション表またはコンポジット* - ハッシュ・パーティション表のハッシュ・サブパーティションの場合は、かわりに、結合操作を実行する必要があります。

参照パーティション表からパーティションを削除することはできません。かわりに、親表での削除操作がすべての子表にカスケードされます。

この項では、次の項目について説明します。

4.4.4.1 表パーティションの削除

表パーティションを削除するには、ALTER TABLE SQL文でDROP PARTITIONまたはDROP SUBPARTITIONを使用します。

次の文を使用して、表、パーティションまたはサブパーティションを削除できます。

  • ALTER TABLE DROP PARTITION: 表パーティションを削除する場合

  • ALTER TABLE DROP SUBPARTITION: コンポジット* - [レンジ | リスト]パーティション表のサブパーティションを削除する場合

パーティション内のデータを保持するには、DROP PARTITION文ではなくMERGE PARTITION文を使用します。

パーティションを削除せずにパーティションのデータを削除するには、TRUNCATE PARTITION文を使用します。

表にローカル索引が定義されている場合、この文では、ローカル索引からも一致するパーティションまたはサブパーティションが削除されます。次のいずれかが当てはまる場合、すべてのグローバル索引またはパーティション・グローバル索引のすべてのパーティションがUNUSABLEとマークされます。

  • UPDATE INDEXESを指定する(索引構成表には指定できません。かわりにUPDATE GLOBAL INDEXESを使用してください)。

  • 削除するパーティションまたはそのサブパーティションが空である。

ノート:

  • 表にパーティションが1つだけ含まれる場合、そのパーティションは削除できません。かわりに表を削除する必要があります。

  • 時間隔パーティション表または時間隔 - *コンポジット・パーティション表のレンジ・パーティション・セクションにある最高位のレンジ・パーティションは削除できません。

  • 非同期グローバル索引メンテナンスでは、パーティション削除の索引更新操作はメタデータのみで、すべてのグローバル索引が有効なままです。

  • Oracle Databaseのごみ箱の設定にかかわらず、パーティションの削除によってそのパーティションがごみ箱に入れられることはありません。削除したパーティションは、ただちにシステムから削除されます。

次の項では、表パーティションの削除に関するいくつかのシナリオを示します。

関連項目:

4.4.4.1.1 データおよびグローバル索引を含む表からのパーティションの削除

いくつかの方法を使用して、データおよびグローバル索引を含む表からパーティションを削除できます。

パーティションにデータが含まれている場合や、表に1つ以上のグローバル索引が定義されている場合には、次のいずれかの方法(方法1、2または3)を使用して表パーティションを削除します。

方法1

グローバル索引をメンテナンスせずにALTER TABLE DROP PARTITION文を発行します。その後、索引(または索引パーティション)がUNUSABLEとマークされるため、(パーティション化されているかどうかに関係なく)すべてのグローバル索引を再作成する必要があります。次の文で、sales表からパーティションdec98を削除し、パーティション化されていないグローバル索引を再作成する例を示します。

ALTER TABLE sales DROP PARTITION dec98;
ALTER INDEX sales_area_ix REBUILD;

索引sales_area_ixがレンジ・パーティション・グローバル索引の場合には、その索引のすべてのパーティションを再作成する必要があります。さらに、1文で索引のすべてのパーティションを再作成することはできません。索引の各パーティションに対して、別々にREBUILD文を発行する必要があります。次の文では、索引パーティションjan99_ixからdec99_ixを再作成します。

ALTER INDEX sales_area_ix REBUILD PARTITION jan99_ix;
ALTER INDEX sales_area_ix REBUILD PARTITION feb99_ix;
ALTER INDEX sales_area_ix REBUILD PARTITION mar99_ix;
...
ALTER INDEX sales_area_ix REBUILD PARTITION dec99_ix;

これは、削除されるパーティションに表の合計データの大部分が含まれる大規模な表に最適な方法です。非同期グローバル索引メンテナンスは、索引メンテナンスを必要とせずにグローバル索引を有効なまま保持しますが、UPDATE INDEXES句を使用してこの新しい機能を有効にする必要があります。この動作によって、下位互換性が保証されます。

方法2

ALTER TABLE DROP PARTITION文を発行する前に、DELETE文を発行してパーティションからすべての行を削除します。DELETE文により、グローバル索引が更新されます。

たとえば、最初のパーティションを削除するには、次の文を発行します。

DELETE FROM sales partition (dec98);
ALTER TABLE sales DROP PARTITION dec98;

これは、小規模な表、または削除されるパーティションに含まれる表の合計データの割合が少ない場合に、大規模な表に最適な方法です。

方法3

ALTER TABLE文にUPDATE INDEXESを指定します。実行すると、新しい非同期グローバル索引メンテナンスが利用されます。索引は有効なまま変化しません。

ALTER TABLE sales DROP PARTITION dec98
     UPDATE INDEXES;
4.4.4.1.2 データおよび参照整合性制約を含むパーティションの削除

いくつかの方法を使用して、データおよび参照整合性制約を含むパーティションを削除できます。

パーティションにデータが含まれ、表に参照整合性制約がある場合には、次のいずれかの方法(方法1または2)を選択して表パーティションを削除します。この表にあるのはローカル索引のみであるため、索引を再作成する必要はありません。

方法1

削除するパーティションのデータを参照しているデータがない場合は、参照表の整合性制約を無効化してALTER TABLE DROP PARTITION文を発行し、整合性制約を再度有効化します。

これは、削除されるパーティションに表の合計データの大部分が含まれる大規模な表に最適な方法です。削除するパーティションのデータを参照するデータがある場合には、参照元のすべてのデータを削除して、参照整合性制約を再度有効化できるようにしてください。

方法2

参照表にデータがある場合は、ALTER TABLE DROP PARTITION文を発行する前に、DELETE文を発行してパーティションからすべての行を削除できます。DELETE文によって、参照整合性制約が施行されます。また、トリガーが起動されて、REDOログとUNDOログが生成されます。ON DELETE CASCADEオプションを指定して制約を作成すると削除が成功し、参照表からもすべての行が削除されます。

DELETE FROM sales partition (dec94);
ALTER TABLE sales DROP PARTITION dec94;

これは、小規模な表、または削除されるパーティションに含まれる表の合計データの割合が少ない場合に、大規模な表に最適な方法です。

4.4.4.2 時間隔パーティションの削除

時間隔パーティション表の時間隔パーティションを削除できます。

この操作により、その時間隔のデータのみが削除され、時間隔定義はそのまま残ります。削除されたばかりの時間隔にデータが挿入された場合は、データベースにより時間隔パーティションが再度作成されます。

時間隔パーティション表のレンジ・パーティションも削除できます。時間隔パーティション表のレンジ・パーティションを削除するルールは、レンジ・パーティション表のレンジ・パーティションの削除ルールと同じです。一連のレンジ・パーティションの中間にあるレンジ・パーティションを削除すると、次のレンジ・パーティションの下限が、削除したレンジ・パーティションの下限に切り替わります。時間隔パーティション表のレンジ・パーティション・セクションにある最高位のレンジ・パーティションは削除できません。

次の例では、sales表から2007年9月の時間隔パーティション表を削除します。ローカル索引しかないため、索引は無効化されません。

ALTER TABLE sales DROP PARTITION FOR(TO_DATE('01-SEP-2007','dd-MON-yyyy'));
4.4.4.3 索引パーティションの削除

ローカル索引のパーティションは明示的に削除できません。かわりに、基礎となる表からパーティションを削除した場合にのみ、ローカル索引パーティションが削除されます。

グローバル索引パーティションが空の場合は、ALTER INDEX DROP PARTITION文を発行することでそのパーティションを明示的に削除できます。ただし、グローバル索引パーティションにデータが含まれる場合は、パーティションを削除すると次の最高位パーティションがUNUSABLEとマークされる原因になります。たとえば、索引パーティションP1を削除する必要があり、P2が次の最高位パーティションであるとします。次の文を発行する必要があります。

ALTER INDEX npr DROP PARTITION P1;
ALTER INDEX npr REBUILD PARTITION P2;

ノート:

グローバル索引では、最高位パーティションを削除できません。

4.4.4.4 複数のパーティションの削除

SQL ALTER TABLE文のDROP PARTITIONおよびDROP SUBPARTITION句を使用して、レンジまたはリスト・パーティション表から複数のパーティションまたはサブパーティションを削除できます。

たとえば、次のSQL文は、レンジ・パーティション表salesから複数のパーティションを削除します。

ALTER TABLE sales DROP PARTITION sales_q1_2008, sales_q2_2008,
     sales_q3_2008, sales_q4_2008;

表のすべてのパーティションを削除できません。複数のパーティションを削除する場合、ローカルおよびグローバル索引操作は、単一のパーティションを削除する場合と同じ操作です。

4.4.5 パーティションおよびサブパーティションの交換について

データ・セグメントを交換することで、パーティションまたはサブパーティションを非パーティション表に、非パーティション表をパーティション表のパーティションまたはサブパーティションに変換できます。

ハッシュ・パーティション表をコンポジット* - ハッシュ・パーティション表のパーティションに変換することも、コンポジット* - ハッシュ・パーティション表のパーティションをハッシュ・パーティション表に変換することも可能です。同様に、レンジ - リスト・パーティション表をコンポジット* - レンジまたはリスト・パーティション表のパーティションに変換することも、コンポジット* - レンジまたはリスト・パーティション表のパーティションをレンジ - リスト・パーティション表に変換することも可能です。

表パーティションの交換は、パーティション表の内外で迅速にデータを取得するのに便利です。たとえば、データ・ウェアハウス環境で、パーティションの交換を行うと、新しい増分データの既存のパーティション表への高速データ・ローディングが容易になります。

交換プロセスでは、ソースのデータがターゲットに移動され、ターゲットのデータがソースに移動されることに注意してください。

OLTP環境やデータ・ウェアハウス環境では、パーティション表の古いデータ・パーティションを交換することで利点が得られます。実際には削除されずにパーティション表からデータがパージされ、後から個別にアーカイブできます。

パーティションを交換すると、ロギング属性が保持されます。INCLUDING INDEXES句でローカル索引も交換するかどうか、およびWITH VALIDATION句で行が適切にマッピングされていることを検証するかどうかをオプションで指定できます。

ノート:

パーティションの交換操作にWITHOUT VALIDATIONを指定する場合、これに関連するのはデータ・ディクショナリの更新のみであるため、通常は高速な操作です。ただし、交換操作に関連する表またはパーティション表に主キーがある場合や一意制約が有効化されている場合には、制約の整合性を維持するため、交換操作はWITH VALIDATIONが指定されているように実行されます。

この検証アクティビティのオーバーヘッドを避けるには、パーティションの交換操作を実行する前に、各制約に対して次の文を発行します。

ALTER TABLE table_name
     DISABLE CONSTRAINT constraint_name KEEP INDEX

交換後に制約を有効化します。

WITHOUT VALIDATIONを指定する場合は、交換するデータが交換するパーティションに含まれることを確認する必要があります。間違ったパーティションに不正に挿入されたレコードを識別するには、ORA_PARTITION_VALIDATION SQL関数を使用できます。

UPDATE INDEXESを指定しないかぎり、パーティションをUNUSABLEとして交換する表のグローバル索引またはすべてのグローバル索引パーティションが、Oracle Databaseによりマークされます。交換が行われる表のグローバル索引またはグローバル索引パーティションは、無効化されたままになります。

索引構成表にはUPDATE INDEXESは使用できません。かわりにUPDATE GLOBAL INDEXESを使用してください。

DBMS_STATS表プリファレンスのINCREMENTALがtrueに設定され、INCREMENTAL_LEVELTABLEに設定されると、統計が非パーティション表で収集された場合にパーティション表の増分統計がパーティション交換操作でメンテナンスされます。

ノート:

仮想列の列統計が不適当な場合、その古い統計を保持するのではなく、列統計は削除されます。この削除についての情報は、アラート・ログ・ファイルに書き込まれます。

この項では、次の項目について説明します。

関連項目:

4.4.5.1 パーティション表と交換するための表の作成

FOR EXCHANGE WITH句を使用すると、パーティション表の形状と完全に一致し、パーティション交換コマンドに適するように表を作成できます。ただし、索引はこのコマンドの操作としては作成されません。

CREATE TABLEFOR EXCHANGE WITH句は、非パーティション表とパーティション表の完全一致を提供するため、CREATE TABLE AS SELECT文が改善されます。

次のリストは、CREATE TABLE FOR EXCHANGE WITH DDL操作の効果をまとめたものです。

  • このDDL操作のユースケースにより、パーティション交換DDLで使用される表の作成が容易になります。

  • この操作により、列の順序および列のプロパティの点で交換対象の表のクローンが作成されます。

  • 列の名前は変更できません。作成される表は、交換対象の表から名前を継承します。

  • DDL操作中に指定できる論理プロパティのみが、表のパーティション化指定です。

    パーティション化句は、コンポジット・パーティション表のパーティションとの交換にのみ関連します。この場合、nサブパーティションを含むパーティションは、サブパーティションと一致するnパーティションを含むパーティション表と交換されます。このシナリオのこの交換には、パーティション化句の定義が必要です。

    サブパーティション化は、パーティション間で非対象となります。パーティション化句は、交換対象のパーティションのサブパーティション化と完全に一致する必要があります。

  • 指定できる物理プロパティは、主な表セグメント属性です。

  • このDDL操作でコピーされる列プロパティには、使用不可の列、非表示の列、仮想式の列、関数索引式の列、他の内部設定や属性などが含まれます。

次に、列の順序付けとプロパティについて既存の表の形式を模倣する表を作成するには、CREATE TABLE文でFOR EXCHANGE WITH句を使用する例を示します。

例4-30 CREATE TABLEのFOR EXCHANGE WITH句の使用

CREATE TABLE sales_by_year_table
  ( prod_id       NUMBER        NOT NULL,
    cust_id       NUMBER        NOT NULL,
    time_id       DATE          NOT NULL,
    channel_id    NUMBER        NOT NULL,
    promo_id      NUMBER        NOT NULL,
    quantity_sold NUMBER(10,2)  NOT NULL,
    amount_sold   NUMBER(10,2)  NOT NULL
  )
    PARTITION BY RANGE (time_id)
     (PARTITION sales_2016 VALUES LESS THAN (TO_DATE('01-01-2017','dd-mm-yyyy')),
      PARTITION sales_2017 VALUES LESS THAN (TO_DATE('01-01-2018','dd-mm-yyyy')),
      PARTITION sales_2018 VALUES LESS THAN (TO_DATE('01-01-2019','dd-mm-yyyy')),
      PARTITION sales_2019 VALUES LESS THAN (TO_DATE('01-01-2020','dd-mm-yyyy')),
      PARTITION sales_future VALUES LESS THAN (MAXVALUE)
 );

DESCRIBE sales_by_year_table
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 PROD_ID                                   NOT NULL NUMBER
 CUST_ID                                   NOT NULL NUMBER
 TIME_ID                                   NOT NULL DATE
 CHANNEL_ID                                NOT NULL NUMBER
 PROMO_ID                                  NOT NULL NUMBER
 QUANTITY_SOLD                             NOT NULL NUMBER(10,2)
 AMOUNT_SOLD                               NOT NULL NUMBER(10,2)

CREATE TABLE sales_later_year_table
  FOR EXCHANGE WITH TABLE sales_by_year_table;

DESCRIBE sales_later_year_table
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 PROD_ID                                   NOT NULL NUMBER
 CUST_ID                                   NOT NULL NUMBER
 TIME_ID                                   NOT NULL DATE
 CHANNEL_ID                                NOT NULL NUMBER
 PROMO_ID                                  NOT NULL NUMBER
 QUANTITY_SOLD                             NOT NULL NUMBER(10,2)
 AMOUNT_SOLD                               NOT NULL NUMBER(10,2)
4.4.5.2 レンジ、ハッシュまたはリスト・パーティションの交換

レンジ、ハッシュまたはリスト・パーティション表のパーティションを非パーティション表と交換する場合、またはその逆を行う場合は、ALTER TABLE EXCHANGE PARTITION文を使用します。

次に、レンジ・パーティションを非パーティション表と交換する例を示します。

例4-31 レンジ・パーティションの交換

CREATE TABLE sales_future_table
  ( prod_id       NUMBER        NOT NULL,
    cust_id       NUMBER        NOT NULL,
    time_id       DATE          NOT NULL,
    channel_id    NUMBER        NOT NULL,
    promo_id      NUMBER        NOT NULL,
    quantity_sold NUMBER(10,2)  NOT NULL,
    amount_sold   NUMBER(10,2)  NOT NULL
  )
    PARTITION BY RANGE (time_id)
     (PARTITION s_2020 VALUES LESS THAN (TO_DATE('01-01-2021','dd-mm-yyyy')),
      PARTITION s_2021 VALUES LESS THAN (TO_DATE('01-01-2022','dd-mm-yyyy')),
      PARTITION s_2022 VALUES LESS THAN (TO_DATE('01-01-2023','dd-mm-yyyy'))
 );

CREATE TABLE sales_exchange_table
  FOR EXCHANGE WITH TABLE sales_future_table;

INSERT INTO sales_exchange_table VALUES (1002,110,TO_DATE('19-02-2020','dd-mm-yyyy'),12,18,150,4800);
INSERT INTO sales_exchange_table VALUES (1001,100,TO_DATE('12-03-2020','dd-mm-yyyy'),10,15,400,6500);
INSERT INTO sales_exchange_table VALUES (1001,100,TO_DATE('31-05-2020','dd-mm-yyyy'),10,15,600,8000);
INSERT INTO sales_exchange_table VALUES (2105,101,TO_DATE('25-06-2020','dd-mm-yyyy'),12,19,100,3000);
INSERT INTO sales_exchange_table VALUES (1002,120,TO_DATE('31-08-2020','dd-mm-yyyy'),10,15,400,6000);
INSERT INTO sales_exchange_table VALUES (2105,101,TO_DATE('25-10-2020','dd-mm-yyyy'),12,19,250,7500);

ALTER TABLE sales_future_table
    EXCHANGE PARTITION s_2020 WITH TABLE sales_exchange_table;

SELECT * FROM sales_future_table PARTITION(s_2020);
   PROD_ID    CUST_ID TIME_ID   CHANNEL_ID   PROMO_ID QUANTITY_SOLD AMOUNT_SOLD
---------- ---------- --------- ---------- ---------- ------------- -----------
      1002        110 19-FEB-20         12         18           150        4800
      1001        100 12-MAR-20         10         15           400        6500
      1001        100 31-MAY-20         10         15           600        8000
      2105        101 25-JUN-20         12         19           100        3000
      1002        120 31-AUG-20         10         15           400        6000
      2105        101 25-OCT-20         12         19           250        7500
6 rows selected.

REM Note that all records have been removed from the sales_exchange_table
SELECT * FROM sales_exchange_table;
no rows selected

INSERT INTO sales_exchange_table VALUES (1002,110,TO_DATE('15-02-2021','dd-mm-yyyy'),12,18,300,9500);
INSERT INTO sales_exchange_table VALUES (1002,120,TO_DATE('31-03-2021','dd-mm-yyyy'),10,15,200,3000);
INSERT INTO sales_exchange_table VALUES (2105,101,TO_DATE('25-04-2021','dd-mm-yyyy'),12,19,150,9000);

ALTER TABLE sales_future_table
    EXCHANGE PARTITION s_2021 WITH TABLE sales_exchange_table;

SELECT * FROM sales_future_table PARTITION(s_2021);
   PROD_ID    CUST_ID TIME_ID   CHANNEL_ID   PROMO_ID QUANTITY_SOLD AMOUNT_SOLD
---------- ---------- --------- ---------- ---------- ------------- -----------
      1002        110 15-FEB-21         12         18           300        9500
      1002        120 31-MAR-21         10         15           200        3000
      2105        101 25-APR-21         12         19           150        9000
3 rows selected.
4.4.5.3 時間隔パーティション表のパーティションの交換

時間隔パーティション表の時間隔パーティションを交換できます。ただし、パーティションを交換する前に、時間隔パーティションが作成されていることを確認する必要があります。

次の例では、2007年1月1日現在に、月単位のパーティションを使用して時間隔パーティション化された、interval_sales表のパーティションの交換を示します。この例では、パーティション交換ロードを使用して、表に2007年6月のデータを追加する方法を示します。interval_sales表にはローカル索引のみがあり、interval_sales_june_2007表に対応する索引が作成されているとします。

ALTER TABLE interval_sales
  EXCHANGE PARTITION FOR (TO_DATE('01-JUN-2007','dd-MON-yyyy'))
  WITH TABLE interval_sales_jun_2007
  INCLUDING INDEXES;

システム生成されたパーティションを識別するためのFOR構文の使用方法に注意してください。*_TAB_PARTITIONSデータ・ディクショナリ・ビューを問い合せてシステム生成のパーティション名を表示することで、パーティション名を判別できます。

4.4.5.4 参照パーティション表のパーティションの交換

参照パーティション表のパーティションを交換できますが、参照するデータが親表のそれぞれのパーティションで使用可能であることを確認する必要があります。

例4-32では、レンジ・パーティション化されたorders表、および参照パーティション化されたorder_items表のパーティション交換ロードのシナリオを示します。order_items_2018_dec表のデータには、order_dateが2018年12月の注文の注文アイテム・データのみが含まれています。

主キー索引を使用可能なままにするには、親表のパーティションの交換では、UPDATE GLOBAL INDEXESまたはUPDATE INDEXESを使用する必要があります。また、参照パーティション表でのパーティションの交換を正常に行うには、order_items_2018_dec表で外部キー制約を作成するか有効化する必要があります。

CASCADEキーワードで交換する場合の詳細と例は、カスケード・オプションを使用したパーティションの交換についての項を参照してください。

例4-32 参照パーティション表のパーティションの交換

CREATE TABLE orders (
       order_id number NOT NULL, 
       order_date DATE,
       CONSTRAINT order_pk PRIMARY KEY (order_id))
       PARTITION by range (order_date) 
       (PARTITION p_2018_dec values less than ('01-JAN-2019'));
 
CREATE TABLE order_items  (
       order_item_id NUMBER NOT NULL,
       order_id NUMBER not null,
       order_item VARCHAR2(100),
       CONSTRAINT order_item_pk PRIMARY KEY (order_item_id), 
       CONSTRAINT order_item_fk FOREIGN KEY (order_id) references orders(order_id) on delete cascade)
       PARTITION by reference (order_item_fk);

CREATE TABLE orders_2018_dec (
       order_id NUMBER, 
       order_date DATE, 
       CONSTRAINT order_2018_dec_pk PRIMARY KEY (order_id));

INSERT into orders_2018_dec values (1,'01-DEC-2018');
COMMIT;

CREATE TABLE order_items_2018_dec (
       order_item_id NUMBER,
       order_id NUMBER NOT NULL, 
       order_item VARCHAR2(100),
       CONSTRAINT order_item_2018_dec_pk PRIMARY KEY (order_item_id), 
       CONSTRAINT order_item_2018_dec_fk FOREIGN KEY (order_id) references orders_2018_dec (order_id) on delete cascade);

INSERT into order_items_2018_dec values (1,1,'item A');
INSERT into order_items_2018_dec values (2,1,'item B');

REM You must disable or DROP the constraint before the exchange
ALTER TABLE order_items_2018_dec DROP CONSTRAINT order_item_2018_dec_fk;

REM ALTER TABLE is successful with disabled PK-FK
ALTER TABLE orders
  EXCHANGE PARTITION p_2018_dec
  WITH TABLE orders_2018_dec
  UPDATE GLOBAL INDEXES;

REM You must establish the PK-FK with the future parent prior to this exchange
ALTER TABLE order_items_2018_dec
  ADD CONSTRAINT order_items_dec_2018_fk
  FOREIGN KEY (order_id)
  REFERENCES orders(order_id) ;

REM Complete the exchange
ALTER TABLE order_items
  EXCHANGE PARTITION p_2018_dec
  WITH TABLE order_items_2018_dec;

REM Display the data
SELECT * FROM orders;
  ORDER_ID ORDER_DAT
---------- ---------
         1 01-DEC-18

SELECT * FROM order_items;
ORDER_ITEM_ID   ORDER_ID ORDER_ITEM
------------- ---------- ------------
            1          1 item A
            2          1 item B
4.4.5.5 仮想列を含む表のパーティションの交換について

仮想列が存在する場合もパーティションを交換できます。

仮想列を含むパーティション表でパーティションの交換を正常に行うには、パーティション表の単一のパーティションにある仮想列以外のすべての列の定義に一致する表を作成する必要があります。仮想列に制約または索引が定義されている場合を除き、仮想列の定義を含める必要はありません。

定義されている場合は、パーティション表の制約および索引の定義に一致させるために、仮想列の定義を含める必要があります。このシナリオは、仮想列ベースのパーティション表にも適用されます。

4.4.5.6 ハッシュ・パーティション表と* - ハッシュ・パーティションの交換

すべてのパーティションを含むハッシュ・パーティション表全体を、* - ハッシュ・パーティション表のパーティションおよびそのすべてのハッシュ・サブパーティションと交換できます。

次の例では、レンジ - ハッシュ・パーティション表のこの概念を説明します。

最初に、ハッシュ・パーティション表を作成します。

CREATE TABLE t1 (i NUMBER, j NUMBER)
     PARTITION BY HASH(i)
       (PARTITION p1, PARTITION p2);

表に移入し、次のようにしてレンジ - ハッシュ・パーティション表を作成します。

CREATE TABLE t2 (i NUMBER, j NUMBER)
     PARTITION BY RANGE(j)
     SUBPARTITION BY HASH(i)
        (PARTITION p1 VALUES LESS THAN (10)
            (SUBPARTITION t2_pls1,
             SUBPARTITION t2_pls2),
         PARTITION p2 VALUES LESS THAN (20)
            (SUBPARTITION t2_p2s1,
             SUBPARTITION t2_p2s2)
         );

t1のパーティション化キーが、表t2のサブパーティション化キーと同一であることが重要です。

t1のデータをt2に移行して行を検証するには、次の文を使用します。

ALTER TABLE t2 EXCHANGE PARTITION p1 WITH TABLE t1
     WITH VALIDATION;
4.4.5.7 * - ハッシュ・パーティション表のサブパーティションの交換

* - ハッシュ・パーティション表のハッシュ・サブパーティションを非パーティション表に変換する場合、またはその逆を行うには、ALTER TABLE EXCHANGE SUBPARTITION文を使用します。

次の例では、表salesのサブパーティションq3_1999_s1を、非パーティション表q3_1999に変換します。ローカル索引パーティションは、q3_1999の対応する索引と交換されます。

ALTER TABLE sales EXCHANGE SUBPARTITION q3_1999_s1
      WITH TABLE q3_1999 INCLUDING INDEXES;
4.4.5.8 リスト・パーティション表と* - リスト・パーティションの交換

ALTER TABLE EXCHANGE PARTITION文を使用すると、リスト - パーティション表を* - リスト・パーティションと交換できます。

セマンティックは、「ハッシュ・パーティション表と* - ハッシュ・パーティションの交換」で前述されているものと同じです。次の例では、リスト - リスト・パーティション表のパーティションの交換シナリオを示します。

CREATE TABLE customers_apac
( id            NUMBER
, name          VARCHAR2(50)
, email         VARCHAR2(100)
, region        VARCHAR2(4)
, credit_rating VARCHAR2(1)
)
PARTITION BY LIST (credit_rating)
( PARTITION poor VALUES ('P')
, PARTITION mediocre VALUES ('C')
, PARTITION good VALUES ('G')
, PARTITION excellent VALUES ('E')
);

表にAPACの顧客を移入します。次に、リスト - リスト・パーティション表を作成します。

CREATE TABLE customers
( id            NUMBER
, name          VARCHAR2(50)
, email         VARCHAR2(100)
, region        VARCHAR2(4)
, credit_rating VARCHAR2(1)
)
PARTITION BY LIST (region)
SUBPARTITION BY LIST (credit_rating)
SUBPARTITION TEMPLATE
( SUBPARTITION poor VALUES ('P')
, SUBPARTITION mediocre VALUES ('C')
, SUBPARTITION good VALUES ('G')
, SUBPARTITION excellent VALUES ('E')
)
(PARTITION americas VALUES ('AMER')
, PARTITION emea VALUES ('EMEA')
, PARTITION apac VALUES ('APAC')
);

customers_apac表のパーティション化キーが、customers表のサブパーティション化キーと一致していることが重要です。

次に、apacパーティションを交換します。

ALTER TABLE customers
EXCHANGE PARTITION apac
WITH TABLE customers_apac
WITH VALIDATION;
4.4.5.9 * - リスト・パーティション表のサブパーティションの交換について

* - リスト・パーティション表のサブパーティションを交換するには、ALTER TABLE EXCHANGE SUBPARTITION文を使用します。

ALTER TABLE EXCHANGE SUBPARTITION文のセマンティックは、「ハッシュ・パーティション表のサブパーティションの交換」で説明されているセマンティックと同じです。

4.4.5.10 レンジ・パーティション表と* - レンジ・パーティションの交換

ALTER TABLE EXCHANGE PARTITION文を使用すると、レンジ - パーティション表を* - レンジ・パーティションと交換できます。

ALTER TABLE EXCHANGE PARTITION文のセマンティックは、ハッシュ・パーティション表と* - ハッシュ・パーティションの交換で説明されているセマンティックと同じです。次の例では、order_dateで時間隔パーティション化され、order_totalのレンジでサブパーティション化されたorders表を示します。この例では、単一の月単位の時間隔をレンジ・パーティション表と交換する方法を示します。

CREATE TABLE orders_mar_2007
 ( id          NUMBER
  , cust_id     NUMBER
  , order_date  DATE
  , order_total NUMBER
 )
PARTITION BY RANGE (order_total)
 ( PARTITION p_small VALUES LESS THAN (1000)
  , PARTITION p_medium VALUES LESS THAN (10000)
  , PARTITION p_large VALUES LESS THAN (100000)
  , PARTITION p_extraordinary VALUES LESS THAN (MAXVALUE)
 );

表に2007年5月の注文を移入します。次に時間隔 - レンジ・パーティション表を作成します。

CREATE TABLE orders
 ( id          NUMBER
  , cust_id     NUMBER
  , order_date  DATE
  , order_total NUMBER
 )
PARTITION BY RANGE (order_date) INTERVAL (NUMTOYMINTERVAL(1,'MONTH'))
  SUBPARTITION BY RANGE (order_total)
  SUBPARTITION TEMPLATE
  ( SUBPARTITION p_small VALUES LESS THAN (1000)
   , SUBPARTITION p_medium VALUES LESS THAN (10000)
   , SUBPARTITION p_large VALUES LESS THAN (100000)
   , SUBPARTITION p_extraordinary VALUES LESS THAN (MAXVALUE)
  )
 (PARTITION p_before_2007 VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-MON-yyyy')));

orders_mar_2007表のパーティション化キーが、orders表のサブパーティション化キーと一致していることが重要です。

次に、パーティションを交換します。

ALTER TABLE orders
  EXCHANGE PARTITION
   FOR (TO_DATE('01-MAR-2007','dd-MON-yyyy'))
   WITH TABLE orders_mar_2007
   WITH VALIDATION;
4.4.5.11 * - レンジ・パーティション表のサブパーティションの交換について

* - レンジ・パーティションのサブパーティションを交換するには、ALTER TABLE EXCHANGE SUBPARTITION文を使用します。

ALTER TABLE EXCHANGE SUBPARTITIONのセマンティックは、「ハッシュ・パーティション表のサブパーティションの交換」で説明されているセマンティックと同じです。

4.4.5.12 カスケード・オプションを使用したパーティションの交換について

ALTER TABLE EXCHANGE PARTITIONおよびALTER TABLE EXCHANGE SUBPARTITION SQL文のCASCADEオプションを使用して、子の参照パーティション表に交換操作をカスケードできます。

交換操作のカスケードは、すべての外部キー制約をON DELETE CASCADEとして定義する必要があります。

ALTER TABLE EXCHANGE PARTITIONおよびALTER TABLE EXCHANGE SUBPARTITIONCASCADEオプションを指定すると、EXCHANGE操作は、ターゲット表の子である参照パーティション表にカスケードします。交換操作は、参照パーティション階層の任意のレベルで指定でき、ターゲット表から開始される子表にカスケードします。子表に権限は必要ありませんが、交換操作の通常の制限が操作に影響されるすべての表に適用されます。参照パーティションの子を持たない表に指定されている場合、CASCADEオプションは無視されます。

ターゲット表の参照パーティション階層および交換表の参照パーティション階層は一致する必要があります。同じ親キーが複数の依存表によって参照される場合、CASCADEオプションはサポートされません。複数の依存表が同じ主キーを使用していると、カーネルは依存パーティションの交換方法を明示的に識別できません。UPDATE INDEXESなど、操作に指定される他のオプションは、操作に影響されるすべての表に適用されます。

カスケード・オプションはデフォルトで無効になっているため、Oracle Database互換性に影響しません。

次の例は、参照パーティション表のパーティションを交換する場合のCASCADEの使用を示しています。

例4-33 参照パーティション表のカスケードを使用するパーティションの交換

CREATE TABLE orders (
       order_id number NOT NULL, 
       order_date DATE,
       CONSTRAINT order_pk PRIMARY KEY (order_id))
       PARTITION by range (order_date) 
       (PARTITION p_2018_dec values less than ('01-JAN-2019'));
 
CREATE TABLE order_items  (
       order_item_id NUMBER NOT NULL,
       order_id NUMBER not null,
       order_item VARCHAR2(100),
       CONSTRAINT order_item_pk PRIMARY KEY (order_item_id), 
       CONSTRAINT order_item_fk FOREIGN KEY (order_id) references orders(order_id) on delete cascade)
       PARTITION by reference (order_item_fk);

CREATE TABLE orders_2018_dec (
       order_id NUMBER, 
       order_date DATE, 
       CONSTRAINT order_2018_dec_pk PRIMARY KEY (order_id));

INSERT into orders_2018_dec values (1,'01-DEC-2018');

CREATE TABLE order_items_2018_dec (
       order_item_id NUMBER,
       order_id NUMBER NOT NULL, 
       order_item VARCHAR2(100),
       CONSTRAINT order_item_2018_dec_pk PRIMARY KEY (order_item_id), 
       CONSTRAINT order_item_2018_dec_fk FOREIGN KEY (order_id) references orders_2018_dec (order_id) on delete cascade);

INSERT into order_items_2018_dec values (1,1,'item A new');
INSERT into order_items_2018_dec values (2,1,'item B new');

REM Display data from reference partitioned tables before exchange
SELECT * FROM orders;
no rows selected

SELECT * FROM order_items;
no rows selected

REM ALTER TABLE using cascading exchange
ALTER TABLE orders
   EXCHANGE PARTITION p_2018_dec
   WITH TABLE orders_2018_dec
    CASCADE
   UPDATE GLOBAL INDEXES;

REM Display data from reference partitioned tables after exchange
SELECT * FROM orders;
  ORDER_ID ORDER_DAT
---------- ---------
         1 01-DEC-18

SELECT * FROM order_items;
ORDER_ITEM_ID   ORDER_ID ORDER_ITEM
------------- ---------- ------------
            1          1 item A new
            2          1 item B new

4.4.6 パーティションおよびサブパーティションのマージについて

ALTER TABLE MERGE PARTITIONおよびSUBPARTITION SQL文を使用して、2つのパーティションまたはサブパーティションのコンテンツをマージします。

元の2つのパーティションまたはサブパーティションと、対応するローカル索引は削除されます。この文は、ハッシュ・パーティション表、またはコンポジット* - ハッシュ・パーティション表のハッシュ・サブパーティションには使用できません。

参照パーティション表のパーティションはマージできません。かわりに、親表でのマージ操作がすべての子表にカスケードされます。ただし、パーティションまたはサブパーティションをマージするために、親表でマージ操作を発行する場合は、DEPENDENT TABLES句を使用して依存表に特定のプロパティを設定できます。

ONLINEキーワードをALTER TABLE MERGE PARTITIONおよびSUBPARTITION SQL文とともに使用すると、通常の(ヒープ構成)表に対するオンライン・マージ操作が有効になります。ONLINEキーワードの使用例は、例4-34を参照してください。

関連するパーティションまたはサブパーティションにデータが含まれる場合は、次の表で説明するように、索引はUNUSABLEとマークされます。

表のタイプ 索引の動作

通常(ヒープ)

ALTER TABLE文の一部にUPDATE INDEXESを指定しない場合:

  • データベースにより、対応する結果のローカル索引パーティションまたはサブパーティションがすべてUNUSABLEとマークされます。

  • グローバル索引またはパーティション・グローバル索引のすべてのパーティションがUNUSABLEとマークされ、再作成する必要があります。

索引構成

  • データベースにより、対応する結果のローカル索引パーティションがすべてUNUSABLEとマークされます。

  • すべてのグローバル索引は使用可能なままです。

この項では、次の項目について説明します。

4.4.6.1 レンジ・パーティションのマージ

隣接する2つのレンジ・パーティションの内容を、1つのパーティションにマージできます。

隣接しないレンジ・パーティションはマージできません。結果のパーティションは、マージされた2つのパーティションの高い方の上限を継承します。

レンジ・パーティションをマージする理由の1つは、大規模なパーティションで、履歴データをオンラインに保つためです。たとえば、最も古いパーティションが週次パーティションにロールアップされ、そのパーティションは月次パーティションにロールアップされる日次パーティションを作成できます。

例4-34は、ONLINEキーワードを使用したレンジ・パーティションのマージ例を示しています。

例4-34 レンジ・パーティションのマージ

-- First, create a partitioned table with four partitions, each on its own
-- tablespace, partitioned by range on the date column
--
CREATE TABLE four_seasons
(       one DATE,
        two VARCHAR2(60),
      three NUMBER
)
PARTITION BY RANGE (one) 
(
PARTITION quarter_one 
   VALUES LESS THAN ( TO_DATE('01-APR-2017','dd-mon-yyyy'))
   TABLESPACE quarter_one,
PARTITION quarter_two 
   VALUES LESS THAN ( TO_DATE('01-JUL-2017','dd-mon-yyyy'))
   TABLESPACE quarter_two,
PARTITION quarter_three
   VALUES LESS THAN ( TO_DATE('01-OCT-2017','dd-mon-yyyy'))
   TABLESPACE quarter_three,
PARTITION quarter_four
   VALUES LESS THAN ( TO_DATE('01-JAN-2018','dd-mon-yyyy'))
   TABLESPACE quarter_four
);
-- 
-- Create local PREFIXED indexes on four_seasons
-- Prefixed because the leftmost columns of the index match the
-- Partitioning key 
--
CREATE INDEX i_four_seasons_l ON four_seasons (one,two) 
  LOCAL ( 
  PARTITION i_quarter_one TABLESPACE i_quarter_one,
  PARTITION i_quarter_two TABLESPACE i_quarter_two,
  PARTITION i_quarter_three TABLESPACE i_quarter_three,
  PARTITION i_quarter_four TABLESPACE i_quarter_four
);


SELECT TABLE_NAME, PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME ='FOUR_SEASONS';
TABLE_NAME                          PARTITION_NAME
----------------------------------- -------------------------
FOUR_SEASONS                        QUARTER_FOUR
FOUR_SEASONS                        QUARTER_ONE
FOUR_SEASONS                        QUARTER_THREE
FOUR_SEASONS                        QUARTER_TWO

-- Next, merge the first two partitions
ALTER TABLE four_seasons 
  MERGE PARTITIONS quarter_one, quarter_two INTO PARTITION quarter_two
  UPDATE INDEXES 
  ONLINE;

SELECT TABLE_NAME, PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME ='FOUR_SEASONS';
TABLE_NAME                          PARTITION_NAME
----------------------------------- -------------------------
FOUR_SEASONS                        QUARTER_FOUR
FOUR_SEASONS                        QUARTER_THREE
FOUR_SEASONS                        QUARTER_TWO

ALTER TABLE four_season文からUPDATE INDEXES句を除外した場合は、影響を受けるパーティションのローカル索引を再作成する必要があります。

-- Rebuild the index for quarter_two, which has been marked unusable 
-- because it has not had all of the data from quarter_one added to it.
-- Rebuilding the index corrects this condition.
--
ALTER TABLE four_seasons MODIFY PARTITION quarter_two 
  REBUILD UNUSABLE LOCAL INDEXES;
4.4.6.2 時間隔パーティションのマージ

隣接する2つの時間隔パーティションのコンテンツを、1つのパーティションにマージできます。

隣接しない時間隔パーティションはマージできません。また、最初の時間隔パーティションは、最高位のレンジ・パーティションとマージできます。結果のパーティションは、マージされた2つのパーティションの高い方の上限を継承します。

時間隔パーティションをマージすると、遷移点が、マージされた2つのパーティションの高い方の上限に移動します。その結果、時間隔パーティション表のレンジ・セクションが、マージされた2つのパーティションの上限に拡張されます。新しくマージされたパーティションより上限が低いマテリアライズ化された時間隔パーティションは、上限が時間隔の上限によって定義されたレンジ・パーティションに自動的に変換されます。

たとえば、次の時間隔パーティション表transactionsを考えます:

CREATE TABLE transactions
( id               NUMBER
, transaction_date DATE
, value            NUMBER
)
PARTITION BY RANGE (transaction_date)
INTERVAL (NUMTODSINTERVAL(1,'DAY'))
( PARTITION p_before_2007 VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-MON-yyyy')));

データを表の時間隔セクションに挿入すると、これらの日付用の時間隔パーティションが作成されます。2007年1月15日および2007年1月16日のデータは、隣接する時間隔パーティションに格納されます。

INSERT INTO transactions VALUES (1,TO_DATE('15-JAN-2007','dd-MON-yyyy'),100);
INSERT INTO transactions VALUES (2,TO_DATE('16-JAN-2007','dd-MON-yyyy'),600); 
INSERT INTO transactions VALUES (3,TO_DATE('30-JAN-2007','dd-MON-yyyy'),200);

次に、隣接する2つの時間隔パーティションをマージします。新しいパーティションには、システム生成の名前が付けられます。

ALTER TABLE transactions
MERGE PARTITIONS FOR(TO_DATE('15-JAN-2007','dd-MON-yyyy'))
, FOR(TO_DATE('16-JAN-2007','dd-MON-yyyy'));

transactions表の遷移点が2007年1月17日に移動します。時間隔パーティション表のレンジ・セクションには、値が2007年1月1日より少ないものと、2007年1月17日より少ないものの、2つのレンジ・パーティションが含まれます。2007年1月17日より大きい値は、時間隔パーティション表の時間隔部分に分類されます。

4.4.6.3 リスト・パーティションのマージ

リスト・パーティションをマージする場合、マージするパーティションは任意の2つのパーティションでかまいません。

リスト・パーティション化ではパーティションの順序が想定されていないため、レンジ・パーティションのように隣接している必要はありません。結果のパーティションには、元の2つのパーティションのすべてのデータが含まれます。デフォルトのリスト・パーティションをその他のパーティションとマージすると、結果のパーティションがデフォルトのパーティションになります。

次の文では、リスト・メソッドを使用してパーティション化された表の2つのパーティションを、すべての属性を表レベルのデフォルト属性から継承するパーティションにマージします。文にはMAXEXTENTSが指定されています。

ALTER TABLE q1_sales_by_region 
   MERGE PARTITIONS q1_northcentral, q1_southcentral 
   INTO PARTITION q1_central 
      STORAGE(MAXEXTENTS 20);

元の2つのパーティションの値リストは、次のとおりです。

PARTITION q1_northcentral VALUES ('SD','WI')
PARTITION q1_southcentral VALUES ('OK','TX')

結果として生成されるsales_westパーティションの値リストは、これら2つのパーティションの値リストを合せたものです。つまり、次のようになります。

('SD','WI','OK','TX')
4.4.6.4 * - ハッシュ・パーティションのマージ

* - ハッシュ・パーティションをマージすると、サブパーティションが、SUBPARTITIONS nまたはSUBPARTITION句で指定されたサブパーティション数に再度ハッシュされます。どちらも含まれない場合、表レベルのデフォルトが使用されます。

2つの* - ハッシュ・パーティションをマージする場合と、* - ハッシュ・パーティションを分割する場合では、プロパティの継承方法が異なります。パーティションを分割する場合は親が1つのみであるため、新しいパーティションは元のパーティションからプロパティを継承できます。ただし、パーティションをマージする場合は、表レベルからプロパティを継承する必要があります。

時間隔 - ハッシュ・パーティション表の場合、マージできるのは、隣接する2つの時間隔パーティションか、最高位のレンジ・パーティションと最初の時間隔パーティションのみです。時間隔 - ハッシュ・パーティション表で時間隔をマージする際、遷移点が移動します。

次の例では、2つのレンジ - ハッシュ・パーティションをマージします。

ALTER TABLE all_seasons
   MERGE PARTITIONS quarter_1, quarter_2 INTO PARTITION quarter_2
   SUBPARTITIONS 8;

関連項目:

4.4.6.5 * - リスト・パーティションのマージについて

パーティションはパーティション・レベルで、サブパーティションはリスト・サブパーティション・レベルでマージできます。

この項では、次の項目について説明します。

4.4.6.5.1 * - リスト・パーティション表のパーティションのマージ

2つの* - リスト・パーティションをマージする場合、結果の新しいパーティションは、サブパーティション・テンプレートからサブパーティションの説明を継承します(サブパーティション・テンプレートが存在する場合)。サブパーティション・テンプレートがない場合には、新しいパーティションに単一のデフォルトのサブパーティションが作成されます。

時間隔 - リスト・パーティション表の場合、マージできるのは、隣接する2つの時間隔パーティションか、最高位のレンジ・パーティションと最初の時間隔パーティションのみです。時間隔 - リスト・パーティション表で時間隔をマージする際、遷移点が移動します。

次の文では、レンジ - リスト・パーティション化されたstripe_regional_sales表の2つのパーティションをマージします。表には、サブパーティション・テンプレートがあります。

ALTER TABLE stripe_regional_sales
   MERGE PARTITIONS q1_1999, q2_1999 INTO PARTITION q1_q2_1999
      STORAGE(MAXEXTENTS 20);

指定されていないパーティションでは表レベルのデフォルトが継承されますが、この新しいパーティションにはいくつかの新しい物理属性が指定されています。結果の新しいパーティションq1_q2_1999は、パーティションq2_1999の上限値と、表のサブパーティション・テンプレートの説明からサブパーティションの値リストの説明を継承しています。

結果のパーティションのデータには、両方のパーティションのデータが含まれます。ただし、データベースによりエラーが戻される場合があります。これは、次に示す両方の条件に当てはまる場合には、データが新しいパーティション外にマップされているためです。

このエラー条件は、デフォルトのサブパーティション・テンプレートに必ずデフォルトのパーティションを指定することでなくすことができます。

  • マージされたサブパーティションの一部のリテラル値がサブパーティション・テンプレートに含まれていない。

  • サブパーティション・テンプレートにデフォルトのパーティション定義が含まれていない。

関連項目:

4.4.6.5.2 * - リスト・パーティション表のサブパーティションのマージ

同じパーティションに所属する2つの任意のリスト・サブパーティションのコンテンツをマージできます。

結果のサブパーティションの値リストの記述子には、マージされるパーティションの値リストのすべてのリテラル値が含まれます。

次の文では、レンジ - リスト・メソッドを使用してパーティション化された表の2つのサブパーティションを、表領域ts4に配置された新しいサブパーティションにマージします。

ALTER TABLE quarterly_regional_sales
   MERGE SUBPARTITIONS q1_1999_northwest, q1_1999_southwest
      INTO SUBPARTITION q1_1999_west
         TABLESPACE ts4;

元の2つのパーティションの値リストは、次のとおりです。

  • サブパーティションq1_1999_northwest('WA','OR')

  • サブパーティションq1_1999_southwest('AZ','NM','UT')

結果のサブパーティションの値リストは、次に示すように、これら2つのサブパーティションの値リストを合せたセットで構成されます。

  • サブパーティションq1_1999_westの値リストは('WA','OR','AZ','NM','UT')

結果のサブパーティションが配置されている表領域およびサブパーティションの属性は、明示的に指定されている場合を除き、パーティション・レベルのデフォルト属性によって決定されます。既存のサブパーティション名を再利用する場合、新しいサブパーティションは、名前が再利用されるサブパーティションのサブパーティション属性を継承します。

4.4.6.6 * - レンジ・パーティションのマージについて

パーティションはパーティション・レベルで、サブパーティションはレンジ・サブパーティション・レベルでマージできます。

4.4.6.6.1 * - レンジ・パーティション表のパーティションのマージ

2つの* - レンジ・パーティションをマージする場合、結果の新しいパーティションは、サブパーティション・テンプレートからサブパーティションの説明を継承します(サブパーティション・テンプレートが存在する場合)。サブパーティション・テンプレートがない場合には、上限がMAXVALUEの単一のサブパーティションが新しいパーティションに作成されます。

時間隔 - レンジ・パーティション表の場合、マージできるのは、隣接する2つの時間隔パーティションか、最高位のレンジ・パーティションと最初の時間隔パーティションのみです。時間隔 - レンジ・パーティション表で時間隔をマージする際、遷移点が移動します。

次の文では、月次の時間隔 - レンジでパーティション化されたorders表の2つのパーティションをマージします。表には、サブパーティション・テンプレートがあります。

ALTER TABLE orders
MERGE PARTITIONS FOR(TO_DATE('01-MAR-2007','dd-MON-yyyy')), 
FOR(TO_DATE('01-APR-2007','dd-MON-yyyy'))
INTO PARTITION p_pre_may_2007;

2007年3月および2007年4月のパーティションが時間隔 - レンジ・パーティション表の時間隔セクションにある場合、マージ操作により、遷移点が2007年5月1日に移動します。

パーティションp_pre_may_2007のサブパーティションは、サブパーティション・テンプレートからプロパティを継承します。結果のパーティションのデータには、両方のパーティションのデータが含まれます。ただし、データベースによりエラーが戻される場合があります。これは、次に示す両方の条件に当てはまる場合には、データが新しいパーティション外にマップされているためです。

このエラー条件は、上限がMAXVALUEのサブパーティションをサブパーティション・テンプレートに必ず指定することでなくすことができます。

  • マージされたサブパーティションの一部のレンジ値がサブパーティション・テンプレートに含まれていない。

  • サブパーティション・テンプレートに、上限がMAXVALUEのサブパーティションの定義がない。

関連項目:

4.4.6.7 複数のパーティションのマージ

2つ以上のパーティションまたはサブパーティションのコンテンツを新しい1つのパーティションまたはサブパーティションにマージし、ALTER TABLE SQL文のMERGE PARTITIONSおよびMERGE SUBPARTITIONS句を使用して元のパーティションまたはサブパーティションを削除できます。

MERGE PARTITIONSおよびMERGE SUBPARTITIONS句は、MERGE PARTITIONおよびMERGE SUBPARTITION句と同義です。

たとえば、次のSQL文は、4つのパーティションを1つのパーティションにマージし、マージされた4つのパーティションを削除します。

ALTER TABLE t1 MERGE PARTITIONS p01, p02, p03, p04 INTO p0;

複数のレンジ・パーティションをマージする場合、パーティションは隣接し、パーティション・バウンド値の昇順で指定する必要があります。新しいパーティションは、元のパーティションの最高位のパーティション上限を継承します。

TO構文を使用して複数のレンジ・パーティションをマージする場合、マージする最下位および最高位のパーティションを指定できます。指定されたパーティション間のすべてのパーティション(指定されたパーティションを含む)は、ターゲット・パーティションにマージされます。この構文は、リストおよびシステム・パーティションに使用できません。

たとえば、次のSQL文は、パーティションp01からp04をパーティションp0にマージします。

ALTER TABLE t1 MERGE PARTITIONS p01 TO p04 INTO p0;

パーティションの順序が想定されていないため、マージするリスト・パーティションおよびシステム・パーティションは隣接する必要がありません。複数のリスト・パーティションをマージする場合、結果のパーティションの値リストは、マージするすべてのパーティションのパーティション値リストをまとめたものです。他のリスト・パーティションとマージするDEFAULTリスト・パーティションは、DEFAULTパーティションになります。

コンポジット・パーティション表の複数のパーティションをマージする場合、結果の新しいパーティションは、存在する場合にサブパーティション・テンプレートからサブパーティションの説明を継承します。サブパーティション・テンプレートが存在しない場合、新しいパーティションのレンジ・サブパーティションから1つのMAXVALUEサブパーティションまたはリスト・パーティションから1つのDEFAULTサブパーティションが作成されます。コンポジット・パーティション表の複数のサブパーティションをマージする場合、マージするサブパーティションは同じパーティションに属する必要があります。

複数のパーティションをマージする場合、ローカルおよびグローバル索引操作および指定されていない物理属性を継承するセマンティックは、2つのパーティションのマージで同じです。

次のSQL文では、レンジ・パーティション表salesの4つのパーティションがマージされます。最も古い年の4四半期に対応するこれらの4つのパーティションは、その年の売上データ全体を含む単一のパーティションにマージされます。

ALTER TABLE sales
  MERGE PARTITIONS sales_q1_2009, sales_q2_2009, sales_q3_2009, sales_q4_2009
  INTO PARTITION sales_2009;

前述のSQL文を次のSQL文にリライトしても、同じ結果を取得できます。

ALTER TABLE sales
  MERGE PARTITIONS sales_q1_2009 TO sales_q4_2009
  INTO PARTITION sales_2009;

4.4.7 表、パーティションおよびサブパーティションの属性の変更について

このトピックでは、表、パーティションおよびサブパーティションの属性の変更について説明します。

4.4.7.1 デフォルトの属性の変更について

表またはコンポジット・パーティション表のパーティションのデフォルト属性を変更できます。

デフォルト属性を変更する場合、新しい属性の影響を受けるのは、作成される今後のパーティションまたはサブパーティションのみです。新しいパーティションまたはサブパーティションの作成時には、デフォルト値を明示的に上書きできます。参照パーティション表のデフォルト属性を変更できます。

この項では、次の項目について説明します。

4.4.7.1.1 表のデフォルト属性の変更

ALTER TABLEMODIFY DEFAULT ATTRIBUTES句を使用して、レンジ、ハッシュ、リスト、時間隔または参照パーティションに継承されるデフォルト属性を変更できます。

ハッシュ・パーティション表の場合、変更できるのはTABLESPACE属性のみです。

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

サブパーティションの作成時に継承されたデフォルト属性を変更するには、ALTER TABLE MODIFY DEFAULT ATTRIBUTES FOR PARTITIONを使用します。

次の文では、レンジ - ハッシュ・パーティション表のパーティションp1の後続のサブパーティションが配置されるTABLESPACEを変更します。

ALTER TABLE employees_subpartitions
     MODIFY DEFAULT ATTRIBUTES FOR PARTITION p1 TABLESPACE ts1;

TABLESPACEを除き、レンジ - ハッシュ・パーティション表のすべてのサブパーティションでは同じ属性を共有する必要があるため、これは変更できる唯一の属性です。

作成されていない時間隔パーティションのデフォルト属性は変更できません。時間隔パーティション表の今後のサブパーティションの作成方法を変更するには、サブパーティション・テンプレートを変更する必要があります。

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

表パーティションと同じような方法で、レンジ・パーティション・グローバル索引のパーティション、またはパーティション表のローカル索引パーティションにより継承されるデフォルト属性を変更できます。

これには、ALTER INDEX MODIFY DEFAULT ATTRIBUTES文を使用します。コンポジット・パーティション表のサブパーティションにより継承されるデフォルト属性を変更する場合は、ALTER INDEX MODIFY DEFAULT ATTRIBUTES FOR PARTITION文を使用します。

4.4.7.2 パーティションの実際の属性の変更について

表または索引の既存のパーティションの属性を変更できます。

TABLESPACE属性は変更できません。新しい表領域にパーティションまたはサブパーティションを移動する場合は、ALTER TABLE MOVE PARTITION/SUBPARTITIONを使用します。

この項では、次の項目について説明します。

4.4.7.2.1 レンジまたはリスト・パーティションの実際の属性の変更

レンジ・パーティションまたはリスト・パーティションの既存の属性を変更するには、ALTER TABLE MODIFY PARTITION文を使用します。

セグメント属性(TABLESPACEを除く)の変更、エクステントの割当てや割当て解除、ローカル索引パーティションへのUNUSABLEのマーク付け、またはUNUSABLEとマークされたローカル索引の再作成が可能です。

* - ハッシュ・パーティション表のレンジ・パーティションの場合は、次の内容に注意してください。

  • エクステントの割当てまたは割当て解除を行うと、このアクションは指定されたパーティションのすべてのサブパーティションに対して実行されます。

  • 同様に、その他の属性を変更した場合も、対応する変更がそのパーティションのすべてのサブパーティションの属性に対して行われます。パーティション・レベルのデフォルト属性も変更されます。既存のサブパーティションの属性が変更されないようにするには、MODIFY DEFAULT ATTRIBUTES文のFOR PARTITION句を使用します。

次に、パーティションの実際の属性の変更例をいくつか示します。

この例では、表salesのレンジ・パーティションsales_q1MAXEXTENTS記憶域属性を変更します。

ALTER TABLE sales MODIFY PARTITION sales_q1
     STORAGE (MAXEXTENTS 10); 

次の例では、レンジ - ハッシュ・パーティション表scubagearのパーティションts1のローカル索引サブパーティションがすべてUNUSABLEとマークされます。

ALTER TABLE scubagear MODIFY PARTITION ts1 UNUSABLE LOCAL INDEXES;

時間隔パーティション表の場合、変更できるのは、作成済のレンジ・パーティションまたは時間隔パーティションの実際の属性のみです。

4.4.7.2.2 ハッシュ・パーティションの実際の属性の変更

ALTER TABLE MODIFY PARTITION文を使用して、ハッシュ・パーティションの属性を変更できます。

ただし、個々のハッシュ・パーティションの物理属性は(TABLESPACEを除き)すべて同一である必要があるため、実行できるのは次の操作のみです。

  • 新規エクステントの割当て

  • 未使用のエクステントの割当て解除

  • ローカル索引サブパーティションへのUNUSABLEのマーク付け

  • UNUSABLEとマークされたローカル索引サブパーティションの再作成

次の例では、表のハッシュ・パーティションp1に関連付けられた使用できないローカル索引パーティションを再作成します。

ALTER TABLE departments_rebuild_index MODIFY PARTITION p1
     REBUILD UNUSABLE LOCAL INDEXES;
4.4.7.2.3 サブパーティションの実際の属性の変更

ALTER TABLEMODIFY SUBPARTITION句を使用すると、前の項でパーティションに関してリストされていたのと同じアクションを実行できますが、実行できるのは、特定のコンポジット・パーティション表のサブパーティション・レベルにおいてです。

たとえば:

ALTER TABLE employees_rebuild_index MODIFY SUBPARTITION p3_s1
     REBUILD UNUSABLE LOCAL INDEXES;
4.4.7.2.4 索引パーティションの実際の属性の変更

ALTER INDEXMODIFY PARTITION句を使用すると、索引のパーティションまたはサブパーティションの実際の属性を変更できます。

ルールは表パーティションのルールとよく似ています。ALTER INDEXMODIFY PARTITION句とは異なり、使用不可の索引パーティションを作成する副句はありませんが、索引のパーティションまたはサブパーティションを結合する副句があります。ここでの結合は索引ブロックのマージを意味します。これは再利用のために解放できます。

MODIFY PARTITION句を使用して、ローカル索引のサブパーティションに対する記憶域の割当てや割当て解除、またはそれらをUNUSABLEとマークすることもできます。

4.4.8 リスト・パーティションの変更について

このトピックでは、パーティションおよびサブパーティションのリストの値の変更について説明します。

4.4.8.1 リスト・パーティションの変更について: 値の追加

リスト・パーティション化では、オプションで、定義された値リストのリテラル値を追加できます。

この項では、次の項目について説明します。

4.4.8.1.1 リスト・パーティションへの値の追加

既存のパーティションの値リストを拡張するには、ALTER TABLE文のMODIFY PARTITION ADD VALUES句を使用します。

追加するリテラル値は、その他のパーティションの値リストに含まれていない必要があります。対応するローカル索引パーティションのパーティションの値リストはそれに応じて拡張され、グローバル索引や、グローバルまたはローカル索引パーティションは使用可能なままです。

次の文では、既存のパーティション・リストに、一連の新しい州コード(OKKS)を追加します。

ALTER TABLE sales_by_region
   MODIFY PARTITION region_south
      ADD VALUES ('OK', 'KS');

デフォルトのパーティションがあると、その他のパーティションへの値の追加時にパフォーマンスに影響があります。これは、リスト・パーティションに値を追加するために、追加する値がデフォルトのパーティションに存在しないことをデータベースで確認する必要があるためです。いずれかの値がデフォルト・パーティションに存在する場合は、エラーが表示されます。

ノート:

データベースにより、追加されるリテラル値に対応する行がデフォルトのパーティションに存在するかどうかを確認する問合せが実行されます。そのため、表にローカルの同一キー索引を作成することをお薦めします。これにより、問合せの実行および操作全体が高速化されます。

デフォルトのリスト・パーティションには値を追加できません。

4.4.8.1.2 リスト・サブパーティションへの値の追加

既存のサブパーティションの値リストを拡張するには、ALTER TABLE文のMODIFY SUBPARTITION ADD VALUES句を使用します。

この操作は、「リスト・パーティションの変更について: 値の追加」に説明されている操作と基本的に同じですが、MODIFY PARTITION句ではなくMODIFY SUBPARTITION句を使用します。たとえば、サブパーティションq1_1999_southeastの値リストにあるリテラル値のレンジを拡張するには、次の文を使用します。

ALTER TABLE quarterly_regional_sales
   MODIFY SUBPARTITION q1_1999_southeast
      ADD VALUES ('KS');

追加するリテラル値が、所有パーティション内のその他のサブパーティションの値リストに含まれていない必要があります。ただし、表内にあるその他のパーティションのサブパーティションの値リストのリテラル値を複製したものであってもかまいません。

時間隔 - リスト・コンポジット・パーティション表の場合、作成済のレンジ・パーティションか時間隔パーティションのサブパーティションにのみ値を追加できます。まだ作成されていない時間隔パーティションのサブパーティションに値を追加するには、サブパーティション・テンプレートを変更する必要があります。

4.4.8.2 リスト・パーティションの変更について: 値の削除

リスト・パーティション化では、オプションで、定義された値リストのリテラル値を削除できます。

この項では、次の項目について説明します。

4.4.8.2.1 リスト・パーティションからの値の削除

既存のパーティションの値リストからリテラル値を削除するには、ALTER TABLE文のMODIFY PARTITION DROP VALUES句を使用します。

この文は常に検証しながら実行されます。つまり、削除する一連の値に対応する行がパーティションに存在するかどうかが確認されます。そのような行が見つかると、データベースによってエラー・メッセージが返され、操作が失敗します。必要な場合は、DELETE文を使用して、対応する行を表から削除した後で値の削除を試行します。

ノート:

パーティションを説明する値リストからすべてのリテラル値を削除することはできません。かわりに、ALTER TABLE DROP PARTITION文を使用してください。

対応するローカル索引パーティションのパーティションの値リストには新しい値リストが反映され、グローバル索引や、グローバルまたはローカル索引パーティションは使用可能なままです。

次の文では、既存のパーティションの値リストから、一連の州コード(OKおよびKS)を削除します。

ALTER TABLE sales_by_region
   MODIFY PARTITION region_south
      DROP VALUES ('OK', 'KS');

ノート:

データベースにより、削除されるリテラル値に対応する行がパーティションに存在するかどうかを確認する問合せが実行されます。そのため、表にローカルの同一キー索引を作成することをお薦めします。これにより、問合せおよび操作全体が高速化されます。

デフォルトのリスト・パーティションからは値を削除できません。

4.4.8.2.2 リスト・サブパーティションからの値の削除

既存のサブパーティションの値リストからリテラル値を削除するには、ALTER TABLE文のMODIFY SUBPARTITION DROP VALUES句を使用します。

この操作は、「リスト・パーティションの変更について: 値の削除」に説明されている操作と基本的に同じですが、MODIFY PARTITION句ではなくMODIFY SUBPARTITION句を使用します。たとえば、サブパーティションq1_1999_southeastの値リストにある一連のリテラル値を削除するには、次の文を使用します。

ALTER TABLE quarterly_regional_sales
   MODIFY SUBPARTITION q1_1999_southeast
      DROP VALUES ('KS');

時間隔 - リスト・コンポジット・パーティション表の場合、作成済のレンジ・パーティションか時間隔パーティションのサブパーティションからのみ値を削除できます。まだ作成されていない時間隔パーティションのサブパーティションから値を削除するには、サブパーティション・テンプレートを変更する必要があります。

4.4.9 パーティション化戦略の変更について

ALTER TABLE MODIFY PARTITION SQL文を使用して、通常の(ヒープ構成)表のパーティション化戦略を変更できます。

パーティション化戦略の変更(ハッシュ・パーティション化からコンポジット・レンジ - ハッシュ・パーティション化に変更するなど)は、オフラインまたはオンラインで実行できます。オンライン・モードで実行した場合、進行中のDML操作は変更の影響を受けません。オフライン・モードで実行した場合、変更中の同時DML操作は許可されません。

索引は、表の変更の際にメンテナンスされます。パーティション化戦略を変更する場合、索引列が新しいパーティション化キーのプリフィックスであるすべての未指定の索引は自動的にローカル・パーティション索引に変換されます。そうでない場合、索引はグローバル索引に変換されます。

変更操作は、ドメイン索引ではサポートされていません。UPDATE INDEXES句では、索引のリストが最初に定義されている列、索引の一意性プロパティ、またはその他の索引プロパティを変更することはできません。

非パーティション表からパーティション表への変換の詳細は、「パーティション表への非パーティション表の変換」を参照してください。

例4-35に、レンジ・パーティション表をコンポジット・レンジ- ハッシュ・パーティション表にオンラインで変換するためのALTER TABLEの使用方法を示します。この例では、ALTER TABLEでの変更中に索引が更新されます。

Live SQL:

Oracle Live SQLの表のパーティション化戦略の変更で関連する例を参照して実行してください。

例4-35 パーティション化戦略の変更

CREATE TABLE mod_sales_partitioning
  ( prod_id       NUMBER        NOT NULL,
    cust_id       NUMBER        NOT NULL,
    time_id       DATE          NOT NULL,
    channel_id    NUMBER        NOT NULL,
    promo_id      NUMBER        NOT NULL,
    quantity_sold NUMBER(10,2)  NOT NULL,
    amount_sold   NUMBER(10,2)  NOT NULL
  )
  PARTITION BY RANGE (time_id)
  (PARTITION sales_q1_2017 VALUES LESS THAN (TO_DATE('01-APR-2017','dd-MON-yyyy')),
   PARTITION sales_q2_2017 VALUES LESS THAN (TO_DATE('01-JUL-2017','dd-MON-yyyy')),
   PARTITION sales_q3_2017 VALUES LESS THAN (TO_DATE('01-OCT-2017','dd-MON-yyyy')),
   PARTITION sales_q4_2017 VALUES LESS THAN (TO_DATE('01-JAN-2018','dd-MON-yyyy'))
 ); 

CREATE INDEX i1_cust_id_indx ON mod_sales_partitioning (cust_id) LOCAL;
CREATE INDEX i2_time_id_indx ON mod_sales_partitioning (time_id);
CREATE INDEX i3_prod_id_indx ON mod_sales_partitioning (prod_id);

SELECT TABLE_NAME, PARTITIONING_TYPE FROM USER_PART_TABLES WHERE TABLE_NAME ='MOD_SALES_PARTITIONING';
TABLE_NAME                PARTITION_NAME 
------------------------- --------------
MOD_SALES_PARTITIONING    RANGE

SELECT TABLE_NAME, PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME ='MOD_SALES_PARTITIONING';
TABLE_NAME                PARTITION_NAME 
------------------------- --------------
MOD_SALES_PARTITIONING    SALES_Q1_2017
MOD_SALES_PARTITIONING    SALES_Q2_2017
MOD_SALES_PARTITIONING    SALES_Q3_2017
MOD_SALES_PARTITIONING    SALES_Q4_2017
...

ALTER TABLE mod_sales_partitioning
 MODIFY 
 PARTITION BY RANGE (time_id) SUBPARTITION BY HASH (cust_id)
  SUBPARTITIONS 8
 ( PARTITION  sales_q1_2017 VALUES LESS THAN (TO_DATE('01-APR-2017','dd-MON-yyyy')),
    PARTITION sales_q2_2017 VALUES LESS THAN (TO_DATE('01-JUL-2017','dd-MON-yyyy')),
    PARTITION sales_q3_2017 VALUES LESS THAN (TO_DATE('01-OCT-2017','dd-MON-yyyy')),
    PARTITION sales_q4_2017 VALUES LESS THAN (TO_DATE('01-JAN-2018','dd-MON-yyyy')))
    ONLINE
  UPDATE INDEXES
   ( i1_cust_id_indx LOCAL, 
     i2_time_id_indx GLOBAL PARTITION BY RANGE (time_id) 
     (PARTITION ip1_indx VALUES LESS THAN (MAXVALUE) ) );

SELECT TABLE_NAME, PARTITIONING_TYPE, SUBPARTITIONING_TYPE FROM USER_PART_TABLES WHERE TABLE_NAME ='MOD_SALES_PARTITIONING';
TABLE_NAME                  PARTITION      SUBPARTIT
--------------------------- -------------- ----------
MOD_SALES_PARTITIONING      RANGE          HASH

SELECT TABLE_NAME, PARTITION_NAME, SUBPARTITION_NAME FROM USER_TAB_SUBPARTITIONS WHERE TABLE_NAME ='MOD_SALES_PARTITIONING';
TABLE_NAME                  PARTITION_NAME     SUBPARTITION_NAME 
--------------------------- ------------------ ------------------
MOD_SALES_PARTITIONING      SALES_Q1_2017      SYS_SUBP567       
MOD_SALES_PARTITIONING      SALES_Q1_2017      SYS_SUBP568
MOD_SALES_PARTITIONING      SALES_Q1_2017      SYS_SUBP569
MOD_SALES_PARTITIONING      SALES_Q1_2017      SYS_SUBP570
...

4.4.10 パーティションおよびサブパーティションの移動について

パーティションの物理記憶域属性を変更するには、ALTER TABLE文でMOVE PARTITION句を使用します。

ALTER TABLE文のMOVE PARTITION句は、次の目的に使用できます。

  • データを再クラスタリングして断片化を減らす場合

  • 別の表領域にパーティションを移動する場合

  • 作成時属性を変更する場合

  • 表圧縮を使用してデータを圧縮形式で保存する場合

通常は、ALTER TABLE/INDEX MODIFY PARTITION文を使用して、一度にパーティションの物理記憶域属性を変更できます。ただし、TABLESPACEなどの一部の物理属性は、MODIFY PARTITIONを使用して変更できません。そのような場合には、MOVE PARTITION句を使用します。表圧縮などのその他の属性を変更すると、既存のデータではなく、後続の記憶域のみが影響されます。

移動するパーティションにデータが含まれる場合は、次の表で説明するように、索引はUNUSABLEとマークされます。

表のタイプ 索引の動作

通常(ヒープ)

ALTER TABLE文の一部にUPDATE INDEXESを指定しない場合:

  • 各ローカル索引の一致するパーティションはUNUSABLEとマークされます。MOVE PARTITIONの発行後にそれらの索引パーティションを再作成する必要があります。

  • すべてのグローバル索引またはパーティション・グローバル索引のすべてのパーティションがUNUSABLEとマークされます。

索引構成

移動するパーティションに定義された任意のローカルまたはグローバル索引は、主キー・ベースの論理行IDであるため使用可能なままです。ただし、これらの行IDの不確定情報は不適切になります。

この項では、次の項目について説明します。

関連項目:

4.4.10.1 表パーティションの移動

パーティションを移動するには、MOVE PARTITION句を使用します。

たとえば、(I/Oを調整するために)最もアクティブなパーティションをアクションは記録せずにデータを圧縮し、一連の独自のディスクに存在する表領域に移動するには、次の文を発行します。

ALTER TABLE parts MOVE PARTITION depot2
     TABLESPACE ts094 NOLOGGING COMPRESS;

この文では、新しい表領域を指定しない場合でも、古いパーティション・セグメントが削除され、新しいセグメントが作成されます。

パーティション化索引構成表のパーティションを移動する場合は、MOVE PARTITION句の一部としてMAPPING TABLE句を指定できます。これにより、マッピング表のパーティションは表パーティションとともに新しい場所に移動されます。

時間隔または時間隔 - *パーティション表の場合、移動できるのは、マテリアライズ化済のレンジ・パーティションまたは時間隔パーティションのみです。パーティションの移動操作では、時間隔または時間隔 - *パーティション表の遷移点は移動されません。

親表のパーティションには関係なく、参照パーティション表のパーティションを移動できます。

4.4.10.2 サブパーティションの移動

サブパーティションを移動するには、MOVE SUBPARTITION句を使用します。

次の文では、表のサブパーティションにあるデータの移動方法を示します。この例では、PARALLEL句も指定されています。

ALTER TABLE scuba_gear MOVE SUBPARTITION bcd_types 
     TABLESPACE tbs23 PARALLEL (DEGREE 2);

親表のサブパーティションには関係なく、参照パーティション表のサブパーティションを移動できます。

パーティションおよびサブパーティションに対するSPLITMERGEMOVETRUNCATEおよびDROP操作を行うと、ORPHANED_ENTRIES AS YESになることに注意してください。これは予期された動作です。

4.4.10.3 索引パーティションの移動

通常の表に対してALTER TABLE MOVE PARTITION文を実行すると、グローバル索引のすべてのパーティションがUNUSABLEとマークされます。

ALTER INDEX REBUILD PARTITION文を使用して各パーティションを再作成して、索引全体を再作成できます。これらの再作成は同時に実行できます。

単純に索引を削除して再作成することもできます。

4.4.11 索引パーティションの再作成について

索引の再作成には複数の利点があります。

次に、索引パーティションを再作成する理由をいくつか示します。

  • 領域のリカバリおよびパフォーマンスの向上

  • メディア障害により破損した索引パーティションの修復

  • SQL*Loaderまたはインポート・ユーティリティを使用して基礎となる表パーティションをロードした後のローカル索引パーティションの再作成

  • UNUSABLEとマークされた索引パーティションの再作成

  • Bツリー索引のキー圧縮の有効化

次の項では、索引パーティションおよびサブパーティションを再作成するためのオプションを説明します。

この項では、次の項目について説明します。

4.4.11.1 グローバル索引パーティションの再作成について

グローバル索引パーティションは、いくつかの方法で再作成できます。

  • ALTER INDEX REBUILD PARTITION文を発行して各パーティションを再作成する方法(再作成は同時に実行できます)。

  • グローバル索引全体を削除して再作成する方法。表がスキャンされるのは一度のみであるため、この方法はより効率的です。

索引付きのパーティション表におけるほとんどのメンテナンス操作では、DDL文にUPDATE INDEXESを指定することにより、オプションで索引の再作成を回避できます。

4.4.11.2 ローカル索引パーティションの再作成について

ローカル索引パーティションは、いくつかの方法で再作成できます。

ALTER INDEXまたはALTER TABLEを使用し、次のようにしてローカル索引を再作成します。

  • ALTER INDEX REBUILD PARTITION/SUBPARTITION

    この文では、索引パーティションまたはサブパーティションが無条件に再作成されます。

  • ALTER TABLE MODIFY PARTITION/SUBPARTITION REBUILD UNUSABLE LOCAL INDEXES

    この文では、表のパーティションまたはサブパーティションに対する使用不可の索引がすべて検索され、それらが再作成されます。UNUSABLEとマークされた索引パーティションのみが再作成されます。

次の各項では、索引の再作成の例について説明します。

4.4.11.2.1 ALTER INDEXを使用したパーティションの再作成

ALTER INDEX REBUILD PARTITION文によって、索引の1つのパーティションが再作成されます。

これは、コンポジット・パーティション表には使用できません。このコマンドで再作成できるのは実際の物理セグメントのみです。索引を再作成するとき、パーティションの新しい表領域への移動や属性の変更を選択することもできます。

コンポジット・パーティション表では、ALTER INDEX REBUILD SUBPARTITIONを使用して、索引のサブパーティションを再作成します。サブパーティションを別の表領域に移動するか、PARALLEL句を指定できます。次の文では、表のローカル索引のサブパーティションを再作成し、索引サブパーティションを別の表領域に移動します。

ALTER INDEX scuba
   REBUILD SUBPARTITION bcd_types
   TABLESPACE tbs23 PARALLEL (DEGREE 2);
4.4.11.2.2 ALTER TABLEを使用した索引パーティションの再作成

ALTER TABLE MODIFY PARTITIONREBUILD UNUSABLE LOCAL INDEXES句により、使用できない索引パーティションを再作成できます。

ただし、文では、索引パーティションの再作成の新規属性を指定できません。次の例では、表scubagearのパーティションp1の使用できないローカル索引パーティションを検出して再作成します。

ALTER TABLE scubagear
   MODIFY PARTITION p1 REBUILD UNUSABLE LOCAL INDEXES;

ALTER TABLE MODIFY SUBPARTITIONは、使用できないローカル索引サブパーティションの再作成のための句です。

4.4.12 パーティションおよびサブパーティション名の変更について

表と索引の両方のパーティションおよびサブパーティション名を変更できます。

パーティション名を変更する理由の1つは、別のメンテナンス操作でパーティションに割り当てられたデフォルトのシステム名とは対照的に、意味のわかる名前を割り当てるためです。

すべてのパーティション化メソッドで、パーティションを識別するためのFOR(value)メソッドがサポートされています。このメソッドを使用して、システム生成されたパーティション名をより意味のわかりやすい名前に変更できます。これは、時間隔または時間隔 - *パーティション表に特に便利です。

参照パーティション化された親表および子表のパーティションやサブパーティション名を個別に変更できます。親表での名前の変更操作は、子表にカスケードされません。

この項では、次の項目について説明します。

4.4.12.1 表パーティション名の変更

ALTER TABLE RENAME PARTITION部門を使用して、レンジ、ハッシュまたはリスト・パーティションの名前を変更できます。

たとえば:

ALTER TABLE scubagear RENAME PARTITION sys_p636 TO tanks;
4.4.12.2 表サブパーティション名の変更

表のサブパーティションに新しい名前を割り当てられます。

この場合は、ALTER TABLE RENAME SUBPARTITION構文を使用します。

4.4.12.3 索引パーティション名の変更について

ALTER INDEX文により、索引パーティションおよびサブパーティションの名前を変更できます。

4.4.12.3.1 索引パーティション名の変更

索引パーティション名を変更するには、ALTER INDEX RENAME PARTITION文を使用します。

ALTER INDEX文では、パーティションを識別するためのFOR(value)を使用できません。名前の変更操作では、元のパーティション名を使用する必要があります。

4.4.12.3.2 索引サブパーティション名の変更

索引サブパーティション名を変更するには、ALTER INDEX RENAME SUBPARTITION文を使用します。

次の文では、基礎となる表にパーティションを追加した結果、システム生成名が付けられたサブパーティションの名前を変更する方法を示します。

ALTER INDEX scuba RENAME SUBPARTITION sys_subp3254 TO bcd_types;

4.4.13 パーティションおよびサブパーティションの分割について

パーティションの内容を2つの新しいパーティションに分割できます。

ALTER TABLEまたはALTER INDEX文のSPLIT PARTITION句は、パーティションのコンテンツを2つの新しいパーティションに再分散するために使用されます。パーティションが大きくなりすぎてバックアップ、リカバリまたはメンテナンス操作の完了に長い時間がかかるようになった場合や、単純にパーティションのデータが増えすぎた場合に、再分散を検討します。SPLIT PARTITION句を使用して、I/Oロードを再分散することもできます。この句は、ハッシュ・パーティションまたはサブパーティションには使用できません。

分割するパーティションにデータが含まれる場合は、次の表で説明するように、索引はUNUSABLEとマークされます。

表のタイプ 索引の動作

通常(ヒープ)

ALTER TABLE文の一部にUPDATE INDEXESを指定しない場合:

  • データベースにより、各ローカル索引の(2つある)新しいパーティションがUNUSABLEとマークされます。

  • すべてのグローバル索引またはパーティション・グローバル索引のすべてのパーティションがUNUSABLEとマークされ、再作成する必要があります。

索引構成

  • データベースにより、各ローカル索引の(2つある)新しいパーティションがUNUSABLEとマークされます。

  • すべてのグローバル索引は使用可能なままです。

親表を除いて、参照パーティション表のパーティションまたはサブパーティションを分割できません。親表のパーティションまたはサブパーティションを分割すると、すべての子表にカスケードされます。ただし、パーティションまたはサブパーティションを分割するために、親表でSPLIT文を発行する場合は、DEPENDENT TABLES句を使用して依存表に特定のプロパティを設定できます。

SPLIT操作によるパーティション・メンテナンスは、キーワードONLINEが指定されたオンライン操作としてヒープ構成表でサポートされているため、パーティション・メンテナンス操作が進行中の同時DML操作が可能になります。

ONLINE操作では、UPDATE INDEXES句を指定したかどうかに関係なく、索引の分割はデフォルトで常に更新されます。

SPLIT操作でのキーワードONLINEの使用の例は、例4-37を参照してください。

この項では、次の項目について説明します。

4.4.13.1 レンジ・パーティション表のパーティションの分割

ALTER TABLE SPLIT PARTITION文を使用して、レンジ・パーティションを分割できます。

このSQL文では、パーティションの分割点である、パーティションのレンジ内のパーティション化キー列の値を指定する必要があります。

分割の結果得られるパーティションに、オプションで新しい属性を指定できます。表にローカル索引が定義されている場合、この文では、各ローカル索引の一致するパーティションも分割されます。

新しいパーティションの名前を指定しない場合、データベースにより、SYS_Pnという書式の名前が割り当てられます。データ・ディクショナリを調査して、新しいローカル索引パーティションに割り当てられた名前を検出できます。それらの名前を変更する必要がある場合もあります。指定しない属性は、元のパーティションから継承されます。

例4-36 レンジ・パーティション表のパーティションの分割、および索引の再作成

この例のfee_katyは、表vet_catsのパーティションです。これにはローカル索引jaf1があります。この表にはグローバル索引vetもあります。vetには2つのパーティションvet_partavet_partbが含まれます。結果の新しい2つのパーティションの1つ目には、パーティション化キー列の値が、指定された値より小さいものをマッピングする元のパーティションのすべての行が含まれます。2つ目のパーティションには、パーティション化キー列値が、指定された値以上のものをマッピングするすべての行が含まれます。次のSQL文では、パーティションfee_katyが分割され、索引パーティションが再作成されます。

ALTER TABLE vet_cats SPLIT PARTITION 
      fee_katy at (100) INTO ( PARTITION
      fee_katy1, PARTITION fee_katy2);
ALTER INDEX JAF1 REBUILD PARTITION fee_katy1;
ALTER INDEX JAF1 REBUILD PARTITION fee_katy2;
ALTER INDEX VET REBUILD PARTITION vet_parta;
ALTER INDEX VET REBUILD PARTITION vet_partb;

例4-37 オンラインでのレンジ・パーティション表のパーティションの分割

この例では、ORDERS表のsales_q4_2016パーティションが、月ごとに別個のパーティションに分割されます。ONLINEキーワードは、パーティション・メンテナンス操作の進行中に同時DML操作を可能にするために指定されます。

ORDERS表に索引がある場合、これらはオンライン分割の一部として自動的にメンテナンスされます。

CREATE TABLE orders
 (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_2016 VALUES LESS THAN (TO_DATE('01-APR-2016','dd-MON-yyyy')),
   PARTITION sales_q2_2016 VALUES LESS THAN (TO_DATE('01-JUL-2016','dd-MON-yyyy')),
   PARTITION sales_q3_2016 VALUES LESS THAN (TO_DATE('01-OCT-2016','dd-MON-yyyy')),
   PARTITION sales_q4_2016 VALUES LESS THAN (TO_DATE('01-JAN-2017','dd-MON-yyyy')) 
   );

ALTER TABLE orders 
  SPLIT PARTITION sales_q4_2016 INTO
  (PARTITION sales_oct_2016 VALUES LESS THAN (TO_DATE('01-NOV-2016','dd-MON-yyyy')),
   PARTITION sales_nov_2016 VALUES LESS THAN (TO_DATE('01-DEC-2016','dd-MON-yyyy')),
   PARTITION sales_dec_2016
   )
  ONLINE;
4.4.13.2 リスト・パーティション表のパーティションの分割

ALTER TABLE SPLIT PARTITION文を使用して、リスト・パーティションを分割できます。

SPLIT PARTITION句を使用すると、リテラル値のリストを指定してパーティションを定義できます。このパーティションに、対応するパーティション化キー値を含む行が挿入されます。元のパーティションのその他の行は、元のパーティションの残りの値が値リストに含まれる2番目のパーティションに挿入されます。分割の結果である2つのパーティションに、オプションで新しい属性を指定できます。

次の文では、パーティションregion_eastが2つのパーティションに分割されます。

ALTER TABLE sales_by_region 
   SPLIT PARTITION region_east VALUES ('CT', 'MA', 'MD') 
   INTO 
    ( PARTITION region_east_1 
         TABLESPACE tbs2,
      PARTITION region_east_2
        STORAGE (INITIAL 8M)) 
   PARALLEL 5;

元のregion_eastパーティションのリテラル値のリストは、次のように指定されています。

PARTITION region_east VALUES ('MA','NY','CT','NH','ME','MD','VA','PA','NJ')

2つの新しいパーティションは次のとおりです。

  • リテラル値のリストが('CT','MA','MD')region_east_1

  • 残りのリテラル値のリスト('NY','NH','ME','VA','PA','NJ')を継承しているregion_east_2

個々のパーティションには、パーティション・レベルで指定された新しい物理属性があります。操作は並列度5で実行されます。

その他のリスト・パーティションの分割と同じように、デフォルトのリスト・パーティションを分割できます。これは、デフォルトのパーティションがあるリスト・パーティション表に新しいパーティションを追加する唯一の方法でもあります。デフォルトのパーティションを分割する際には、指定した値で定義された新しいパーティションと、デフォルトのパーティションとして残る2つ目のパーティションを作成します。

Live SQL:

Oracle Live SQLのOracle Live SQL: リストパーティション表のDEFAULTパーティションの分割で関連する例を参照して実行してください。

例4-38 リスト・パーティション表のデフォルト・パーティションの分割

この例では、sales_by_regionのデフォルトのパーティションを分割することで、新しいパーティションを作成します。

CREATE TABLE sales_by_region
     (dept_number         NUMBER NOT NULL,
      dept_name           VARCHAR2(20),
      quarterly_sales     NUMBER(10,2),
      state               VARCHAR2(2)
 )
 PARTITION BY LIST (state)
 (
  PARTITION yearly_north VALUES ('MN','WI','MI'),
  PARTITION yearly_south VALUES ('NM','TX','GA'),
  PARTITION yearly_east VALUES  ('MA','NY','NC'),
  PARTITION yearly_west VALUES  ('CA','OR','WA'),
  PARTITION unknown VALUES (DEFAULT)
 );

SELECT PARTITION_NAME, HIGH_VALUE FROM USER_TAB_PARTITIONS WHERE TABLE_NAME ='SALES_BY_REGION';
PARTITION_NAME       HIGH_VALUE
--------------       ---------------
UNKNOWN              DEFAULT
YEARLY_EAST          'MA', 'NY', 'NC'
YEARLY_NORTH         'MN', 'WI', 'MI'
YEARLY_SOUTH         'NM', 'TX', 'GA'
YEARLY_WEST          'CA', 'OR', 'WA
5 rows selected.

INSERT INTO SALES_BY_REGION VALUES (002, 'AUTO NORTH', 450000, 'MN');
INSERT INTO SALES_BY_REGION VALUES (002, 'AUTO NORTH', 495000, 'WI');
INSERT INTO SALES_BY_REGION VALUES (002, 'AUTO NORTH', 850000, 'MI');

INSERT INTO SALES_BY_REGION VALUES (004, 'AUTO SOUTH',  595000, 'NM');
INSERT INTO SALES_BY_REGION VALUES (004, 'AUTO SOUTH', 4825000, 'TX');
INSERT INTO SALES_BY_REGION VALUES (004, 'AUTO SOUTH',  945000, 'GA');

INSERT INTO SALES_BY_REGION VALUES (006, 'AUTO EAST', 2125000, 'MA');
INSERT INTO SALES_BY_REGION VALUES (006, 'AUTO EAST', 6101000, 'NY');
INSERT INTO SALES_BY_REGION VALUES (006, 'AUTO EAST',  741000, 'NC');

INSERT INTO SALES_BY_REGION VALUES (008, 'AUTO WEST', 7201000, 'CA');
INSERT INTO SALES_BY_REGION VALUES (008, 'AUTO WEST',  901000, 'OR');
INSERT INTO SALES_BY_REGION VALUES (008, 'AUTO WEST', 1125000, 'WA');

INSERT INTO SALES_BY_REGION VALUES (009, 'AUTO MIDWEST', 1950000, 'AZ');
INSERT INTO SALES_BY_REGION VALUES (009, 'AUTO MIDWEST', 5725000, 'UT');

SELECT DEPT_NUMBER, DEPT_NAME, QUARTERLY_SALES, STATE FROM SALES_BY_REGION PARTITION(yearly_north);
DEPT_NUMBER DEPT_NAME            QUARTERLY_SALES ST
----------- -------------------- --------------- --
2           AUTO NORTH                    450000 MN
2           AUTO NORTH                    495000 WI
2           AUTO NORTH                    850000 MI

SELECT DEPT_NUMBER, DEPT_NAME, QUARTERLY_SALES, STATE FROM SALES_BY_REGION PARTITION(yearly_south);
DEPT_NUMBER DEPT_NAME            QUARTERLY_SALES ST
----------- -------------------- --------------- --
4           AUTO SOUTH                    595000 NM
4           AUTO SOUTH                   4825000 TX
4           AUTO SOUTH                    945000 GA

…

SELECT DEPT_NUMBER, DEPT_NAME, QUARTERLY_SALES, STATE FROM SALES_BY_REGION PARTITION(unknown);
DEPT_NUMBER DEPT_NAME            QUARTERLY_SALES ST
----------- -------------------- --------------- --
9           AUTO MIDWEST                 1950000 AZ
9           AUTO MIDWEST                 5725000 UT

REM Note that the following ADD PARTITION statement fails. This action fails because 
REM all undefined values are automatically included in the DEFAULT partition.
ALTER TABLE sales_by_region ADD PARTITION yearly_midwest VALUES ('AZ', 'UT');
ORA-14323: cannot add partition when DEFAULT partition exists 

REM You must SPLIT the DEFAULT partition to add a new partition.
ALTER TABLE sales_by_region
   SPLIT PARTITION unknown VALUES ('AZ', 'UT')
   INTO
    ( PARTITION yearly_midwest,
      PARTITION unknown);

SELECT PARTITION_NAME, HIGH_VALUE FROM USER_TAB_PARTITIONS WHERE TABLE_NAME ='SALES_BY_REGION';
PARTITION_NAME       HIGH_VALUE
--------------       ---------------
UNKNOWN              DEFAULT
YEARLY_EAST          'MA', 'NY', 'NC'
YEARLY_MIDWEST       'AZ', 'UT'
YEARLY_NORTH         'MN', 'WI', 'MI'
YEARLY_SOUTH         'NM', 'TX', 'GA'
YEARLY_WEST          'CA', 'OR', 'WA'
6 Rows selected.

SELECT DEPT_NUMBER, DEPT_NAME, QUARTERLY_SALES, STATE FROM SALES_BY_REGION PARTITION(yearly_midwest);
DEPT_NUMBER DEPT_NAME            QUARTERLY_SALES ST
----------- -------------------- --------------- --
          9 AUTO MIDWEST                 1950000 AZ
          9 AUTO MIDWEST                 5725000 UT

SELECT DEPT_NUMBER, DEPT_NAME, QUARTERLY_SALES, STATE FROM SALES_BY_REGION PARTITION(unknown);
no rows selected

REM Split the DEFAULT partition again to add a new 'yearly_mideast' partition.
ALTER TABLE sales_by_region
   SPLIT PARTITION unknown VALUES ('OH', 'IL')
   INTO
    ( PARTITION yearly_mideast,
      PARTITION unknown);
Table altered.

SELECT PARTITION_NAME, HIGH_VALUE FROM USER_TAB_PARTITIONS WHERE TABLE_NAME ='SALES_BY_REGION';
PARTITION_NAME      HIGH_VALUE
------------------  ------------------
UNKNOWN             DEFAULT
YEARLY_EAST         'MA', 'NY', 'NC'
YEARLY_MIDEAST      'OH', 'IL'
YEARLY_MIDWEST      'AZ', 'UT'
YEARLY_NORTH        'MN', 'WI', 'MI'
YEARLY_SOUTH        'NM', 'TX', 'GA'
YEARLY_WEST         'CA', 'OR', 'WA'
7 rows selected.

INSERT INTO SALES_BY_REGION VALUES (007, 'AUTO MIDEAST',  925000, 'OH');
INSERT INTO SALES_BY_REGION VALUES (007, 'AUTO MIDEAST', 1325000, 'IL');

SELECT DEPT_NUMBER, DEPT_NAME, QUARTERLY_SALES, STATE FROM SALES_BY_REGION PARTITION(yearly_mideast);
DEPT_NUMBER DEPT_NAME            QUARTERLY_SALES ST
----------- -------------------- --------------- --
          7 AUTO MIDEAST                  925000 OH
          7 AUTO MIDEAST                 1325000 IL

SELECT DEPT_NUMBER, DEPT_NAME, QUARTERLY_SALES, STATE FROM SALES_BY_REGION PARTITION(unknown);
no rows selected
4.4.13.3 時間隔パーティション表のパーティションの分割

時間隔パーティション表でALTER TABLE SPLIT PARTITION文を使用して、レンジまたはマテリアライズ化された時間隔パーティションを分割できます。

時間隔パーティション表のレンジ・パーティションの分割については、「レンジ・パーティション表のパーティションの分割」で説明しています。

マテリアライズ化された時間隔パーティションを分割するには、パーティションの分割点である、時間隔パーティション内のパーティション化キー列の値を指定します。結果の新しい2つのパーティションの1つ目には、パーティション化キー列の値が、指定された値より小さいものをマッピングする元のパーティションのすべての行が含まれます。2つ目のパーティションには、パーティション化キー列値が、指定された値以上のものをマッピングするすべての行が含まれます。パーティションの分割操作により、分割したパーティションの高い方の上限まで遷移点が移動され、新しく分割されたパーティションより小さいすべてのマテリアライズ化された時間隔パーティションは、上限が時間隔の上限によって定義された状態で、暗黙的にレンジ・パーティションに変換されます。

分割の結果である2つのレンジ・パーティションに、オプションで新しい属性を指定できます。表にローカル索引が定義されている場合、この文では、各ローカル索引の一致するパーティションも分割されます。作成されていない時間隔パーティションは分割できません。

次の例では、月単位の時間隔パーティション表transactionsの2007年5月のパーティションを分割する方法を示します。

ALTER TABLE transactions
    SPLIT PARTITION FOR(TO_DATE('01-MAY-2007','dd-MON-yyyy'))
    AT (TO_DATE('15-MAY-2007','dd-MON-yyyy'));
4.4.13.4 * - ハッシュ・パーティションの分割

ALTER TABLE SPLIT PARTITION文を使用して、ハッシュ・パーティションを分割できます。

これは、* - ハッシュ・パーティションのマージの逆の操作です。* - ハッシュ・パーティションを分割すると、新しいサブパーティションが、SUBPARTITIONSまたはSUBPARTITION句で指定されたサブパーティション数に再度ハッシュされます。または、そのような句が含まれていない場合、新しいパーティションは、分割されるパーティションのサブパーティション(および表領域)の数を継承します。

2つの* - ハッシュ・パーティションをマージする場合と、* - ハッシュ・パーティションを分割する場合では、プロパティの継承方法が異なります。パーティションを分割する場合は親が1つのみであるため、新しいパーティションは元のパーティションからプロパティを継承できます。ただし、パーティションがマージされるとき、プロパティを表レベルのデフォルトから継承する必要があります。親が2つあり、新しいパーティションが片方を無視していずれか1つから継承することはできないためです。

次の例では、レンジ - ハッシュ・パーティションを分割します。

ALTER TABLE all_seasons SPLIT PARTITION quarter_1 
     AT (TO_DATE('16-dec-1997','dd-mon-yyyy'))
     INTO (PARTITION q1_1997_1 SUBPARTITIONS 4 STORE IN (ts1,ts3),
           PARTITION q1_1997­_2);

時間隔 - ハッシュ・パーティション表の分割のルールは、時間隔パーティション表の分割のルールと同じです。「時間隔パーティション表のパーティションの分割」に説明されているように、遷移点は分割されたパーティションの上限に変更されます。

4.4.13.5 * - リスト・パーティション表のパーティションの分割

パーティションは、リスト・パーティション表のパーティション・レベルとサブパーティション・レベルの両方で分割できます。

4.4.13.5.1 * - リスト・パーティションの分割

ALTER TABLE SPLIT PARTITION文を使用して、リスト・パーティションを分割できます。

* - リスト・パーティション表のパーティションの分割は、「リスト・パーティション表のパーティションの分割」での説明と似ています。新しいパーティションのいずれにも、サブパーティションのリテラル値のリストを指定できません。新しいパーティションは、分割元のパーティションからサブパーティションの説明を継承します。

次の例では、quarterly_regional_sales表のq1_1999パーティションを分割します。

ALTER TABLE quarterly_regional_sales SPLIT PARTITION q1_1999
   AT (TO_DATE('15-Feb-1999','dd-mon-yyyy'))
   INTO ( PARTITION q1_1999_jan_feb
             TABLESPACE ts1,
          PARTITION q1_1999_feb_mar
             STORAGE (INITIAL 8M) TABLESPACE ts2) 
   PARALLEL 5;

この操作により、パーティションq1_1999が、q1_1999_jan_febおよびq1_1999_feb_marの2つの結果のパーティションに分割されます。どちらのパーティションも、元のパーティションからサブパーティションの説明を継承します。個々のパーティションには、パーティション・レベルで指定された新しい物理属性(表領域を含む)があります。これらの新しい属性は、新しいパーティションのデフォルト属性になります。この操作は並列度5で実行されます。

ALTER TABLE SPLIT PARTITION文には、コンポジット・パーティション表のパーティションを分割した結果のサブパーティションに、明示的に名前を付ける方法がありません。ただし、partition name_subpartition nameという書式の名前が付けられた親パーティションのサブパーティションには、データベースにより、新規に作成されたサブパーティションに新しいパーティション名を使用して対応する名前が生成されます。その他すべてのサブパーティションには、SYS_SUBPnという書式のシステム生成の名前が割り当てられます。システム生成の名前は、名前が指定されていないパーティションを分割した結果のサブパーティションにも割り当てられます。名前が付けられていないパーティションには、SYS_Pnという書式のシステム生成のパーティション名が割り当てられます。

次の問合せでは、表quarterly_regional_salesに対する前のパーティション分割操作で生成されたサブパーティション名が表示されます。「コンポジット・レンジ - リスト・パーティション表の作成について」で作成されてから、この表に対してこの章でこれまでに実行された他の操作の結果も反映しています。

SELECT PARTITION_NAME, SUBPARTITION_NAME, TABLESPACE_NAME
  FROM DBA_TAB_SUBPARTITIONS
  WHERE TABLE_NAME='QUARTERLY_REGIONAL_SALES'
  ORDER BY PARTITION_NAME;

PARTITION_NAME       SUBPARTITION_NAME              TABLESPACE_NAME
-------------------- ------------------------------ ---------------
Q1_1999_FEB_MAR      Q1_1999_FEB_MAR_WEST           TS2
Q1_1999_FEB_MAR      Q1_1999_FEB_MAR_NORTHEAST      TS2
Q1_1999_FEB_MAR      Q1_1999_FEB_MAR_SOUTHEAST      TS2
Q1_1999_FEB_MAR      Q1_1999_FEB_MAR_NORTHCENTRAL   TS2
Q1_1999_FEB_MAR      Q1_1999_FEB_MAR_SOUTHCENTRAL   TS2
Q1_1999_FEB_MAR      Q1_1999_FEB_MAR_SOUTH          TS2
Q1_1999_JAN_FEB      Q1_1999_JAN_FEB_WEST           TS1
Q1_1999_JAN_FEB      Q1_1999_JAN_FEB_NORTHEAST      TS1
Q1_1999_JAN_FEB      Q1_1999_JAN_FEB_SOUTHEAST      TS1
Q1_1999_JAN_FEB      Q1_1999_JAN_FEB_NORTHCENTRAL   TS1
Q1_1999_JAN_FEB      Q1_1999_JAN_FEB_SOUTHCENTRAL   TS1
Q1_1999_JAN_FEB      Q1_1999_JAN_FEB_SOUTH          TS1
Q1_2000              Q1_2000_NORTHWEST              TS3
Q1_2000              Q1_2000_SOUTHWEST              TS3
Q1_2000              Q1_2000_NORTHEAST              TS3
Q1_2000              Q1_2000_SOUTHEAST              TS3
Q1_2000              Q1_2000_NORTHCENTRAL           TS3
Q1_2000              Q1_2000_SOUTHCENTRAL           TS3
Q2_1999              Q2_1999_NORTHWEST              TS4
Q2_1999              Q2_1999_SOUTHWEST              TS4
Q2_1999              Q2_1999_NORTHEAST              TS4
Q2_1999              Q2_1999_SOUTHEAST              TS4
Q2_1999              Q2_1999_NORTHCENTRAL           TS4
Q2_1999              Q2_1999_SOUTHCENTRAL           TS4
Q3_1999              Q3_1999_NORTHWEST              TS4
Q3_1999              Q3_1999_SOUTHWEST              TS4
Q3_1999              Q3_1999_NORTHEAST              TS4
Q3_1999              Q3_1999_SOUTHEAST              TS4
Q3_1999              Q3_1999_NORTHCENTRAL           TS4
Q3_1999              Q3_1999_SOUTHCENTRAL           TS4
Q4_1999              Q4_1999_NORTHWEST              TS4
Q4_1999              Q4_1999_SOUTHWEST              TS4
Q4_1999              Q4_1999_NORTHEAST              TS4
Q4_1999              Q4_1999_SOUTHEAST              TS4
Q4_1999              Q4_1999_NORTHCENTRAL           TS4
Q4_1999              Q4_1999_SOUTHCENTRAL           TS4

36 rows selected.
4.4.13.5.2 * - リスト・サブパーティションの分割

ALTER TABLE SPLIT SUBPARTITION文を使用して、リスト・サブパーティションを分割できます。

* - リスト・パーティション表のリスト・サブパーティションの分割は、「リスト・パーティション表のパーティションの分割」で説明されている内容と似ていますが、構文はPARTITIONではなくSUBPARTITIONです。たとえば、次の文では、quarterly_regional_sales表のサブパーティションを分割します。

ALTER TABLE quarterly_regional_sales SPLIT SUBPARTITION q2_1999_southwest
   VALUES ('UT') INTO
      ( SUBPARTITION q2_1999_utah
           TABLESPACE ts2,
        SUBPARTITION q2_1999_southwest
           TABLESPACE ts3
      ) 
   PARALLEL;

この操作により、サブパーティションq2_1999_southwestが、次の2つのサブパーティションに分割されます。

  • リテラル値のリストが('UT')q2_1999_utah

  • 残りのリテラル値のリスト('AZ','NM')を継承しているq2_1999_southwest

個々のサブパーティションには、分割されたサブパーティションから継承された新しい物理属性があります。

時間隔 - リスト・パーティション表のサブパーティションは、レンジ・パーティションまたはマテリアライズ化された時間隔パーティションにのみ分割できます。後続の時間隔パーティションのサブパーティション値を変更するには、サブパーティション・テンプレートを変更する必要があります。

4.4.13.6 * - レンジ・パーティションの分割

ALTER TABLE SPLIT PARTITION文を使用して、レンジ・パーティションを分割できます。

* - レンジ・パーティション表のパーティションの分割は、「レンジ・パーティション表のパーティションの分割」での説明と似ています。新しいパーティションのいずれにも、サブパーティションのレンジ値を指定できません。新しいパーティションは、分割元のパーティションからサブパーティションの説明を継承します。

次の例では、時間隔 - レンジ・パーティション表ordersの2007年5月の時間隔パーティションを分割します。

ALTER TABLE orders
    SPLIT PARTITION FOR(TO_DATE('01-MAY-2007','dd-MON-yyyy'))
    AT (TO_DATE('15-MAY-2007','dd-MON-yyyy'))
    INTO (PARTITION p_fh_may07,PARTITION p_sh_may2007);

この操作により、時間隔パーティションFOR('01-MAY-2007')が、p_fh_may07およびp_sh_may_2007の2つの結果のパーティションに分割されます。どちらのパーティションも、元のパーティションからサブパーティションの説明を継承します。「時間隔パーティションのマージ」で説明されているように、2007年6月のパーティションより前の時間隔パーティションはレンジ・パーティションに変換されます。

ALTER TABLE SPLIT PARTITION文には、コンポジット・パーティション表のパーティションを分割した結果のサブパーティションに、明示的に名前を付ける方法がありません。ただし、partition name_subpartition nameという書式の名前が付けられた親パーティションのサブパーティションには、データベースにより、新規に作成されたサブパーティションに新しいパーティション名を使用して対応する名前が生成されます。その他すべてのサブパーティションには、SYS_SUBPnという書式のシステム生成の名前が割り当てられます。システム生成の名前は、名前が指定されていないパーティションを分割した結果のサブパーティションにも割り当てられます。名前が付けられていないパーティションには、SYS_Pnという書式のシステム生成のパーティション名が割り当てられます。

次の問合せでは、表ordersに対する前のパーティション分割操作で生成されたサブパーティション名と上限値が表示されます。表が作成されてから、この章でこれまでに実行された他の操作の結果も反映しています。

BREAK ON partition_name

SELECT partition_name, subpartition_name, high_value
FROM user_tab_subpartitions
WHERE table_name = 'ORCERS'
ORDER BY partition_name, subpartition_position;

PARTITION_NAME            SUBPARTITION_NAME              HIGH_VALUE
------------------------- ------------------------------ ---------------
P_BEFORE_2007             P_BEFORE_2007_P_SMALL          1000
                          P_BEFORE_2007_P_MEDIUM         10000
                          P_BEFORE_2007_P_LARGE          100000
                          P_BEFORE_2007_P_EXTRAORDINARY  MAXVALUE
P_FH_MAY07                SYS_SUBP2985                   1000
                          SYS_SUBP2986                   10000
                          SYS_SUBP2987                   100000
                          SYS_SUBP2988                   MAXVALUE
P_PRE_MAY_2007            P_PRE_MAY_2007_P_SMALL         1000
                          P_PRE_MAY_2007_P_MEDIUM        10000
                          P_PRE_MAY_2007_P_LARGE         100000
                          P_PRE_MAY_2007_P_EXTRAORDINARY MAXVALUE
P_SH_MAY2007              SYS_SUBP2989                   1000
                          SYS_SUBP2990                   10000
                          SYS_SUBP2991                   100000
                          SYS_SUBP2992                   MAXVALUE
4.4.13.6.1 * - レンジ・サブパーティションの分割

ALTER TABLE SPLIT SUBPARTITION文を使用して、レンジ・サブパーティションを分割できます。

* - レンジ・パーティション表のレンジ・サブパーティションの分割は、「レンジ・パーティション表のパーティションの分割」で説明されている内容と似ていますが、構文はPARTITIONではなくSUBPARTITIONです。たとえば、次の文では、orders表のサブパーティションを分割します。

ALTER TABLE orders
SPLIT SUBPARTITION p_pre_may_2007_p_large AT (50000)
INTO (SUBPARTITION p_pre_may_2007_med_large TABLESPACE TS4
     , SUBPARTITION p_pre_may_2007_large_large TABLESPACE TS5
     );

この操作により、サブパーティションp_pre_may_2007_p_largeが、次の2つのサブパーティションに分割されます。

  • 値が10000から50000のp_pre_may_2007_med_large

  • 値が50000から100000のp_pre_may_2007_large_large

個々のサブパーティションには、分割されたサブパーティションから継承された新しい物理属性があります。

時間隔 - レンジ・パーティション表のサブパーティションは、レンジ・パーティションまたはマテリアライズ化された時間隔パーティションにのみ分割できます。後続の時間隔パーティションのサブパーティションの上限を変更するには、サブパーティション・テンプレートを変更する必要があります。

4.4.13.7 索引パーティションの分割

ローカル索引のパーティションは明示的に分割できません。ローカル索引パーティションが分割されるのは、基礎となる表のパーティションを分割した場合のみです。

ただし、グローバル索引パーティションは、次の例のようにして分割できます。

ALTER INDEX quon1 SPLIT 
    PARTITION canada AT ( 100 ) INTO 
    PARTITION canada1 ..., PARTITION canada2 ...);
ALTER INDEX quon1 REBUILD PARTITION canada1;
ALTER INDEX quon1 REBUILD PARTITION canada2;

分割する索引に索引データが含まれていても問題はなく、元のパーティションがUNUSABLEとマークされていなければ、結果のパーティションを再作成する必要はありません。

4.4.13.8 複数のパーティションへの分割

ALTER TABLE文のSPLIT PARTITIONおよびSPLIT SUBPARTITION句を使用して、1つのパーティションまたはサブパーティションのコンテンツを複数のパーティションまたはサブパーティションに再分散できます。

複数のパーティションに分割すると、現在のパーティションに関連付けられているセグメントが破棄されます。新しい各パーティションで、新しいセグメントが取得され、現在のソース・パーティションから、指定されていない物理属性がすべて継承されます。必要な条件が満たされると、高速分割の最適化が複数パーティションの分割操作に適用されます。

拡張分割構文を使用して、ATまたはVALUES句を指定せずにパーティション表の作成のSQL文と似ている新しいパーティションの説明のリストを指定できます。また、最新パーティションの説明のレンジまたはリスト値句は、ソース・パーティションの上限、および分割結果の最初(N-1)の新しいパーティションに指定されたバウンド値に基づいて導出されます。

次のSQL文は、パーティションを複数のパーティションに分割する例です。

ALTER TABLE SPLIT PARTITION p0 INTO 
  (PARTITION p01 VALUES LESS THAN (25),
   PARTITION p02 VALUES LESS THAN (50), 
   PARTITION p03 VALUES LESS THAN (75),
   PARTITION p04);

ALTER TABLE SPLIT PARTITION p0 INTO 
  (PARTITION p01 VALUES LESS THAN (25),
   PARTITION p02);

2番目のSQLの例では、パーティションp02が元のパーティションp0の上限を持ちます。

レンジ・パーティションをNパーティションに分割するには、パーティション化キー列の(N-1)値は、パーティションを分割するパーティションの範囲内で指定する必要があります。指定される新しい上限値(最上限値は含まない)は、昇順にする必要があります。N番目の新しいパーティションの上限には、分割されるパーティションの上限の値が割り当てられます。分割の結果のN番目の新しいパーティションの名前および物理属性は、オプションで指定できます。

リスト・パーティションをNパーティションに分割するには、リテラル値の(N-1)リストを指定する必要があり、それぞれで対応するパーティション・キー値を持つ行を挿入する最初(N-1)のパーティションを定義します。元のパーティションのその他の行は、元のパーティションの残りのリテラル値が値リストに含まれるN番目の新しいパーティションに挿入されます。2つの値リストを同じパーティション値に含むことはできません。指定される(N-1)値リストは、N番目の新しいパーティションが空であるため、現在のパーティションのすべてのパーティション値を含むことはできません。また、(N-1)値リストは、現在のパーティションに存在しないパーティション値を含むことはできません。

DEFAULTリスト・パーティションまたはMAXVALUEレンジ・パーティションを複数のパーティションに分割する場合、分割結果のN番目の新しいパーティションにDEFAULT値またはMAXVALUEがありますが、指定されたリテラル値リストまたは上限値を使用して最初(N-1)の新しいパーティションが作成されます。コンポジット・パーティション表のパーティションを複数のパーティションに分割する場合、分割結果の新しいパーティションのサブパーティションに関する数値、名前、バウンドおよび物理プロパティの継承について既存の動作を想定しています。SPLIT_TABLE_SUBPARTITION句が同様に拡張され、レンジまたはリスト・サブパーティションをN番目の新しいサブパーティションに分割できます。

ローカルおよびグローバル索引に関するSQL文の動作は、変更されないままです。対応するローカル索引パーティションは、複数のパーティションに分割されます。パーティション表にLOB列が含まれる場合、SPLIT PARTITION句の既存のセマンティックが拡張された構文で適用されます。つまり、現在のパーティションのLOBデータおよび索引セグメントが削除され、新しいパーティションごとに各LOB列の新しいセグメントが作成されます。必要な条件が満たされると、高速分割の最適化が複数パーティションの分割操作に適用されます。

たとえば、次のSQL文は、レンジ・パーティション化されている表salessales_Q4_2007パーティションを次の年の四半期に対応する5つのパーティションに分割します。この例では、パーティションsales_Q4_2008は、暗黙的に分割されたパーティションの上限になります。

ALTER TABLE sales SPLIT PARTITION sales_Q4_2007 INTO
( PARTITION sales_Q4_2007 VALUES LESS THAN (TO_DATE('01-JAN-2008','dd-MON-yyyy')),
  PARTITION sales_Q1_2008 VALUES LESS THAN (TO_DATE('01-APR-2008','dd-MON-yyyy')),
  PARTITION sales_Q2_2008 VALUES LESS THAN (TO_DATE('01-JUL-2008','dd-MON-yyyy')),
  PARTITION sales_Q3_2008 VALUES LESS THAN (TO_DATE('01-OCT-2008','dd-MON-yyyy')),
  PARTITION sales_Q4_2008);

リスト・パーティション化されているサンプル表customersの場合、次の文はパーティションEuropeを3つのパーティションに分割します。

ALTER TABLE list_customers SPLIT PARTITION Europe INTO
  (PARTITION western-europe VALUES ('GERMANY', 'FRANCE'),
   PARTITION southern-europe VALUES ('ITALY'), 
   PARTITION rest-europe);

関連項目:

ドメイン索引がある表に対するマルチパーティション操作の制限事項と特殊要件

4.4.13.9 高速なSPLIT PARTITIONおよびSPLIT SUBPARTITION操作

Oracle Databaseでは、2つ以上の新しいパーティションを作成し、分割元のパーティションの行を複数の新しいパーティションに再分配することで、SPLIT PARTITION操作が実施されます。

この操作には時間がかかります。分割対象のパーティションのすべての行をスキャンしてから、新しいパーティションに1行ずつ挿入する必要があるためです。さらに、UPDATE INDEXES句を使用しない場合、ローカルおよびグローバル索引も再作成する必要があります。

分割操作後に、分割元のパーティションのすべての行が、新しいあるパーティションに含まれ、他のパーティションには行が含まれていない場合があります。これは、表の最初または最後のパーティションを分割した場合によく起こります。このような状況はデータベースにより検出され、分割操作が最適化されます。この最適化により、パーティションの追加操作のように動作する分割操作が高速になります。

具体的には、次の条件をすべて満たしている場合に、SPLIT PARTITION操作がデータベースにより最適化および高速化されます。

  • 結果となるパーティションの1つに、すべての行が含まれます。

  • 空ではない結果のパーティションの記憶域特性が、分割されたパーティションの記憶域特性と同一である必要があります。具体的には、次のようになります:

    • 分割元のパーティションがコンポジットの場合、結果となる新しいパーティションの各サブパーティションの記憶域特性は、分割元のパーティションのサブパーティションの記憶域特性と同一である必要があります。

    • 分割元のパーティションにLOB列が含まれる場合、空ではない新しい結果のパーティションの各LOB(サブ)パーティションの記憶域特性は、分割元のパーティションのLOB(サブ)パーティションの記憶域特性と同一である必要があります。

    • オーバーフローが含まれる索引構成表のパーティションを分割する場合、空ではない新しい結果のパーティションの各オーバーフロー(サブ)パーティションの記憶域特性は、分割元のパーティションのオーバーフロー(サブ)パーティションの記憶域特性と同一である必要があります。

    • マッピング表が含まれる索引構成表のパーティションを分割する場合、空ではない新しい結果のパーティションの各マッピング表(サブ)パーティションの記憶域特性は、分割元のパーティションのマッピング表(サブ)パーティションの記憶域特性と同一である必要があります。

分割後にこれらの条件に一致していれば、UPDATE INDEXES句を指定しなかった場合でも、グローバル索引はすべて使用可能なままです。結果となるパーティションに関連付けられているローカル索引(サブ)パーティションは、分割前に使用可能であった場合は、使用可能なままとなります。空ではない結果のパーティションに対応するローカル索引(サブ)パーティションは、分割されたパーティションのローカル索引(サブ)パーティションと同一になります。SPLIT SUBPARTITION操作にも、同じ最適化が行われます。

4.4.14 パーティションおよびサブパーティションの切捨てについて

パーティションの切捨ては、パーティションのデータはなくなりますが物理的に削除されないことを除き、パーティションの削除に似ています。

表パーティションからすべての行を削除するには、ALTER TABLE TRUNCATE PARTITION文を使用します。索引パーティションは切り捨てられません。ただし、表にローカル索引が定義されている場合には、ALTER TABLE TRUNCATE PARTITION文により各ローカル索引の一致するパーティションが切り捨てられます。UPDATE INDEXESを指定しない場合、グローバル索引はUNUSABLEとマークされ、再作成する必要があります。索引構成表にはUPDATE INDEXESは使用できません。かわりにUPDATE GLOBAL INDEXESを使用してください。

この項では、次の項目について説明します。

関連項目:

4.4.14.1 表パーティションの切捨てについて

領域を解放するかどうかに関係なく、表パーティションからすべての行を削除するには、ALTER TABLE TRUNCATE PARTITION文を使用します。

時間隔パーティション表のパーティションを切り捨てても、遷移点は移動されません。参照パーティション表のパーティションおよびサブパーティションは切り捨てられません。

4.4.14.1.1 データおよびグローバル索引を含む表パーティションの切捨て

データおよびグローバル索引を含む表パーティションを切り捨てる場合、次の方法のいずれかを使用できます。

パーティションにデータおよびグローバル索引が含まれている場合は、次のいずれかの方法(方法1、2または3)を使用して表パーティションを切り捨てます。

方法1

ALTER TABLE TRUNCATE PARTITION文の実行中は、グローバル索引はそのままにします。この例では、表salesにはグローバル索引sales_area_ixがあり、この索引は再作成されます。

ALTER TABLE sales TRUNCATE PARTITION dec98;
ALTER INDEX sales_area_ix REBUILD;

これは、切り捨てられるパーティションに表の合計データの大部分が含まれる大規模な表に最適な方法です。

方法2

ALTER TABLE TRUNCATE PARTITION文を発行する前に、DELETE文を実行してパーティションからすべての行を削除します。DELETE文によりグローバル索引が更新され、トリガーの起動や、REDOおよびUNDOログの生成も行われます。

たとえば、最初のパーティションを切り捨てるには、次の文を実行します。

DELETE FROM sales PARTITION (dec98);
ALTER TABLE sales TRUNCATE PARTITION dec98;

これは、小規模な表、または切り捨てられるパーティションに含まれる表の合計データの割合が少ない場合に、大規模な表に最適な方法です。

方法3

ALTER TABLE文にUPDATE INDEXESを指定します。これにより、パーティションが切り捨てられる時にグローバル索引も切り捨てられます。

ALTER TABLE sales TRUNCATE PARTITION dec98
     UPDATE INDEXES;

非同期グローバル索引メンテナンスでは、この操作はメタデータのみの操作です。

4.4.14.1.2 データおよび参照整合性制約を含むパーティションの切捨て

パーティションにデータが含まれ、参照整合性制約がある場合には、パーティションを切り捨てられません。ただし、削除するパーティションのデータを参照しているデータがない場合は、次のいずれかの方法を使用できます。

表パーティションを切り捨てるには、次のいずれかの方法(方法1または2)を選択してください。

方法1

整合性制約を無効化し、ALTER TABLE TRUNCATE PARTITION文を実行し、整合性制約を再度有効化します。これは、切り捨てられるパーティションに表の合計データの大部分が含まれる大規模な表に最適な方法です。別の表に参照元のデータがある場合には、そのデータを削除して、整合性制約を再度有効化できるようにする必要があります。

方法2

ALTER TABLE TRUNCATE PARTITION文を発行する前に、DELETE文を発行してパーティションからすべての行を削除します。DELETE文によって、参照整合性制約が施行されます。また、トリガーが起動されて、REDOログとUNDOログが生成されます。参照表のデータが削除されるのは、外部キー制約がON DELETE CASCADEオプション付きで作成されていた場合です。

DELETE FROM sales partition (dec94);
ALTER TABLE sales TRUNCATE PARTITION dec94;

これは、小規模な表、または切り捨てられるパーティションに含まれる表の合計データの割合が少ない場合に、大規模な表に最適な方法です。

4.4.14.2 複数のパーティションの切捨て

ALTER TABLE文のTRUNCATE PARTITION句を使用して、レンジまたはリスト・パーティション表から複数のパーティションを切り捨てることができます。

ローカル索引の対応するパーティションは、操作で切り捨てられます。UPDATE INDEXESが指定されていないかぎり、グローバル索引を再構築する必要があります。

次の例では、SQL文のALTER TABLEで表の複数のサブパーティションを切り捨てます。データは切り捨てられますが、パーティションは削除されない点に注意してください。

Live SQL:

関連する例をOracle Live SQLのOracle Live SQL: レンジ・パーティション表の切捨てで参照して実行してください。

例4-39 複数のパーティションの切捨て

CREATE TABLE sales_partition_truncate
  ( product_id       NUMBER(6) NOT NULL,
    customer_id      NUMBER    NOT NULL,
    channel_id       CHAR(1),
    promo_id         NUMBER(6),
    sales_date       DATE,
    quantity_sold    INTEGER,
    amount_sold      NUMBER(10,2)
  )
 PARTITION BY RANGE (sales_date) 
 SUBPARTITION BY LIST (channel_id)
(  PARTITION q3_2018 VALUES LESS THAN (TO_DATE('1-OCT-2018','DD-MON-YYYY'))
   ( SUBPARTITION q3_2018_p_catalog VALUES ('C'),
     SUBPARTITION q3_2018_p_internet VALUES ('I'),
     SUBPARTITION q3_2018_p_partners VALUES ('P'),
     SUBPARTITION q3_2018_p_direct_sales VALUES ('S'),
     SUBPARTITION q3_2018_p_tele_sales VALUES ('T')
   ),
  PARTITION q4_2018 VALUES LESS THAN (TO_DATE('1-JAN-2019','DD-MON-YYYY'))
   ( SUBPARTITION q4_2018_p_catalog VALUES ('C'),
     SUBPARTITION q4_2018_p_internet VALUES ('I'),
     SUBPARTITION q4_2018_p_partners VALUES ('P'),
     SUBPARTITION q4_2018_p_direct_sales VALUES ('S'),
     SUBPARTITION q4_2018_p_tele_sales VALUES ('T')
   ),
  PARTITION q1_2019 VALUES LESS THAN (TO_DATE('1-APR-2019','DD-MON-YYYY'))
   ( SUBPARTITION q1_2019_p_catalog VALUES ('C')
   , SUBPARTITION q1_2019_p_internet VALUES ('I')
   , SUBPARTITION q1_2019_p_partners VALUES ('P')
   , SUBPARTITION q1_2019_p_direct_sales VALUES ('S')
   , SUBPARTITION q1_2019_p_tele_sales VALUES ('T')
   ),
  PARTITION q2_2019 VALUES LESS THAN (TO_DATE('1-JUL-2019','DD-MON-YYYY'))
   ( SUBPARTITION q2_2019_p_catalog VALUES ('C'),
     SUBPARTITION q2_2019_p_internet VALUES ('I'),
     SUBPARTITION q2_2019_p_partners VALUES ('P'),
     SUBPARTITION q2_2019_p_direct_sales VALUES ('S'),
     SUBPARTITION q2_2019_p_tele_sales VALUES ('T')
   ),
  PARTITION q3_2019 VALUES LESS THAN (TO_DATE('1-OCT-2019','DD-MON-YYYY'))
   ( SUBPARTITION q3_2019_p_catalog VALUES ('C'),
     SUBPARTITION q3_2019_p_internet VALUES ('I'),
     SUBPARTITION q3_2019_p_partners VALUES ('P'),
     SUBPARTITION q3_2019_p_direct_sales VALUES ('S'),
     SUBPARTITION q3_2019_p_tele_sales VALUES ('T')
   ),
  PARTITION q4_2019 VALUES LESS THAN (TO_DATE('1-JAN-2020','DD-MON-YYYY'))
   ( SUBPARTITION q4_2019_p_catalog VALUES ('C'),
     SUBPARTITION q4_2019_p_internet VALUES ('I'),
     SUBPARTITION q4_2019_p_partners VALUES ('P'),
     SUBPARTITION q4_2019_p_direct_sales VALUES ('S'),
     SUBPARTITION q4_2019_p_tele_sales VALUES ('T')
   )
  );

SELECT TABLE_NAME, PARTITION_NAME, SUBPARTITION_NAME FROM USER_TAB_SUBPARTITIONS 
       WHERE TABLE_NAME ='SALES_PARTITION_TRUNCATE';
TABLE_NAME                  PARTITION_NAME    SUBPARTITION_NAME
–------------------------   –--------------   –------------------
SALES_PARTITION_TRUNCATE    Q1_2019           Q1_2019_P_CATALOG
SALES_PARTITION_TRUNCATE    Q1_2019           Q1_2019_P_DIRECT_SALES
...
30 rows selected.

INSERT INTO sales_partition_truncate VALUES (1001,100,'C',150,'10-SEP-2018',500,2000);
INSERT INTO sales_partition_truncate VALUES (1021,200,'C',160,'16-NOV-2018',100,1500);
INSERT INTO sales_partition_truncate VALUES (1001,100,'C',150,'10-FEB-2019',500,2000);
INSERT INTO sales_partition_truncate VALUES (1021,200,'S',160,'16-FEB-2019',100,1500);
INSERT INTO sales_partition_truncate VALUES (1002,110,'I',180,'15-JUN-2019',100,1000);
INSERT INTO sales_partition_truncate VALUES (5010,150,'P',200,'20-AUG-2019',1000,10000);
INSERT INTO sales_partition_truncate VALUES (1001,100,'T',150,'12-OCT-2019',500,2000);

SELECT * FROM sales_partition_truncate;
PRODUCT_ID CUSTOMER_ID C   PROMO_ID SALES_DAT QUANTITY_SOLD AMOUNT_SOLD
---------- ----------- - ---------- --------- ------------- -----------
      1001         100 C        150 10-SEP-18           500        2000
      1021         200 C        160 16-NOV-18           100        1500
      1001         100 C        150 10-FEB-19           500        2000
      1021         200 S        160 16-FEB-19           100        1500
      1002         110 I        180 15-JUN-19           100        1000
      5010         150 P        200 20-AUG-19          1000       10000
      1001         100 T        150 12-OCT-19           500        2000
7 rows selected.

ALTER TABLE sales_partition_truncate
   TRUNCATE PARTITIONS q3_2018, q4_2018;

SELECT * FROM sales_partition_truncate;
PRODUCT_ID CUSTOMER_ID C   PROMO_ID SALES_DAT QUANTITY_SOLD AMOUNT_SOLD
---------- ----------- - ---------- --------- ------------- -----------
      1001         100 C        150 10-FEB-19           500        2000
      1021         200 S        160 16-FEB-19           100        1500
      1002         110 I        180 15-JUN-19           100        1000
      5010         150 P        200 20-AUG-19          1000       10000
      1001         100 T        150 12-OCT-19           500        2000
5 rows selected.

SELECT TABLE_NAME, PARTITION_NAME, SUBPARTITION_NAME FROM USER_TAB_SUBPARTITIONS 
       WHERE TABLE_NAME ='SALES_PARTITION_TRUNCATE';
TABLE_NAME                  PARTITION_NAME    SUBPARTITION_NAME
–------------------------   –--------------   –------------------
SALES_PARTITION_TRUNCATE    Q1_2019           Q1_2019_P_CATALOG
SALES_PARTITION_TRUNCATE    Q1_2019           Q1_2019_P_DIRECT_SALES
...
SALES_PARTITION_TRUNCATE    Q3_2018           Q3_2018_P_CATALOG
SALES_PARTITION_TRUNCATE    Q3_2018           Q3_2018_P_DIRECT_SALES
SALES_PARTITION_TRUNCATE    Q3_2018           Q3_2018_P_INTERNET
SALES_PARTITION_TRUNCATE    Q3_2018           Q3_2018_P_PARTNERS
SALES_PARTITION_TRUNCATE    Q3_2018           Q3_2018_P_TELE_SALES
...
SALES_PARTITION_TRUNCATE    Q4_2018           Q4_2018_P_CATALOG
SALES_PARTITION_TRUNCATE    Q4_2018           Q4_2018_P_DIRECT_SALES
SALES_PARTITION_TRUNCATE    Q4_2018           Q4_2018_P_INTERNET
SALES_PARTITION_TRUNCATE    Q4_2018           Q4_2018_P_PARTNERS
SALES_PARTITION_TRUNCATE    Q4_2018           Q4_2018_P_TELE_SALES
...
30 rows selected.

ノート:

表にローカル・ドメイン索引がある場合は、単一パーティションまたは表全体の切捨てがサポートされています。ローカル・ドメイン索引が存在する場合、単一のALTER TABLE文での複数パーティションの切り捨ては許可されていません。

4.4.14.3 サブパーティションの切捨て

コンポジット・パーティション表のサブパーティションからすべての行を削除するには、ALTER TABLE TRUNCATE SUBPARTITION文を使用します。

サブパーティションを切り捨てる場合、対応するローカル索引サブパーティションも切り捨てられます。

次の例では、ALTER TABLE文で表のサブパーティションのデータを切り捨てます。この例では、DROP STORAGE句を使用して、削除済の行で占有された領域を表領域のその他のスキーマ・オブジェクトで使用できるようにしています。データは切り捨てられますが、サブパーティションは削除されない点に注意してください。

例4-40 複数のサブパーティションの切捨て

CREATE TABLE sales_partition_truncate
  ( product_id       NUMBER(6) NOT NULL,
    customer_id      NUMBER    NOT NULL,
    channel_id       CHAR(1),
    promo_id         NUMBER(6),
    sales_date       DATE,
    quantity_sold    INTEGER,
    amount_sold      NUMBER(10,2)
  )
 PARTITION BY RANGE (sales_date) 
 SUBPARTITION BY LIST (channel_id)
(  PARTITION q3_2018 VALUES LESS THAN (TO_DATE('1-OCT-2018','DD-MON-YYYY'))
   ( SUBPARTITION q3_2018_p_catalog VALUES ('C'),
     SUBPARTITION q3_2018_p_internet VALUES ('I'),
     SUBPARTITION q3_2018_p_partners VALUES ('P'),
     SUBPARTITION q3_2018_p_direct_sales VALUES ('S'),
     SUBPARTITION q3_2018_p_tele_sales VALUES ('T')
   ),
  PARTITION q4_2018 VALUES LESS THAN (TO_DATE('1-JAN-2019','DD-MON-YYYY'))
   ( SUBPARTITION q4_2018_p_catalog VALUES ('C'),
     SUBPARTITION q4_2018_p_internet VALUES ('I'),
     SUBPARTITION q4_2018_p_partners VALUES ('P'),
     SUBPARTITION q4_2018_p_direct_sales VALUES ('S'),
     SUBPARTITION q4_2018_p_tele_sales VALUES ('T')
   ),
  PARTITION q1_2019 VALUES LESS THAN (TO_DATE('1-APR-2019','DD-MON-YYYY'))
   ( SUBPARTITION q1_2019_p_catalog VALUES ('C')
   , SUBPARTITION q1_2019_p_internet VALUES ('I')
   , SUBPARTITION q1_2019_p_partners VALUES ('P')
   , SUBPARTITION q1_2019_p_direct_sales VALUES ('S')
   , SUBPARTITION q1_2019_p_tele_sales VALUES ('T')
   ),
  PARTITION q2_2019 VALUES LESS THAN (TO_DATE('1-JUL-2019','DD-MON-YYYY'))
   ( SUBPARTITION q2_2019_p_catalog VALUES ('C'),
     SUBPARTITION q2_2019_p_internet VALUES ('I'),
     SUBPARTITION q2_2019_p_partners VALUES ('P'),
     SUBPARTITION q2_2019_p_direct_sales VALUES ('S'),
     SUBPARTITION q2_2019_p_tele_sales VALUES ('T')
   ),
  PARTITION q3_2019 VALUES LESS THAN (TO_DATE('1-OCT-2019','DD-MON-YYYY'))
   ( SUBPARTITION q3_2019_p_catalog VALUES ('C'),
     SUBPARTITION q3_2019_p_internet VALUES ('I'),
     SUBPARTITION q3_2019_p_partners VALUES ('P'),
     SUBPARTITION q3_2019_p_direct_sales VALUES ('S'),
     SUBPARTITION q3_2019_p_tele_sales VALUES ('T')
   ),
  PARTITION q4_2019 VALUES LESS THAN (TO_DATE('1-JAN-2020','DD-MON-YYYY'))
   ( SUBPARTITION q4_2019_p_catalog VALUES ('C'),
     SUBPARTITION q4_2019_p_internet VALUES ('I'),
     SUBPARTITION q4_2019_p_partners VALUES ('P'),
     SUBPARTITION q4_2019_p_direct_sales VALUES ('S'),
     SUBPARTITION q4_2019_p_tele_sales VALUES ('T')
   )
  );

SELECT TABLE_NAME, PARTITION_NAME, SUBPARTITION_NAME FROM USER_TAB_SUBPARTITIONS 
       WHERE TABLE_NAME ='SALES_PARTITION_TRUNCATE';
TABLE_NAME                  PARTITION_NAME    SUBPARTITION_NAME
–------------------------   –--------------   –------------------
SALES_PARTITION_TRUNCATE    Q1_2019           Q1_2019_P_CATALOG
SALES_PARTITION_TRUNCATE    Q1_2019           Q1_2019_P_DIRECT_SALES
...
30 rows selected.

INSERT INTO sales_partition_truncate VALUES (1001,100,'C',150,'10-SEP-2018',500,2000);
INSERT INTO sales_partition_truncate VALUES (1021,200,'C',160,'16-NOV-2018',100,1500);
INSERT INTO sales_partition_truncate VALUES (1001,100,'C',150,'10-FEB-2019',500,2000);
INSERT INTO sales_partition_truncate VALUES (1021,200,'S',160,'16-FEB-2019',100,1500);
INSERT INTO sales_partition_truncate VALUES (1002,110,'I',180,'15-JUN-2019',100,1000);
INSERT INTO sales_partition_truncate VALUES (5010,150,'P',200,'20-AUG-2019',1000,10000);
INSERT INTO sales_partition_truncate VALUES (1001,100,'T',150,'12-OCT-2019',500,2000);

SELECT * FROM sales_partition_truncate;
PRODUCT_ID CUSTOMER_ID C   PROMO_ID SALES_DAT QUANTITY_SOLD AMOUNT_SOLD
---------- ----------- - ---------- --------- ------------- -----------
      1001         100 C        150 10-SEP-18           500        2000
      1021         200 C        160 16-NOV-18           100        1500
      1001         100 C        150 10-FEB-19           500        2000
      1021         200 S        160 16-FEB-19           100        1500
      1002         110 I        180 15-JUN-19           100        1000
      5010         150 P        200 20-AUG-19          1000       10000
      1001         100 T        150 12-OCT-19           500        2000
7 rows selected.

ALTER TABLE sales_subpartition_truncate
   TRUNCATE SUBPARTITIONS q3_2018_p_catalog, q4_2018_p_catalog, q1_2019_p_catalog, 
                          q2_2019_p_catalog, q3_2019_p_catalog, q4_2019_p_catalog
        DROP STORAGE;

SELECT * FROM sales_partition_truncate;
PRODUCT_ID CUSTOMER_ID C   PROMO_ID SALES_DAT QUANTITY_SOLD AMOUNT_SOLD
---------- ----------- - ---------- --------- ------------- -----------
      1021         200 S        160 16-FEB-19           100        1500
      1002         110 I        180 15-JUN-19           100        1000
      5010         150 P        200 20-AUG-19          1000       10000
      1001         100 T        150 12-OCT-19           500        2000
4 rows selected.

SELECT TABLE_NAME, PARTITION_NAME, SUBPARTITION_NAME FROM USER_TAB_SUBPARTITIONS 
       WHERE TABLE_NAME ='SALES_PARTITION_TRUNCATE';
TABLE_NAME                  PARTITION_NAME    SUBPARTITION_NAME
–------------------------   –--------------   –------------------
SALES_PARTITION_TRUNCATE    Q1_2019           Q1_2019_P_CATALOG
SALES_PARTITION_TRUNCATE    Q1_2019           Q1_2019_P_DIRECT_SALES
...
30 rows selected.
4.4.14.4 カスケード・オプションを使用したパーティションの切捨て

TRUNCATE TABLEALTER TABLE TRUNCATE PARTITIONおよびALTER TABLE TRUNCATE SUBPARTITION SQL文のCASCADEオプションを使用して、参照パーティション化されている子表に切捨て操作をカスケードできます。

CASCADEオプションがTRUNCATE TABLEに指定されている場合、表の切捨て操作は、ON DELETE CASCADEを有効化している有効な参照制約を介してターゲット表を参照する子表も切り捨てます。このカスケード・アクションは、孫、ひ孫などに再帰的に適用されます。有効なON DELETE CASCADE参照制約に基づいて切り捨てる表セットを決定した後、このセットの表がセットの外側の子から有効な制約を介して参照されると、エラーが発生します。親および子が複数の参照制約で接続される場合、少なくとも1つの制約のON DELETE CASCADEが有効であると、親を対象とするTRUNCATE TABLE CASCADE操作に成功します。

権限は、操作に影響されるすべての表に必要です。DROP STORAGEまたはPURGE MATERIALIZED VIEW LOGなど、操作に指定される他のオプションは、操作に影響されるすべての表に適用されます。

CASCADEオプションを指定すると、TRUNCATE PARTITIONおよびTRUNCATE SUBPARTITION操作は、ターゲット表の子である参照パーティション表にカスケードされます。TRUNCATEは、参照パーティション階層の任意のレベルで指定でき、ターゲット表から開始される子表にカスケードします。権限は子表に必要ありませんが、表をパーティション化制約ではない有効な参照制約で参照できないなど、TRUNCATE操作の通常の制約が操作に影響されるすべての表に適用されます。

参照パーティションの子を持たない表に指定されている場合、CASCADEオプションは無視されます。DROP STORAGEまたはUPDATE INDEXESなど、操作に指定される他のオプションは、操作に影響されるすべての表に適用されます。

カスケード・オプションはデフォルトで無効になっているため、Oracle Database互換性に影響しません。

ALTER TABLE sales 
     TRUNCATE PARTITION dec2016
     DROP STORAGE
     CASCADE
     UPDATE INDEXES;

4.5 パーティション表の削除について

パーティション表の削除は、非パーティション表の削除と同様です。

Oracle Databaseでは、パーティション表に対するDROP TABLE文は、非パーティション表に対する文と同様に処理されます。例外はPURGEキーワードを使用する場合です。

リソースの制限が発生しないようにするには、パーティション表に対するDROP TABLE...PURGE文を使用して複数のトランザクションで表を削除します。この場合、各トランザクションが、パーティションまたはサブパーティションのサブセットを削除してコミットします。表が削除されるのは、最後のトランザクションが終了したときです。

この動作には、DROP TABLE文に対するいくつかの変更が伴います。1つ目は、DROP TABLE...PURGE文が失敗した場合には修正処理を実行でき、必要な場合は文を再発行することです。文は失敗した場所から再開されます。2つ目は、次に示すデータ・ディクショナリ・ビューでSTATUS列の値をUNUSABLEに設定すると、DROP TABLE...PURGE文の実行中に表がunusableとマークされることです。

  • USER_TABLESALL_TABLESDBA_TABLES

  • USER_PART_TABLESALL_PART_TABLESDBA_PART_TABLES

  • USER_OBJECT_TABLESALL_OBJECT_TABLESDBA_OBJECT_TABLES

これらのビューのSTATUS列を問い合せることで、UNUSABLEとマークされたパーティション表をすべてリストできます。

DBA_TAB_PARTITIONSおよびDBA_TAB_SUBPARTITIONSなど、パーティション化に関連するその他のデータ・ディクショナリ・ビューに対する問合せでは、UNUSABLEとマークされた表に属する行は除外されます。

表がUNUSABLEとマークされた後に、その表に対して発行できる唯一の文は別のDROP TABLE...PURGE文で、これは前のDROP TABLE...PURGE文が失敗した場合に限られます。UNUSABLEとマークされた表に対して発行したその他の文はエラーになります。削除操作が完了するまで、表はUNUSABLEの状態のままです。

関連項目:

4.6 パーティション表への非パーティション表の変更

非パーティション表をパーティション表に変更できます。

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

関連項目:

表のパーティションの再定義の詳細は、『Oracle Database管理者ガイド』を参照してください

4.6.1 オンライン再定義を使用したコレクション表のパーティション化

Oracle Databaseは、1つ以上のパーティションを移動したり、DMLに対するパーティションの可用性にそれほど影響することなくパーティションの物理構造への他の変更を行うメカニズムを提供します。このメカニズムはオンライン表再編成と呼ばれます。

オンライン再定義を使用すると、非パーティション・コレクション表をパーティション・コレクション表にコピーできます。Oracle Databaseによって、コレクション表の該当するパーティションに行が挿入されます。例4-41は、Objects列内のネスト表でこの処理がどのように行われるかを示します。同様の例は、XMLType表または列内のOrdered Collection Type Tablesにも対応します。新たに定義するコレクション表で索引と制約を維持する場合は、copy_table_dependentsの操作で、索引と制約をコピーするために0またはfalseを指定します。ただし、コレクション表とそのパーティションの名前は、暫定表(例4-41print_media2)のものと同じです。コレクション表の名前を維持するために明示的なステップを実行する必要があります。

例4-41 コレクション表のパーティションの再定義

REM Connect as a user with appropriate privileges, then run the following
DROP USER eqnt CASCADE;
CREATE USER eqnt IDENTIFIED BY eqnt;
GRANT CONNECT, RESOURCE TO eqnt;
 
-- Grant privleges required for online redefinition.
GRANT EXECUTE ON DBMS_REDEFINITION TO eqnt;
GRANT ALTER ANY TABLE TO eqnt;
GRANT DROP ANY TABLE TO eqnt;
GRANT LOCK ANY TABLE TO eqnt;
GRANT CREATE ANY TABLE TO eqnt;
GRANT SELECT ANY TABLE TO eqnt;
 
-- Privileges required to perform cloning of dependent objects.
GRANT CREATE ANY TRIGGER TO eqnt;
GRANT CREATE ANY INDEX TO eqnt;
 
CONNECT eqnt/eqnt
 
CREATE TYPE textdoc_typ AS OBJECT ( document_typ VARCHAR2(32));
/
CREATE TYPE textdoc_tab AS TABLE OF textdoc_typ;
/

-- (old) non partitioned nested table
CREATE TABLE print_media
    ( product_id        NUMBER(6) primary key
    , ad_textdocs_ntab  textdoc_tab
    )
NESTED TABLE ad_textdocs_ntab STORE AS equi_nestedtab
(   (document_typ NOT NULL)
    STORAGE (INITIAL 8M)
)
;
 
-- Insert into base table
INSERT INTO print_media VALUES (1,
   textdoc_tab(textdoc_typ('xx'), textdoc_typ('yy')));
INSERT INTO print_media VALUES (11,
   textdoc_tab(textdoc_typ('aa'), textdoc_typ('bb')));
COMMIT;
 
-- Insert into nested table
INSERT INTO TABLE
  (SELECT p.ad_textdocs_ntab FROM print_media p WHERE p.product_id = 11)
   VALUES ('cc');
 
SELECT * FROM print_media;

PRODUCT_ID   AD_TEXTDOCS_NTAB(DOCUMENT_TYP)
----------   ------------------------------
         1   TEXTDOC_TAB(TEXTDOC_TYP('xx'), TEXTDOC_TYP('yy'))
        11   TEXTDOC_TAB(TEXTDOC_TYP('aa'), TEXTDOC_TYP('bb'), TEXTDOC_TYP('cc'))
 
-- Creating partitioned Interim Table
CREATE TABLE print_media2
    ( product_id        NUMBER(6)
    , ad_textdocs_ntab  textdoc_tab
    )
NESTED TABLE ad_textdocs_ntab STORE AS equi_nestedtab2
(   (document_typ NOT NULL)
    STORAGE (INITIAL 8M)
)
PARTITION BY RANGE (product_id)
(
    PARTITION P1 VALUES LESS THAN (10),
    PARTITION P2 VALUES LESS THAN (20)
);
 
EXEC dbms_redefinition.start_redef_table('eqnt', 'print_media', 'print_media2');
 
DECLARE
 error_count pls_integer := 0;
BEGIN
  dbms_redefinition.copy_table_dependents('eqnt', 'print_media', 'print_media2',
                                          0, true, false, true, false,
                                          error_count);
 
  dbms_output.put_line('errors := ' || to_char(error_count));
END;
/
 
EXEC  dbms_redefinition.finish_redef_table('eqnt', 'print_media', 'print_media2');
 
-- Drop the interim table
DROP TABLE print_media2;
 
-- print_media has partitioned nested table here

SELECT * FROM print_media PARTITION (p1);

PRODUCT_ID   AD_TEXTDOCS_NTAB(DOCUMENT_TYP)
----------   ------------------------------
         1   TEXTDOC_TAB(TEXTDOC_TYP('xx'), TEXTDOC_TYP('yy'))

SELECT * FROM print_media PARTITION (p2);

PRODUCT_ID   AD_TEXTDOCS_NTAB(DOCUMENT_TYP)
----------   ------------------------------
        11   TEXTDOC_TAB(TEXTDOC_TYP('aa'), TEXTDOC_TYP('bb'), TEXTDOC_TYP('cc'))

4.6.2 パーティション表への非パーティション表の変換

非パーティション表をパーティション表に変換するには、ALTER TABLE SQL文にMODIFY句を追加します。

また、キーワードONLINEを指定すると、変換が進行中の同時DML操作が可能になります。

次に、パーティション表へのオンライン変換にONLINEキーワードを使用するALTER TABLE文の例を示します。

例4-42 パーティション表へのオンライン変換にALTER TABLEのMODIFY句を使用する方法

ALTER TABLE employees_convert MODIFY
  PARTITION BY RANGE (employee_id) INTERVAL (100)
  ( PARTITION P1 VALUES LESS THAN (100),
    PARTITION P2 VALUES LESS THAN (500)
   ) ONLINE
  UPDATE INDEXES
 ( IDX1_SALARY LOCAL,
   IDX2_EMP_ID GLOBAL PARTITION BY RANGE (employee_id)
  ( PARTITION IP1 VALUES LESS THAN (MAXVALUE))
 );

UPDATE INDEXES句を使用する際の考慮事項

UPDATE INDEXES句を使用する際は、次のことに注意してください。

  • この句を使用して、索引のパーティション化状態および変換される索引の記憶域プロパティを変更できます。

  • UPDATE INDEXES句の指定はオプションです。

    索引は、パーティション表へのオンライン変換とオフライン変換の両方でメンテナンスされます。

  • この句は、索引の元のリストが定義されている列を変更できません。

  • この句は、索引の一意性プロパティまたは他の索引プロパティを変更できません。

  • いずれかの索引の表領域を指定しない場合は、次の表領域のデフォルトが適用されます。

    • 変換後のローカル索引が表パーティションと連結します。

    • 変換後のグローバル索引が、非パーティション表の元のグローバル索引の同じ表領域に存在します。

  • INDEXES句を指定しないか、INDEXES句が元の非パーティション表のすべての索引を指定しない場合、次のデフォルトの動作がすべての未指定の索引に適用されます。

    • グローバル・パーティション索引は同じまま、元のパーティション形状が保持されます。

    • 非同一キー索引が、グローバル非パーティション索引になります。

    • 同一キー索引はローカル・パーティション索引に変換されます。

      同一キーとは、パーティション・キー列が索引定義に含まれていることを意味しますが、索引定義は、パーティション化キーのみを含めることに限定されません。

    • ビットマップ索引は、同一キーかどうかに関係なく、ローカル・パーティション索引になります。

      ビットマップ索引は、常にローカル・パーティション索引である必要があります。

  • 変換操作は、ドメイン索引がある場合は実行できません。

4.7 ハイブリッド・パーティション表の管理

この項の内容は、次のとおりです。

関連項目:

4.7.1 ハイブリッド・パーティション表の作成

CREATE TABLE文のEXTERNAL PARTITION ATTRIBUTES句を使用して、表のハイブリッド・パーティション化を決定できます。表のパーティションは、外部または内部にすることができます。

ノート:

Oracle Database 23aiでは、時間隔、自動リスト、レンジおよびリスト・パーティション化を含む単一レベル・パーティション化が、ハイブリッド・パーティション表でサポートされています。

ハイブリッド・パーティション表では、パーティションは、データベース・データファイル(内部パーティション)と外部のファイルおよびソース(外部パーティション)の両方に存在できます。ハイブリッド・パーティション表を作成して問い合せることで、内部と外部の両方のパーティションに含まれるデータについて、プルーニングなどのクラシック・パーティション表を使用したパーティション化の利点を活用できます。

ハイブリッド・パーティション表に表レベルの外部パラメータを指定する場合、CREATE TABLE文のEXTERNAL PARTITION ATTRIBUTES句は、表レベルで定義されます。次に例を示します。

  • ORACLE_LOADER, ORACLE_DATAPUMP, ORACLE_HDFS, ORACLE_HIVE, ORACLE_BIGDATAなどのアクセス・ドライバ・タイプ。

    ノート:

    ORACLE_HIVEでは時間隔および自動リスト・パーティション化はサポートされていません。
  • すべての外部パーティション・ファイルのデフォルト・ディレクトリ

  • アクセス・パラメータ

PARTITION句のEXTERNAL句は、パーティションを外部パーティションとして定義します。EXTERNAL句が存在しない場合、パーティションは内部パーティションです。外部パーティションごとに、デフォルトの場所として、表レベルで定義されているデフォルト・ディレクトリとは異なる場所を指定できます。たとえば、ハイブリッド・レンジ・パーティション表の作成では、パーティションsales_data2sales_data3およびsales_data_acfsDEFAULT DIRECTORY値は、EXTERNAL PARTITION ATTRIBUTES句で定義されたDEFAULT DIRECTORY値とは異なります。

外部パーティションに対して外部ファイルが定義されていない場合、外部パーティションは空です。ALTER TABLE MODIFY PARTITION文を使用して、外部ファイルを移入できます。少なくとも1つのパーティションが内部パーティションである必要があることに注意してください。

4.7.1.1 ハイブリッド・レンジ・パーティション表の作成

最初の例では、ハイブリッド・レンジ・パーティション表は、4つの外部パーティションと2つの内部パーティションで作成されます。外部CSVデータファイルは、DEFAULT DIRECTORY句で定義されたsales_datasales_data2sales_data3およびsales_data_acfsディレクトリに格納されます。sales_dataは、EXTERNAL PARTITION ATTRIBUTES句で、全体のDEFAULT DIRECTORYとして定義されます。他のディレクトリは、パーティション・レベルで定義されます。sales_2014およびsales_2015は、内部パーティションです。データ・ディレクトリsales_data_acfsは、該当するストレージ・オプションの使用を示すためにOracle ACFSファイル・システムに格納されます。

2番目の例では、追加の外部パーティションが表に追加されます。

例4-43 ハイブリッド・レンジ・パーティション表の作成

REM Connect as a user with appropriate privileges, 
REM then run the following to set up data directories that contain the data files
CREATE DIRECTORY sales_data AS '/u01/my_data/sales_data1';
GRANT READ,WRITE ON DIRECTORY sales_data TO hr;

CREATE DIRECTORY sales_data2 AS '/u01/my_data/sales_data2';
GRANT READ,WRITE ON DIRECTORY sales_data2 TO hr;

CREATE DIRECTORY sales_data3 AS '/u01/my_data/sales_data3';
GRANT READ,WRITE ON DIRECTORY sales_data3 TO hr;

REM set up a data directory on an Oracle ACFS mount point (file system)
CREATE DIRECTORY sales_data_acfs AS '/u01/acfsmounts/acfs1';
GRANT READ,WRITE ON DIRECTORY sales_data_acfs TO hr;

CONNECT AS hr, run the following
CREATE TABLE hybrid_partition_table
  ( prod_id       NUMBER        NOT NULL,
    cust_id       NUMBER        NOT NULL,
    time_id       DATE          NOT NULL,
    channel_id    NUMBER        NOT NULL,
    promo_id      NUMBER        NOT NULL,
    quantity_sold NUMBER(10,2)  NOT NULL,
    amount_sold   NUMBER(10,2)  NOT NULL
  )
    EXTERNAL PARTITION ATTRIBUTES (
      TYPE ORACLE_LOADER 
      DEFAULT DIRECTORY sales_data
       ACCESS PARAMETERS(
         FIELDS TERMINATED BY ','
         (prod_id,cust_id,time_id DATE 'dd-mm-yyyy',channel_id,promo_id,quantity_sold,amount_sold)
       ) 
      REJECT LIMIT UNLIMITED
     ) 
    PARTITION BY RANGE (time_id)
    (PARTITION sales_2014 VALUES LESS THAN (TO_DATE('01-01-2015','dd-mm-yyyy')),
     PARTITION sales_2015 VALUES LESS THAN (TO_DATE('01-01-2016','dd-mm-yyyy')),
     PARTITION sales_2016 VALUES LESS THAN (TO_DATE('01-01-2017','dd-mm-yyyy')) EXTERNAL 
          LOCATION ('sales2016_data.txt'),
     PARTITION sales_2017 VALUES LESS THAN (TO_DATE('01-01-2018','dd-mm-yyyy')) EXTERNAL 
          DEFAULT DIRECTORY sales_data2 LOCATION ('sales2017_data.txt'),
     PARTITION sales_2018 VALUES LESS THAN (TO_DATE('01-01-2019','dd-mm-yyyy')) EXTERNAL 
          DEFAULT DIRECTORY sales_data3 LOCATION ('sales2018_data.txt'),
     PARTITION sales_2019 VALUES LESS THAN (TO_DATE('01-01-2020','dd-mm-yyyy')) EXTERNAL
          DEFAULT DIRECTORY sales_data_acfs LOCATION ('sales2019_data.txt')
 );

例4-44 ハイブリッド・レンジ・パーティション表への外部パーティションの追加

ALTER TABLE hybrid_partition_table 
      ADD PARTITION sales_2020 VALUES LESS THAN (TO_DATE('01-01-2021','dd-mm-yyyy'))
          EXTERNAL DEFAULT DIRECTORY sales_data_acfs  LOCATION ('sales2020_data.txt');
4.7.1.2 時間隔パーティションを含むハイブリッド・レンジ・パーティション表の作成

次に作成される表には、表が時間隔パーティション化されることを示すトップ・レベルのINTERVAL句があります。CREATE TABLE文では、幅が異なる4つのパーティションを指定しています。また、1-Jan-2014の遷移点を超えると、1か月の幅でパーティションを作成することも指定しています。パーティション P3の上限は遷移点を表します。P3およびそれより下位のすべてのパーティション(この例ではP0P1およびP2)はレンジ・セクションにありますが、それをより上位のすべてのパーティションは時間隔セクションに分類されます

CREATE TABLE SALES_INTERVAL
( prod_id NUMBER NOT NULL,
    cust_id NUMBER NOT NULL,
    time_id DATE NOT NULL,
    channel_id NUMBER NOT NULL,
    promo_id NUMBER NOT NULL,
    quantity_sold NUMBER(10,2) NOT NULL,
    amount_sold NUMBER(10,2) NOT NULL
  )
   EXTERNAL PARTITION ATTRIBUTES( TYPE ORACLE_LOADER
       DEFAULT DIRECTORY Data_pump_dir
       ACCESS PARAMETERS
       (
         RECORDS DELIMITED BY NEWLINE
         BADFILE 'saleshyt_%a_%p.bad'
         LOGFILE 'saleshyt_%a_%p.log'
         FIELDS TERMINATED BY ','
         MISSING FIELD VALUES ARE NULL
        )
        REJECT LIMIT UNLIMITED
                                 )
PARTITION BY RANGE (time_id)
INTERVAL(NUMTOYMINTERVAL(1,'month'))
(PARTITION P0 values less than (TO_DATE('01-01-2012', 'dd-mm-yyyy')) EXTERNAL LOCATION('sales_interval_hypt1.csv'),
PARTITION P1 values less than (TO_DATE('01-01-2013', 'dd-mm-yyyy')) EXTERNAL LOCATION('sales_interval_hypt1.csv'),
PARTITION P2 values less than (TO_DATE('01-07-2013', 'dd-mm-yyyy')),
PARTITION P3 values less than (TO_DATE('01-01-2014', 'dd-mm-yyyy')));

time_id01-01-2014である行が挿入されると、上限を01-02-2014とするパーティションSYS_Pが自動的に作成され、その後07-01-2020が追加されると、上限を08-01-2020とするもう1つのパーティションSYS_Pが作成されます。この例での自動作成されるパーティションの上限は、ハイブリッド・パーティション表のINTERVAL句で指定されているとおり、前の上限値より1か月先です。

時間隔パーティション化を含むハイブリッド・パーティション表では、レンジ・セクションで内部パーティションと外部パーティションの両方を使用できます。この例では、P1が表のレンジ・セクションの外部パーティションで、内部パーティションP3が遷移点です。01-01-2014というtime_idを含む、対応する行が表に挿入されると、時間隔セクションに内部パーティションPi0が作成され、パーティションに行が挿入されます。遷移点を指定するには、レンジ・セクションの末尾にパーティションが必要です。時間隔ハイブリッド・パーティション表には、少なくとも1つの内部パーティションが含まれている必要があります。

4.7.1.3 自動リスト・パーティション化のあるハイブリッド・パーティション表の作成

Oracle Database 23aiでは、ハイブリッド・パーティション表での自動リスト・パーティション化がOracleによってサポートされています

次の例では、自動リスト・パーティション化のあるハイブリッド・パーティション表を作成するための構文を示します。この表には、カリフォルニア用のP_CAL内部パーティションに加えてニューヨークの値リストを含む外部パーティションP_NYがあります。挿入された行がこれらの既存のパーティションのいずれにもマップされず、新しいパーティションが必要になった場合(ニュージャージーなど)、表に新しい内部パーティションが自動的に作成されます。

CREATE TABLE SALES
(
    SALESPERSON_ID  NUMBER(5), 
    SALESPERSON_NAME VARCHAR2(30),
    SALES_STATE   VARCHAR2(20),
    SALES_AMOUNT  NUMBER(10), 
    SALES_DATE  DATE
)
EXTERNAL PARTITION ATTRIBUTES( 
      TYPE ORACLE_LOADER
       DEFAULT DIRECTORY DEF_DIR1
       ACCESS PARAMETERS
        (
           RECORDS DELIMITED BY NEWLINE
            BADFILE 'saleshyt_%a_%p.bad'
             LOGFILE 'saleshyt_%a_%p.log'
             FIELDS TERMINATED BY ','
             MISSING FIELD VALUES ARE NULL
          )
          REJECT LIMIT UNLIMITED
 )
PARTITION BY LIST(SALES_STATE) AUTOMATIC
(PARTITION P_CAL VALUES ('CALIFORNIA'),
 PARTITION P_NY   VALUES (‘NEW YORK’) EXTERNAL LOCATION(‘p_ny.csv’));

4.7.2 ハイブリッド・パーティション表への変換

内部パーティションのみを含む表は、ハイブリッド・パーティション表に変換できます。

例4-45では、内部レンジ・パーティション表がハイブリッド・パーティション表に変換されます。まず、既存の表に外部パーティション属性を追加してから、外部パーティションを追加する必要があります。少なくとも1つのパーティションが内部パーティションである必要があることに注意してください。

例4-45 ハイブリッド・レンジ・パーティション表への変換

CREATE TABLE internal_to_hypt_table (
    prod_id       NUMBER        NOT NULL,
    cust_id       NUMBER        NOT NULL,
    time_id       DATE          NOT NULL,
    channel_id    NUMBER        NOT NULL,
    promo_id      NUMBER        NOT NULL,
    quantity_sold NUMBER(10,2)  NOT NULL,
    amount_sold   NUMBER(10,2)  NOT NULL
  )
   PARTITION by range (time_id) 
   (PARTITION sales_2014 VALUES LESS THAN (TO_DATE('01-01-2015','dd-mm-yyyy'))
  );

SELECT HYBRID FROM USER_TABLES WHERE TABLE_NAME = 'INTERNAL_TO_HYPT_TABLE';
HYB
---
NO

ALTER TABLE internal_to_hypt_table 
  ADD EXTERNAL PARTITION ATTRIBUTES
   (TYPE ORACLE_LOADER 
     DEFAULT DIRECTORY sales_data
     ACCESS PARAMETERS (
       FIELDS TERMINATED BY ','
       (prod_id,cust_id,time_id DATE 'dd-mm-yyyy',channel_id,promo_id,quantity_sold,amount_sold)
     )
   )
;

ALTER TABLE internal_to_hypt_table 
      ADD PARTITION sales_2015 VALUES LESS THAN (TO_DATE('01-01-2016','dd-mm-yyyy'))
          EXTERNAL LOCATION ('sales2015_data.txt');

ALTER TABLE internal_to_hypt_table 
      ADD PARTITION sales_2016 VALUES LESS THAN (TO_DATE('01-01-2017','dd-mm-yyyy'))
          EXTERNAL LOCATION ('sales2016_data.txt');

SELECT HYBRID FROM USER_TABLES WHERE TABLE_NAME = 'INTERNAL_TO_HYPT_TABLE';
HYB
---
YES

SELECT DEFAULT_DIRECTORY_NAME FROM USER_EXTERNAL_TABLES WHERE TABLE_NAME = 'INTERNAL_TO_HYPT_TABLE';
DEFAULT_DIRECTORY_NAME
---------------------------------------------------------------------------------------------
SALES_DATA

4.7.3 内部パーティション表へのハイブリッド・パーティション表の変換

ハイブリッド・パーティション表は、内部パーティションのみを含む表に変換できます。

例4-46では、ハイブリッド・パーティション表が内部レンジ・パーティション表に変換されます。まず、すべての外部パーティションを削除する必要があり、その後、それらの外部パーティションの属性を削除できます。

例4-46 ハイブリッド・パーティション表から内部表への変換

CREATE TABLE hypt_to_int_table
  ( prod_id       NUMBER        NOT NULL,
    cust_id       NUMBER        NOT NULL,
    time_id       DATE          NOT NULL,
    channel_id    NUMBER        NOT NULL,
    promo_id      NUMBER        NOT NULL,
    quantity_sold NUMBER(10,2)  NOT NULL,
    amount_sold   NUMBER(10,2)  NOT NULL
  )
    EXTERNAL PARTITION ATTRIBUTES (
     TYPE ORACLE_LOADER 
     DEFAULT DIRECTORY sales_data
       ACCESS PARAMETERS(
        FIELDS TERMINATED BY ','
        (prod_id,cust_id,time_id DATE 'dd-mm-yyyy',channel_id,promo_id,quantity_sold,amount_sold)
       ) 
      REJECT LIMIT UNLIMITED
     ) 
    PARTITION BY RANGE (time_id)
    (PARTITION sales_2014 VALUES LESS THAN (TO_DATE('01-01-2015','dd-mm-yyyy')),
     PARTITION sales_2015 VALUES LESS THAN (TO_DATE('01-01-2016','dd-mm-yyyy')),
     PARTITION sales_2016 VALUES LESS THAN (TO_DATE('01-01-2017','dd-mm-yyyy')) 
          EXTERNAL LOCATION ('sales2016_data.txt'),
     PARTITION sales_2017 VALUES LESS THAN (TO_DATE('01-01-2018','dd-mm-yyyy')) 
          EXTERNAL DEFAULT DIRECTORY sales_data2 LOCATION ('sales2017_data.txt'),
     PARTITION sales_2018 VALUES LESS THAN (TO_DATE('01-01-2019','dd-mm-yyyy')) 
          EXTERNAL DEFAULT DIRECTORY sales_data3 LOCATION ('sales2018_data.txt'),
     PARTITION sales_2019 VALUES LESS THAN (TO_DATE('01-01-2020','dd-mm-yyyy')) 
          EXTERNAL DEFAULT DIRECTORY sales_data_acfs LOCATION ('sales2019_data.txt')
 );

SELECT HYBRID FROM USER_TABLES WHERE TABLE_NAME = 'HYPT_TO_INT_TABLE';
HYB
---
YES

ALTER TABLE hypt_to_int_table DROP PARTITION sales_2016;
ALTER TABLE hypt_to_int_table DROP PARTITION sales_2017;
ALTER TABLE hypt_to_int_table DROP PARTITION sales_2018;
ALTER TABLE hypt_to_int_table DROP PARTITION sales_2019;

ALTER TABLE hypt_to_int_table DROP EXTERNAL PARTITION ATTRIBUTES();

SELECT HYBRID FROM USER_TABLES WHERE TABLE_NAME = 'HYPT_TO_INT_TABLE';
HYB
---
NO

4.7.4 ハイブリッド・パーティション表でのADOの使用

ハイブリッド・パーティション表では、自動データ最適化(ADO)ポリシーを条件付きで使用できます。

例4-47では、ADOポリシーが表の内部パーティションにのみ定義されています。

例4-47 ハイブリッド・パーティション表でのADOの使用

SQL> CREATE TABLE hypt_ado_table
  ( prod_id       NUMBER        NOT NULL,
    cust_id       NUMBER        NOT NULL,
    time_id       DATE          NOT NULL,
    channel_id    NUMBER        NOT NULL,
    promo_id      NUMBER        NOT NULL,
    quantity_sold NUMBER(10,2)  NOT NULL,
    amount_sold   NUMBER(10,2)  NOT NULL
  )
    EXTERNAL PARTITION ATTRIBUTES (
     TYPE ORACLE_LOADER 
     DEFAULT DIRECTORY sales_data
       ACCESS PARAMETERS(
        FIELDS TERMINATED BY ','
        (prod_id,cust_id,time_id DATE 'dd-mm-yyyy',channel_id,promo_id,quantity_sold,amount_sold)
       ) 
      REJECT LIMIT UNLIMITED
     ) 
    PARTITION BY RANGE (time_id)
    (PARTITION sales_2014 VALUES LESS THAN (TO_DATE('01-01-2015','dd-mm-yyyy')),
     PARTITION sales_2015 VALUES LESS THAN (TO_DATE('01-01-2016','dd-mm-yyyy')),
     PARTITION sales_2016 VALUES LESS THAN (TO_DATE('01-01-2017','dd-mm-yyyy')) 
          EXTERNAL LOCATION ('sales2016_data.txt'),
     PARTITION sales_2017 VALUES LESS THAN (TO_DATE('01-01-2018','dd-mm-yyyy')) 
          EXTERNAL DEFAULT DIRECTORY sales_data2 LOCATION ('sales2017_data.txt'),
     PARTITION sales_2018 VALUES LESS THAN (TO_DATE('01-01-2019','dd-mm-yyyy')) 
          EXTERNAL DEFAULT DIRECTORY sales_data3 LOCATION ('sales2018_data.txt'),
     PARTITION sales_2019 VALUES LESS THAN (TO_DATE('01-01-2020','dd-mm-yyyy')) 
          EXTERNAL DEFAULT DIRECTORY sales_data4 LOCATION ('sales2019_data.txt')
 );
Table created.

SQL> SELECT HYBRID FROM USER_TABLES WHERE TABLE_NAME = 'HYPT_ADO_TABLE';
HYB
---
YES

SQL> ALTER TABLE hypt_ado_table MODIFY PARTITION sales_2014 ILM ADD POLICY ROW STORE COMPRESS ADVANCED ROW AFTER 6 MONTHS OF NO MODIFICATION;
Table altered.

SQL> ALTER TABLE hypt_ado_table MODIFY PARTITION sales_2015 ILM ADD POLICY ROW STORE COMPRESS ADVANCED ROW AFTER 6 MONTHS OF NO MODIFICATION;
Table altered.

SQL> SELECT POLICY_NAME, POLICY_TYPE, ENABLED FROM USER_ILMPOLICIES;
POLICY_NAME    POLICY_TYPE     ENA
-------------  --------------- -----
P1             DATA MOVEMENT   YES
P2             DATA MOVEMENT   YES

関連項目:

4.7.5 ハイブリッド・パーティション表のパーティションの分割

例4-48では、デフォルト(MAXVALUE)パーティションが、新しいパーティションと既存のデフォルト位置の2つに分割されます。デフォルト・パーティションは、その他のパーティションを分割する場合と同様に分割できます。

例4-48 ハイブリッド・パーティション表のデフォルト・パーティションの分割

4.7.6 ハイブリッド・パーティション表のデータの交換

ハイブリッド・パーティション表の内部パーティションのデータを外部非パーティション表と交換したり、外部非パーティション表のデータをハイブリッド・パーティション表の内部パーティションと交換できます。Oracleは内部ストレージと外部ストレージ間の交換をサポートしていますが、これらの層の間の移動操作はサポートしていません。内部ストレージと外部ストレージの間でのデータの移動は、交換前の個別の操作です。このようなデータ"移動"は、通常は、データをその将来の場所に物理的にコピーし、交換し、その後、古い場所からそのデータを削除することで実行します。

例4-49 ハイブリッド・パーティション表の内部パーティションのデータと外部非パーティション表の交換

この例では、ハイブリッド・パーティション表の内部パーティションのデータが、まったく同じデータを含むパーティション化されていない外部表とのEXCHANGE PARTITIONを使用して外部ストレージに"移動"されます。古いデータは、アーカイブのために外部ストレージに移動されます。

TYPE ORACLE_DATAPUMPのハイブリッド・パーティション表を作成します。

CREATE TABLE hybrid_datapump_sales
  ( prod_id  NUMBER     NOT NULL,
    cust_id       NUMBER        NOT NULL,
    time_id       DATE          NOT NULL,
    channel_id    NUMBER        NOT NULL,
    promo_id      NUMBER        NOT NULL,
    quantity_sold NUMBER(10,2)  NOT NULL,
    amount_sold   NUMBER(10,2)  NOT NULL
  )
  EXTERNAL PARTITION ATTRIBUTES
  (TYPE ORACLE_DATAPUMP
   DEFAULT DIRECTORY sales_data
   ACCESS PARAMETERS (NOLOGFILE)
  )
  PARTITION by range (time_id)
  (
   PARTITION sales_2018 VALUES LESS THAN (TO_DATE('01-01-2019','dd-mm-yyyy')),
   PARTITION sales_2019 VALUES LESS THAN (TO_DATE('01-01-2020','dd-mm-yyyy')),
   PARTITION sales_2020 VALUES LESS THAN (TO_DATE('01-01-2021','dd-mm-yyyy')),
   PARTITION sales_future VALUES LESS THAN (MAXVALUE)
);

この例のデータをハイブリッド・パーティション表hybrid_datapump_salesに移入します。

SELECT * FROM hybrid_datapump_sales PARTITION(sales_2018);

   PROD_ID    CUST_ID TIME_ID   CHANNEL_ID   PROMO_ID QUANTITY_SOLD AMOUNT_SOLD
---------- ---------- --------- ---------- ---------- ------------- -----------
      1001        100 10-FEB-18         10         15           500        7500
      1002        110 15-JUN-18         12         18           100        3200
      1002        110 30-MAR-18         10         15           500        6500
      2105        102 21-APR-18         18         12           100        2000
      1200        155 30-APR-18         20         20           300        3600

sales_2018パーティションと同じ構造で外部表を作成します。SELECT句で、データの移動を完了します。交換の前にデータ移動操作を行う必要があります。

CREATE TABLE year_2018_datapump
   ORGANIZATION EXTERNAL
   ( TYPE ORACLE_DATAPUMP DEFAULT DIRECTORY sales_data
     ACCESS PARAMETERS (NOLOGFILE) LOCATION ('sales_2018.dmp')
    )
   AS SELECT * FROM hybrid_datapump_sales PARTITION(sales_2018);

sales_2018パーティションのデータを外部表のデータと交換します。

ALTER TABLE hybrid_datapump_sales
      EXCHANGE PARTITION(sales_2018) WITH TABLE year_2018_datapump;

SELECT * FROM year_2018_datapump;

   PROD_ID    CUST_ID TIME_ID   CHANNEL_ID   PROMO_ID QUANTITY_SOLD AMOUNT_SOLD
---------- ---------- --------- ---------- ---------- ------------- -----------
      1001        100 10-FEB-18         10         15           500        7500
      1002        110 15-JUN-18         12         18           100        3200
      1002        110 30-MAR-18         10         15           500        6500
      2105        102 21-APR-18         18         12           100        2000
      1200        155 30-APR-18         20         20           300        3600

例4-50 外部非パーティション表のデータとハイブリッド・パーティション表の内部パーティションの交換

この例では、ハイブリッド・パーティション表のパーティションに新しいデータを追加するために、外部表のデータがハイブリッド・パーティション表の内部パーティションと交換されます。外部表にロードされたテキスト・データは、最初に一時的な非パーティション内部表にコピーされます。次に、非パーティション内部表がハイブリッド・パーティション表の内部パーティションと交換されます。

TYPE ORACLE_DATAPUMPのハイブリッド・パーティション表を作成します。

CREATE TABLE hybrid_datapump_sales
    ( prod_id  NUMBER     NOT NULL,
      cust_id       NUMBER        NOT NULL,
      time_id       DATE          NOT NULL,
      channel_id    NUMBER        NOT NULL,
      promo_id      NUMBER        NOT NULL,
      quantity_sold NUMBER(10,2)  NOT NULL,
      amount_sold   NUMBER(10,2)  NOT NULL
     )
     EXTERNAL PARTITION ATTRIBUTES
      (TYPE ORACLE_DATAPUMP
       DEFAULT DIRECTORY sales_data
       ACCESS PARAMETERS (NOLOGFILE)
      )
     PARTITION by range (time_id)
     (
      PARTITION sales_old VALUES LESS THAN (TO_DATE('01-01-2018', 'dd-mm-yyyy'))
       EXTERNAL LOCATION ('sales_old.dmp'),
      PARTITION sales_2018 VALUES LESS THAN (TO_DATE('01-01-2019','dd-mm-yyyy')),
      PARTITION sales_2019 VALUES LESS THAN (TO_DATE('01-01-2020','dd-mm-yyyy')),
      PARTITION sales_2020 VALUES LESS THAN (TO_DATE('01-01-2021','dd-mm-yyyy')),
      PARTITION sales_future VALUES LESS THAN (MAXVALUE)
  );

sales_2020パーティションにレコードがないことに注意してください。

SELECT * FROM hybrid_datapump_sales PARTITION(sales_2020);

no rows selected

この例では、外部表を作成し、アプリケーションによって生成されたテキスト・ファイルをロードします。

CREATE TABLE ext_sales_year_2020 
        ( prod_id       NUMBER        NOT NULL,
          cust_id       NUMBER        NOT NULL,
          time_id       DATE          NOT NULL,
          channel_id    NUMBER        NOT NULL,
          promo_id      NUMBER        NOT NULL,
          quantity_sold NUMBER(10,2)  NOT NULL,
          amount_sold   NUMBER(10,2)  NOT NULL
         )
        ORGANIZATION EXTERNAL
        (
         TYPE ORACLE_LOADER DEFAULT DIRECTORY sales_data
         ACCESS PARAMETERS (
         FIELDS TERMINATED BY ','
         (prod_id,cust_id,time_id DATE 'dd-mm-yyyy',channel_id,promo_id,quantity_sold,amount_sold)
         )
         LOCATION ('sales2020_data.txt')
 );

SELECT * FROM ext_sales_year_2020;

   PROD_ID    CUST_ID TIME_ID   CHANNEL_ID   PROMO_ID QUANTITY_SOLD AMOUNT_SOLD
---------- ---------- --------- ---------- ---------- ------------- -----------
      1001        100 10-JAN-20         10         15           500        7500
      1002        110 15-JAN-20         12         18           100        3200
      1001        100 20-JAN-20         10         15           500        7500
      2105        101 15-FEB-20         12         19            10         300
      2105        102 21-MAR-20         18         12           100        2000
      1200        155 30-MAR-20         20         20           300        3600
      1400        165 05-JUN-20         22         15           100        4000
      2105        125 05-JUN-20         12         16            40        8500
      2105        302 15-SEP-20         10         11            75        4350
      2108        305 18-NOV-20         10         11            70        4250

10 rows selected.

ハイブリッド・パーティション表とデータを交換するための一時内部表を作成します。

なお、この次のステップは、次に示すとおり必ずしも1対1のコピーではありません。

CREATE TABLE sales_year_2020 AS SELECT * FROM ext_sales_year_2020;

SELECT * FROM sales_year_2020;

   PROD_ID    CUST_ID TIME_ID   CHANNEL_ID   PROMO_ID QUANTITY_SOLD AMOUNT_SOLD
---------- ---------- --------- ---------- ---------- ------------- -----------
      1001        100 10-JAN-20         10         15           500        7500
      1002        110 15-JAN-20         12         18           100        3200
      1001        100 20-JAN-20         10         15           500        7500
      2105        101 15-FEB-20         12         19            10         300
      2105        102 21-MAR-20         18         12           100        2000
      1200        155 30-MAR-20         20         20           300        3600
      1400        165 05-JUN-20         22         15           100        4000
      2105        125 05-JUN-20         12         16            40        8500
      2105        302 15-SEP-20         10         11            75        4350
      2108        305 18-NOV-20         10         11            70        4250

10 rows selected.

ハイブリッド・パーティション表にデータをロードするために、一時内部表のデータをsales_2020パーティションと交換します。

ALTER TABLE hybrid_datapump_sales
       EXCHANGE PARTITION(sales_2020) WITH TABLE sales_year_2020; 

SELECT * FROM hybrid_datapump_sales PARTITION(sales_2020);

   PROD_ID    CUST_ID TIME_ID   CHANNEL_ID   PROMO_ID QUANTITY_SOLD AMOUNT_SOLD
---------- ---------- --------- ---------- ---------- ------------- -----------
      1001        100 10-JAN-20         10         15           500        7500
      1002        110 15-JAN-20         12         18           100        3200
      1001        100 20-JAN-20         10         15           500        7500
      2105        101 15-FEB-20         12         19            10         300
      2105        102 21-MAR-20         18         12           100        2000
      1200        155 30-MAR-20         20         20           300        3600
      1400        165 05-JUN-20         22         15           100        4000
      2105        125 05-JUN-20         12         16            40        8500
      2105        302 15-SEP-20         10         11            75        4350
      2108        305 18-NOV-20         10         11            70        4250

10 rows selected.

4.8 パーティション表および索引の情報の表示

Oracle Databaseのビューでパーティション表および索引に関する情報を表示できます。

表4-4に、パーティション表および索引に固有の情報を含むビューを示します。

表4-4 パーティション表および索引に固有の情報を含むビュー

ビュー 説明

DBA_PART_TABLES

ALL_PART_TABLES

USER_PART_TABLES

DBAビューは、データベース内のすべてのパーティション表に関するパーティション化情報を表示します。ALLビューは、ユーザーがアクセス可能なすべてのパーティション表に関するパーティション化情報を表示します。USERビューは、ユーザーが所有するパーティション表に関するパーティション化情報に制限されています。

DBA_TAB_PARTITIONS

ALL_TAB_PARTITIONS

USER_TAB_PARTITIONS

パーティション・レベルのパーティション化情報、パーティションの記憶域パラメータ、およびDBMS_STATSパッケージまたはANALYZE文により生成されたパーティション統計が表示されます。

DBA_TAB_SUBPARTITIONS

ALL_TAB_SUBPARTITIONS

USER_TAB_SUBPARTITIONS

サブパーティション・レベルのパーティション化情報、サブパーティションの記憶域パラメータ、およびDBMS_STATSパッケージまたはANALYZE文により生成されたサブパーティション統計が表示されます。

DBA_PART_KEY_COLUMNS

ALL_PART_KEY_COLUMNS

USER_PART_KEY_COLUMNS

パーティション表のパーティション化キー列が表示されます。

DBA_SUBPART_KEY_COLUMNS

ALL_SUBPART_KEY_COLUMNS

USER_SUBPART_KEY_COLUMNS

コンポジット・パーティション表(およびコンポジット・パーティション表のローカル索引)のサブパーティション化キー列が表示されます。

DBA_PART_COL_STATISTICS

ALL_PART_COL_STATISTICS

USER_PART_COL_STATISTICS

表のパーティションに関する列統計およびヒストグラム情報が表示されます。

DBA_SUBPART_COL_STATISTICS

ALL_SUBPART_COL_STATISTICS

USER_SUBPART_COL_STATISTICS

表のサブパーティションに関する列統計およびヒストグラム情報が表示されます。

DBA_PART_HISTOGRAMS

ALL_PART_HISTOGRAMS

USER_PART_HISTOGRAMS

表パーティションのヒストグラムに関するヒストグラム・データ(各ヒストグラムのエンドポイント)が表示されます。

DBA_SUBPART_HISTOGRAMS

ALL_SUBPART_HISTOGRAMS

USER_SUBPART_HISTOGRAMS

表サブパーティションのヒストグラムに関するヒストグラム・データ(各ヒストグラムのエンドポイント)が表示されます。

DBA_PART_INDEXES

ALL_PART_INDEXES

USER_PART_INDEXES

パーティション索引のパーティション化情報が表示されます。

DBA_IND_PARTITIONS

ALL_IND_PARTITIONS

USER_IND_PARTITIONS

索引パーティションのパーティション・レベルのパーティション化情報、パーティションの記憶域パラメータ、DBMS_STATSパッケージまたはANALYZE文により収集された統計が表示されます。

DBA_IND_SUBPARTITIONS

ALL_IND_SUBPARTITIONS

USER_IND_SUBPARTITIONS

索引サブパーティションのパーティション・レベルのパーティション化情報、パーティションの記憶域パラメータ、DBMS_STATSパッケージまたはANALYZE文により収集された統計が表示されます。

DBA_SUBPARTITION_TEMPLATES

ALL_SUBPARTITION_TEMPLATES

USER_SUBPARTITION_TEMPLATES

既存のサブパーティション・テンプレートの情報が表示されます。

関連項目: