Oracle Database19c 新機能 ハイブリッド・パーティション表

# ハイブリッド・パーティション表
ハイブリッド・パーティション表機能により
１つの表に通常のパーティションと外部ファイル（外部表をパーティション化）の両方に配置することが可能になりました。
この機能により、非アクティブ・パーティションを、Oracle Data Pumpファイルなど、より安価なストレージ・ソリューションの外部ファイルにも簡単に移動できます。
外部表と同時アクセスするときにUNION ALLを使用する必要がないため利便性も向上します。

### アクセス・ドライバ・タイプ
外部パーティションのアクセス・ドライバ・タイプには以下の４種類から選択できます。
- ORACLE_DATAPUMP
- ORACLE_LOADER
- ORACLE_HDFS
- ORACLE_HIVE

### ORACLE_LOADER/ORACLE_DATAPUMPの場合に必要な権限
- データファイルを含むディレクトリに対するREAD権限
- ロギング・ファイルや不良ファイルを含むディレクトリに対するWRITE権限
- プリプロセッサ・プログラムを含むディレクトリに対するEXECUTE権限

# ORACLE_LOADERを使用した外部パーティションを含むハイブリッド・パーティション表の作成例
データ・ファイルには、ORDER_DATE、ORDER_NUMBERおよびAMOUNTの3つのフィールドがあります。

```csv:order2018.csv
20180101,10,200,
20180102,11,100,
20180303,13,150,
```

#### DDL文
```sql
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文

```shell:run_gunzip.sh
#!/bin/bash
/usr/bin/gunzip -c $*
```

run_gunzip.shに実行権限を付与してディレクトリオブジェクトのディレクトリに配置します。
（今回の例では DATA_PUMP_DIR）

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

#### 内部パーティションへデータ挿入
```sql
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
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を使用した検証(ハイブリッド・パーティション表のみ)
- 外部パーティション
    - フル・パーティション・ワイズ・リフレッシュ
    - パーティション・レベルでの外部データ・ソースの場所の変更

外部表が パーティションとしてアクセスできることで、利便性を維持しながら、効率的な運用ができそうです。