11gパーティション新機能

1. 時間隔パーティション化(Interval Partitioning)

1.1 概念
  • レンジ・パーティション化の拡張
  • 挿入されたデータが既存のすべてのレンジ・パーティションに超えた場合に、指定された間隔で自動的に新パーティションがされる。
  • 少なくとも、レンジ・パーティションを一つ指定する必要がある。
  • 各時間隔パーティションの下限は、前のレンジまたは時間隔パーティションの上限(最上限値は含まない)である。
1.2 制限事項
  • 指定できるパーティション化キー列は1列のみで、NUMBERまたはDATE型である必要がある。
  • 時間隔パーティション化は、索引構成表ではサポートされていない。
  • 時間隔パーティション表には、ドメイン索引は作成できない。
  • サブパーティションではサポートされていない。コンポジット・パーティションのメインパーティションに可能。
1.3 時間隔パーティション表の作成
PROD(JASON)> CREATE TABLE CALL_HISTORY (
        CALL_ID         NUMBER,
        CALL_DATE       DATE,
        CUST_ID         VARCHAR2(10),
        REMARK          VARCHAR2(1000))
PARTITION BY RANGE (CALL_DATE)
INTERVAL(NUMTOYMINTERVAL(1,'MONTH'))
        ( PARTITION p0 VALUES LESS THAN (TO_DATE('20100201','YYYYMMDD')) TABLESPACE USERS);
 
PROD(JASON)>

パーティションの確認
PROD(JASON)> SELECT PARTITION_NAME, HIGH_VALUE FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'CALL_HISTORY' ORDER BY PARTITION_POSITION;

