發(fā)布于:2021-02-21 00:00:20
0
127
0
在oracle12crelease2中,新特性之一是能夠在外部表上創(chuàng)建分區(qū)。
Oracle 19c中的新功能是我們可以創(chuàng)建一個(gè)混合分區(qū)表的功能,因此有些分區(qū)存在于數(shù)據(jù)庫(kù)中,有些分區(qū)托管在數(shù)據(jù)庫(kù)外部,可能在普通文件系統(tǒng)或ACFS甚至Hadoop文件系統(tǒng)上。
使用此功能,我們可能希望將表中較舊的非活動(dòng)分區(qū)移動(dòng)到數(shù)據(jù)庫(kù)外部托管的可能較便宜的存儲(chǔ)中,而活動(dòng)數(shù)據(jù)則托管在存儲(chǔ)在Oracle數(shù)據(jù)庫(kù)內(nèi)部的分區(qū)中。
現(xiàn)在我們有了外部分區(qū)和內(nèi)部分區(qū)的概念,混合分區(qū)表特性使我們能夠?qū)?nèi)部分區(qū)和外部分區(qū)集成在同一個(gè)表中!
對(duì)于這種混合分區(qū)表,分區(qū)可以駐留在Oracle數(shù)據(jù)庫(kù)的兩個(gè)表空間上,也可以駐留在外部源上,例如帶有逗號(hào)分隔值(CSV)記錄的Linux文件或帶有Java服務(wù)器的Hadoop分布式文件系統(tǒng)(HDFS)上的文件。
讓我們用一個(gè)例子來(lái)看看這個(gè)特性。
假設(shè)我們有一些2017年和2018年的銷售數(shù)據(jù),這些數(shù)據(jù)位于平面文件(sales_2017.dat和sales_2018.dat)中。
[oracle@host03 dpdump]$ cat sales_2017.dat
CUST_A 1001 100 20-JAN-2017
CUST_B 1001 110 20-JAN-2017
CUST_C 1001 200 21-JAN-2017
CUST_D 1000 108 22-JAN-2017
CUST_E 1002 10 24-JAN-2017
[oracle@host03 dpdump]$ cat sales_2018.dat
CUST_A 1001 1 20-JAN-2018
CUST_B 1001 110 20-JAN-2018
CUST_C 1001 300 21-JAN-2018
CUST_D 1000 108 22-JAN-2018
CUST_E 1002 90 24-JAN-2018
我們現(xiàn)在創(chuàng)建一個(gè)混合分區(qū)表,該表在列DATE_OF_SALES上進(jìn)行范圍分區(qū)。
2017年和2018年的分區(qū)是外部分區(qū),2019年的分區(qū)是內(nèi)部分區(qū)。
注意externallocation子句,它指示分區(qū)是一個(gè)外部分區(qū),并且數(shù)據(jù)包含在所提到的文件中。外部文件位于為目錄DATA_PUMP_DIR定義的目錄位置。
SQL> CREATE TABLE demo.sales
(cust_name varchar2(10),
prod_id number,
amount_sold number ,
date_of_sale date)
EXTERNAL PARTITION ATTRIBUTES (
TYPE oracle_loader
DEFAULT DIRECTORY data_pump_dir
ACCESS PARAMETERS
(RECORDS DELIMITED BY NEWLINE FIELDS TERMINATED BY WHITESPACE)
)
PARTITION BY RANGE (date_of_sale)
(PARTITION sales_2017 VALUES LESS THAN (TO_DATE('01-JAN-2018','DD-MON-YYYY')) EXTERNAL LOCATION ('sales_2017.dat'),
PARTITION sales_2018 VALUES LESS THAN (TO_DATE('01-JAN-2019','DD-MON-YYYY')) EXTERNAL LOCATION ('sales_2018.dat'),
PARTITION sales_2019 VALUES LESS THAN (TO_DATE('01-JAN-2020','DD-MON-YYYY'))
)
;
Table created.
SQL> select hybrid from dba_tables where table_name='SALES';
HYB
---
YES
讓我們對(duì)外部分區(qū)發(fā)出一些查詢,并在內(nèi)部分區(qū)中插入一些行。
SQL> select * from demo.sales
partition (sales_2017);
CUST_NAME PROD_ID AMOUNT_SOLD DATE_OF_S
---------- ---------- ----------- ---------
CUST_A 1001 100 20-JAN-17
CUST_B 1001 110 20-JAN-17
CUST_C 1001 200 21-JAN-17
CUST_D 1000 108 22-JAN-17
CUST_E 1002 10 24-JAN-17
SQL> select * from demo.sales
partition (sales_2018);
CUST_NAME PROD_ID AMOUNT_SOLD DATE_OF_S
---------- ---------- ----------- ---------
CUST_A 1001 1 20-JAN-18
CUST_B 1001 110 20-JAN-18
CUST_C 1001 300 21-JAN-18
CUST_D 1000 108 22-JAN-18
CUST_E 1002 90 24-JAN-18
SQL> insert into demo.sales
values
('CUST_A',1003,50,'02-JAN-2019');
1 row created.
SQL> commit;
Commit complete.
SQL> select * from demo.sales
partition (sales_2019);
CUST_NAME PROD_ID AMOUNT_SOLD DATE_OF_S
---------- ---------- ----------- ---------
CUST_A 1003 50 02-JAN-19
作者介紹
熱門博客推薦