ハイブリッド・パーティション表の管理
ハイブリッド・パーティション表の作成
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-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-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関連項目:
ハイブリッド・パーティション表での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-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