PARTITION_NAME                 HIGH_VALUE
------------------------------ --------------------------------------------------------------------------------
P0                             TO_DATE(' 2010-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA

PROD(JASON)>

2月のデータを挿入してみる
PROD(JASON)> select sysdate from dual;
 
SYSDATE
---------
08-FEB-10
 
PROD(JASON)> insert into call_history values(1,sysdate,'0000000001','test');
 
1 row created.
 
PROD(JASON)> commit;
 
Commit complete.
 
PROD(JASON)> SELECT PARTITION_NAME, HIGH_VALUE FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'CALL_HISTORY' ORDER BY PARTITION_POSITION;
 
PARTITION_NAME                 HIGH_VALUE
------------------------------ --------------------------------------------------------------------------------
P0                             TO_DATE(' 2010-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
SYS_P21                        TO_DATE(' 2010-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA    
--↑ 2月度パーティションが作成された。
 
PROD(JASON)>

STORE INオプションの使用 この表領域には、ラウンドロビン・アルゴリズムを使用して、データベースが時間隔パーティション・データを格納する。
PROD(JASON)> CREATE TABLE CALL_HISTORY (
        CALL_ID         NUMBER,
        CALL_DATE       DATE,
        CUST_ID         VARCHAR2(10),
        REMARK          VARCHAR2(1000))
PARTITION BY RANGE (CALL_DATE)
INTERVAL(NUMTOYMINTERVAL(1,'MONTH')) STORE IN (TBS_DAT01,TBS_DAT02,TBS_DAT03,TBS_DAT04,TBS_DAT05)
        ( PARTITION p0 VALUES LESS THAN (TO_DATE('20100201','YYYYMMDD')) TABLESPACE TBS_DAT01);

表が作成されました。

PROD(JASON)> SELECT PARTITION_NAME, HIGH_VALUE, TABLESPACE_NAME FROM USER_TAB_PARTITIONS 
        WHERE TABLE_NAME = 'CALL_HISTORY' ORDER BY PARTITION_POSITION;

PARTITION_NAME       HIGH_VALUE                                                                       TABLESPACE_NAME
-------------------- -------------------------------------------------------------------------------- ------------------------------
P0                   TO_DATE(' 2010-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA TBS_DAT01

PROD(JASON)> insert into call_history values (1,sysdate,'001','2月の最初コール');

1行が作成されました。

PROD(JASON)> insert into call_history values (2,sysdate+30,'001','3月の最初コール');

1行が作成されました。

PROD(JASON)> commit;

コミットが完了しました。

PROD(JASON)> SELECT PARTITION_NAME, HIGH_VALUE, TABLESPACE_NAME FROM USER_TAB_PARTITIONS 
        WHERE TABLE_NAME = 'CALL_HISTORY' ORDER BY PARTITION_POSITION;

PARTITION_NAME       HIGH_VALUE                                                                       TABLESPACE_NAME
-------------------- -------------------------------------------------------------------------------- ------------------------------
P0                   TO_DATE(' 2010-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA TBS_DAT01
SYS_P26              TO_DATE(' 2010-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA TBS_DAT02
SYS_P27              TO_DATE(' 2010-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA TBS_DAT03

PROD(JASON)>
1.4 時間隔パーティション表のメンテナンス

時間隔の変更

PROD(JASON)> ALTER TABLE CALL_HISTORY SET INTERVAL(NUMTOYMINTERVAL(2,'MONTH'));
 
表が変更されました。
 
PROD(JASON)> col interval format a50
PROD(JASON)> col table_name format a40
PROD(JASON)> select table_name, interval from user_part_tables where table_name='CALL_HISTORY';
 
TABLE_NAME                               INTERVAL
---------------------------------------- --------------------------------------------------
CALL_HISTORY                             NUMTOYMINTERVAL(2,'MONTH')
 
PROD(JASON)>

パーティション名の変更
PROD(JASON)> ALTER TABLE CALL_HISTORY RENAME PARTITION SYS_P21 TO P1;
 
表が変更されました。
 
PROD(JASON)> SELECT PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'CALL_HISTORY' ORDER BY PARTITION_POSITION;
 
PARTITION_NAME
------------------------------------------------------------------------------------------
P0
P1
SYS_P22
 
PROD(JASON)>

2. コンポジット・パーティションの拡張

11gから下記のコンポジット・パーティション方法が追加された。

  • レンジ - レンジ
  • リスト - レンジ
  • リスト - ハッシュ
  • リスト - リスト

3. 参照パーティション化

3.1 参照パーティション化の概念
  • 参照パーティション化では、参照制約により相互に関連する2つの表のパーティション化が可能。
  • この拡張の利点は、キー列を複製せずに親表からパーティション化キーを継承することで、親子関係にある複数の表を論理的に同一レベル・パーティション化できることである。
  • 論理的な依存性もパーティションのメンテナンス操作に自動的にカスケードされるため、アプリケーション開発が容易になり、ミスも少なくなる。
3.2 参照パーティション表の作成

親パーティション表の作成

PROD(JASON)> CREATE TABLE CUSTOMER_ORDERS (
        CUSTOMER_ID NUMBER,
        ORDER_ID NUMBER NOT NULL,
        ORDER_DATE DATE NOT NULL,
        ORDER_MODE VARCHAR2(8),
        ORDER_STATUS VARCHAR2(1))
PARTITION BY RANGE (ORDER_DATE) (
        PARTITION P_BEFORE_JAN_2007 VALUES LESS THAN (TO_DATE('20070101','YYYYMMDD')),
        PARTITION P_2007_JAN VALUES LESS THAN (TO_DATE('20070201','YYYYMMDD')))
PARALLEL;
 
表が作成されました。
 
PROD(JASON)> ALTER TABLE CUSTOMER_ORDERS ADD CONSTRAINT CUSTOMER_ORDERS_PK PRIMARY KEY (ORDER_ID);
 
表が変更されました。
 
PROD(JASON)>

参照パーティション表の作成
PROD(JASON)> CREATE TABLE CUSTOMER_ORDER_ITEMS (
        ORDER_ID NUMBER NOT NULL,
        PRODUCT_ID NUMBER NOT NULL,
        QUANTITY NUMBER NOT NULL,
        SALES_AMOUNT NUMBER NOT NULL,
        CONSTRAINT CUSTOMER_ORDER_ITEMS_ORDERS_FK FOREIGN KEY (ORDER_ID) REFERENCES CUSTOMER_ORDERS(ORDER_ID) )
PARTITION BY REFERENCE (CUSTOMER_ORDER_ITEMS_ORDERS_FK) PARALLEL;
 
表が作成されました。
 
PROD(JASON)> SELECT TABLE_NAME, PARTITIONING_TYPE, REF_PTN_CONSTRAINT_NAME FROM USER_PART_TABLES 
        WHERE TABLE_NAME IN ('CUSTOMER_ORDERS','CUSTOMER_ORDER_ITEMS');
 
TABLE_NAME                               PARTITIONING_TYPE           REF_PTN_CONSTRAINT_NAME
---------------------------------------- --------------------------- ----------------------------------------
CUSTOMER_ORDERS                          RANGE
CUSTOMER_ORDER_ITEMS                     REFERENCE                   CUSTOMER_ORDER_ITEMS_ORDERS_FK
 
PROD(JASON)>

4. システムパーティション化

4.1 概念
  • システム・パーティション化では、データベースによりデータの配置を制御せずに、アプリケーション制御のパーティション化を実行できる。
  • 個々のパーティションの用途を指定せずに表をパーティションに分割する機能が、データベースにより提供される。
  • パーティション化のすべてをアプリケーションによって制御する必要がある。
4.2 システムパーティション表の作成
PROD(JASON)> CREATE TABLE CALL_HISTORY_SYS (
        CALL_ID         NUMBER,
        CALL_DATE       DATE,
        CUST_ID         VARCHAR2(10),
        REMARK          VARCHAR2(1000))
PARTITION BY SYSTEM (
        PARTITION S1 TABLESPACE TBS_DAT01,
        PARTITION S2 TABLESPACE TBS_DAT02,
        PARTITION S3 TABLESPACE TBS_DAT03,
        PARTITION S4 TABLESPACE TBS_DAT04,
        PARTITION S5 TABLESPACE TBS_DAT05);
 
表が作成されました。
 
PROD(JASON)> SELECT TABLE_NAME, PARTITIONING_TYPE FROM USER_PART_TABLES WHERE TABLE_NAME = 'CALL_HISTORY_SYS';
 
TABLE_NAME                               PARTITIONING_TYPE
---------------------------------------- ---------------------------
CALL_HISTORY_SYS                         SYSTEM
 
PROD(JASON)>

システムパーティションにデータを操作する時に、アプリによってパーティションを指定する
PROD(JASON)> INSERT INTO CALL_HISTORY_SYS PARTITION(S1) VALUES (1,SYSDATE,'001','2月の最初コール');

1行が作成されました。

PROD(JASON)> commit;

コミットが完了しました。

PROD(JASON)>
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License