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_data2
、sales_data3
およびsales_data_acfs
のDEFAULT DIRECTORY
値は、EXTERNAL PARTITION ATTRIBUTES
句で定義されたDEFAULT DIRECTORY
値とは異なります。
外部パーティションに対して外部ファイルが定義されていない場合、外部パーティションは空です。ALTER TABLE MODIFY PARTITION
文を使用して、外部ファイルを移入できます。少なくとも1つのパーティションが内部パーティションである必要があることに注意してください。
関連項目:
4.7.1.1 ハイブリッド・レンジ・パーティション表の作成
最初の例では、ハイブリッド・レンジ・パーティション表は、4つの外部パーティションと2つの内部パーティションで作成されます。外部CSVデータファイルは、DEFAULT DIRECTORY
句で定義されたsales_data
、sales_data2
、sales_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
およびそれより下位のすべてのパーティション(この例ではP0
、P1
および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_id
が01-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
関連項目:
-
ADOポリシーの詳細は、「自動データ最適化の使用」を参照
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.