4.7 ハイブリッド・パーティション表の管理

この項の内容は、次のとおりです。

関連項目:

4.7.1 ハイブリッド・パーティション表の作成

CREATE TABLE文のEXTERNAL PARTITION ATTRIBUTES句を使用して、表のハイブリッド・パーティション化を決定できます。表のパーティションは、外部または内部にすることができます。

ノート:

Oracle Database 23cでは、時間隔、自動リスト、レンジおよびリスト・パーティション化を含む単一レベル・パーティション化が、ハイブリッド・パーティション表でサポートされています。

ハイブリッド・パーティション表では、パーティションは、データベース・データファイル(内部パーティション)と外部のファイルおよびソース(外部パーティション)の両方に存在できます。ハイブリッド・パーティション表を作成して問い合せることで、内部と外部の両方のパーティションに含まれるデータについて、プルーニングなどのクラシック・パーティション表を使用したパーティション化の利点を活用できます。

ハイブリッド・パーティション表に表レベルの外部パラメータを指定する場合、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 23cでは、ハイブリッド・パーティション表での自動リスト・パーティション化が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.