4.7 ハイブリッド・パーティション表の管理
4.7.1 ハイブリッド・パーティション表の作成
CREATE TABLE文のEXTERNAL PARTITION ATTRIBUTES句を使用して、表のハイブリッド・パーティション化を決定できます。表のパーティションは、外部または内部にすることができます。
ハイブリッド・パーティション表では、パーティションは、データベース・データファイル(内部パーティション)と外部のファイルおよびソース(外部パーティション)の両方に存在できます。ハイブリッド・パーティション表を作成して問い合せることで、内部と外部の両方のパーティションに含まれるデータについて、プルーニングなどのクラシック・パーティション表を使用したパーティション化の利点を活用できます。
ハイブリッド・パーティション表に表レベルの外部パラメータを指定する場合、CREATE TABLE文のEXTERNAL PARTITION ATTRIBUTES句は、表レベルで定義されます。次に例を示します。
-
ORACLE_LOADER、ORACLE_DATAPUMP、ORACLE_HDFS、ORACLE_HIVEなどのアクセス・ドライバ・タイプ -
すべての外部パーティション・ファイルのデフォルト・ディレクトリ
-
アクセス・パラメータ
PARTITION句のEXTERNAL句は、パーティションを外部パーティションとして定義します。EXTERNAL句が存在しない場合、パーティションは内部パーティションです。各外部パーティションに対して、ディレクトリなど、表レベルで定義されたデフォルト属性とは異なる属性を指定できます。たとえば、例4-43では、パーティションsales_data2、sales_data3およびsales_data_acfsのDEFAULT DIRECTORY値は、EXTERNAL PARTITION ATTRIBUTES句で定義されたDEFAULT DIRECTORY値とは異なります。
外部パーティションに対して外部ファイルが定義されていない場合、外部パーティションは空です。ALTER TABLE MODIFY PARTITION文を使用して、外部ファイルを移入できます。少なくとも1つのパーティションが内部パーティションである必要があることに注意してください。
例4-43では、ハイブリッド・レンジ・パーティション表は、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ファイル・システムに格納されます。
例4-44では、追加の外部パーティションがハイブリッド・レンジ・パーティション表に追加されます。
例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.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 ハイブリッド・パーティション表のデフォルト・パーティションの分割
CREATE TABLE hybrid_split_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_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 LOCATION ('sales2017_data.txt'),
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_future VALUES LESS THAN (MAXVALUE)
);
SELECT HYBRID FROM USER_TABLES WHERE TABLE_NAME = 'HYBRID_SPLIT_TABLE';
HYB
---
YES
SELECT DEFAULT_DIRECTORY_NAME FROM USER_EXTERNAL_TABLES WHERE TABLE_NAME = 'HYBRID_SPLIT_TABLE';
DEFAULT_DIRECTORY_NAME
--------------------------------------------------------------------------------
SALES_DATA
INSERT INTO hybrid_split_table VALUES (1001,100,TO_DATE('10-02-2018','dd-mm-yyyy'),10,15,500,7500);
INSERT INTO hybrid_split_table VALUES (1002,110,TO_DATE('15-06-2018','dd-mm-yyyy'),12,18,100,3200);
...
INSERT INTO hybrid_split_table VALUES (1002,110,TO_DATE('12-01-2019','dd-mm-yyyy'),12,18,150,4800);
INSERT INTO hybrid_split_table VALUES (1001,100,TO_DATE('16-02-2019','dd-mm-yyyy'),10,15,400,6500);
...
INSERT INTO hybrid_split_table VALUES (1002,110,TO_DATE('19-02-2020','dd-mm-yyyy'),12,18,150,4800);
INSERT INTO hybrid_split_table VALUES (1001,100,TO_DATE('12-03-2020','dd-mm-yyyy'),10,15,400,6500);
...
SELECT * FROM hybrid_split_table PARTITION(sales_2016);
PROD_ID CUST_ID TIME_ID CHANNEL_ID PROMO_ID QUANTITY_SOLD AMOUNT_SOLD
---------- ---------- --------- ---------- ---------- ------------- -----------
1001 100 10-JAN-16 10 15 500 7500
1002 110 25-JAN-16 12 18 100 3200
...
SELECT * FROM hybrid_split_table PARTITION(sales_2017);
PROD_ID CUST_ID TIME_ID CHANNEL_ID PROMO_ID QUANTITY_SOLD AMOUNT_SOLD
---------- ---------- --------- ---------- ---------- ------------- -----------
1002 110 15-JAN-17 12 18 100 3200
1001 100 10-FEB-17 10 15 500 7500
...
SELECT * FROM hybrid_split_table 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
...
SELECT * FROM hybrid_split_table PARTITION(sales_2019);
PROD_ID CUST_ID TIME_ID CHANNEL_ID PROMO_ID QUANTITY_SOLD AMOUNT_SOLD
---------- ---------- --------- ---------- ---------- ------------- -----------
1002 110 12-JAN-19 12 18 150 4800
1001 100 16-FEB-19 10 15 400 6500
...
SELECT * FROM hybrid_split_table PARTITION(sales_future);
PROD_ID CUST_ID TIME_ID CHANNEL_ID PROMO_ID QUANTITY_SOLD AMOUNT_SOLD
---------- ---------- --------- ---------- ---------- ------------- -----------
1002 110 19-FEB-20 12 18 150 4800
1001 100 12-MAR-20 10 15 400 6500
1001 100 31-MAR-20 10 15 600 8000
2105 101 25-APR-20 12 19 100 3000
ALTER TABLE hybrid_split_table
SPLIT PARTITION sales_future INTO
(PARTITION sales_2020 VALUES LESS THAN (TO_DATE('01-01-2021','dd-mm-yyyy')),
PARTITION sales_future
);
SELECT * FROM hybrid_split_table PARTITION(sales_2020);
PROD_ID CUST_ID TIME_ID CHANNEL_ID PROMO_ID QUANTITY_SOLD AMOUNT_SOLD
---------- ---------- --------- ---------- ---------- ------------- -----------
1002 110 19-FEB-20 12 18 150 4800
1001 100 12-MAR-20 10 15 400 6500
1001 100 31-MAR-20 10 15 600 8000
2105 101 25-APR-20 12 19 100 3000
SELECT * FROM hybrid_split_table PARTITION(sales_future);
no rows selected
4.7.6 ハイブリッド・パーティション表のデータの交換
ハイブリッド・パーティション表の内部パーティションのデータを外部非パーティション表と交換したり、外部非パーティション表のデータをハイブリッド・パーティション表の内部パーティションと交換できます。Oracleは内部ストレージと外部ストレージ間の交換をサポートしていますが、これらの層の間の移動操作はサポートしていません。内部ストレージと外部ストレージの間でのデータの移動は、交換前の個別の操作です。
例4-49 ハイブリッド・パーティション表の内部パーティションのデータと外部非パーティション表の交換
この例では、ハイブリッド・パーティション表の内部パーティションのデータが、まったく同じデータを含むパーティション化されていない外部表とのパーティション交換を使用して外部ストレージに移動されます。
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)
);この例のデータをハイブリッド・パーティション表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 3600sales_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.ハイブリッド・パーティション表とデータを交換するための一時内部表を作成します。
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.