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