ハイブリッド・パーティション表
ハイブリッド・パーティション表機能により
1つの表に通常のパーティションと外部ファイル(外部表をパーティション化)の両方に配置することが可能になりました。
この機能により、非アクティブ・パーティションを、Oracle Data Pumpファイルなど、より安価なストレージ・ソリューションの外部ファイルにも簡単に移動できます。
外部表と同時アクセスするときにUNION ALLを使用する必要がないため利便性も向上します。
アクセス・ドライバ・タイプ
外部パーティションのアクセス・ドライバ・タイプには以下の4種類から選択できます。
- ORACLE_DATAPUMP
- ORACLE_LOADER
- ORACLE_HDFS
- ORACLE_HIVE
ORACLE_LOADER/ORACLE_DATAPUMPの場合に必要な権限
- データファイルを含むディレクトリに対するREAD権限
- ロギング・ファイルや不良ファイルを含むディレクトリに対するWRITE権限
- プリプロセッサ・プログラムを含むディレクトリに対するEXECUTE権限
ORACLE_LOADERを使用した外部パーティションを含むハイブリッド・パーティション表の作成例
データ・ファイルには、ORDER_DATE、ORDER_NUMBERおよびAMOUNTの3つのフィールドがあります。
order2018.csv
20180101,10,200,
20180102,11,100,
20180303,13,150,
DDL文
CREATE TABLE ORDERS(
ORDER_DATE date
,ORDER_NUMBER number(6)
,AMOUNT number(5)
)
EXTERNAL PARTITION ATTRIBUTES (
TYPE ORACLE_LOADER
DEFAULT DIRECTORY DATA_PUMP_DIR
ACCESS PARAMETERS(
FIELDS TERMINATED BY ','
(ORDER_DATE DATE 'YYYYMMDD',ORDER_NUMBER,AMOUNT)
)
REJECT LIMIT UNLIMITED )
partition by range(ORDER_DATE)
(
partition P2018
values less than (TO_DATE('20190101', 'YYYYMMDD')) EXTERNAL LOCATION ('order2018.csv'),
partition P2019
values less than (TO_DATE('20200101', 'YYYYMMDD')) ,
partition P2020
values less than (TO_DATE('20210101', 'YYYYMMDD'))
);
圧縮ファイルの利用のDDL文
run_gunzip.sh
#!/bin/bash
/usr/bin/gunzip -c $*
run_gunzip.shに実行権限を付与してディレクトリオブジェクトのディレクトリに配置します。
(今回の例では DATA_PUMP_DIR)
CREATE TABLE ORDERS(
ORDER_DATE date
,ORDER_NUMBER number(6)
,AMOUNT number(5)
)
EXTERNAL PARTITION ATTRIBUTES (
TYPE ORACLE_LOADER
DEFAULT DIRECTORY DATA_PUMP_DIR
ACCESS PARAMETERS(
RECORDS
PREPROCESSOR DATA_PUMP_DIR:'run_gunzip.sh'
FIELDS TERMINATED BY ','
(ORDER_DATE DATE 'YYYYMMDD',ORDER_NUMBER,AMOUNT)
)
REJECT LIMIT UNLIMITED )
partition by range(ORDER_DATE)
(
partition P2018
values less than (TO_DATE('20190101', 'YYYYMMDD')) EXTERNAL LOCATION ('order2018.csv.gz'),
partition P2019
values less than (TO_DATE('20200101', 'YYYYMMDD')) ,
partition P2020
values less than (TO_DATE('20210101', 'YYYYMMDD'))
);
内部パーティションへデータ挿入
insert into orders values (to_date('20190101','YYYYMMDD'),10,200);
insert into orders values (to_date('20190102','YYYYMMDD'),11,100);
insert into orders values (to_date('20190303','YYYYMMDD'),13,150);
commit;
検索実行
SQL> select * from orders;
ORDER_DATE ORDER_NUMBER AMOUNT
---------- ------------ ----------
2018-01-01 10 200
2018-01-02 11 100
2018-03-03 13 150
2019-01-01 10 200
2019-01-02 11 100
2019-03-03 13 150
6 rows selected.
SQL> select * from orders where order_date < to_date('20190101','YYYYMMDD');
ORDER_DATE ORDER_NUMBER AMOUNT
---------- ------------ ----------
2018-01-01 10 200
2018-01-02 11 100
2018-03-03 13 150
SQL> select * from orders partition (p2018);
ORDER_DATE ORDER_NUMBER AMOUNT
---------- ------------ ----------
2018-01-01 10 200
2018-01-02 11 100
2018-03-03 13 150
SQL> select * from orders partition (p2019);
ORDER_DATE ORDER_NUMBER AMOUNT
---------- ------------ ----------
2019-01-01 10 200
2019-01-02 11 100
2019-03-03 13 150
パーティションベースの最適化として内部データ・ソースと外部データ・ソース間で以下が可能です。
- 静的パーティション・プルーニング
- 動的パーティション・プルーニング
- ブルーム・プルーニング
ハイブリッド・パーティション表でサポートされる操作
- 単一レベルのRANGEおよびLISTパーティション化メソッドの作成
- HIVEについては、単一レベルのリスト・パーティション化のみがサポート
- 外部パーティションを含むマテリアライズド・ビューの作成(QUERY_REWRITE_INTEGRITY失効許可モードのみ)
- 内部パーティション
- 一意でないグローバル部分索引の作成
- マテリアライズド・ビューの作成
- ハイブリッド・パーティション表に対するDMLトリガー操作
- ANALYZE TABLE ... VALIDATE STRUCTUREを使用した検証(ハイブリッド・パーティション表のみ)
- 外部パーティション
- フル・パーティション・ワイズ・リフレッシュ
- パーティション・レベルでの外部データ・ソースの場所の変更
外部表が パーティションとしてアクセスできることで、利便性を維持しながら、効率的な運用ができそうです。