oracle 19c新特性混合分区表

发布于:2021-02-21 00:00:20

0

115

0

oracle oracle 19c 混合分区表 数据库

在oracle12crelease2中,新特性之一是能够在外部表上创建分区。

Oracle 19c中的新功能是我们可以创建一个混合分区表的功能,因此有些分区存在于数据库中,有些分区托管在数据库外部,可能在普通文件系统或ACFS甚至Hadoop文件系统上。

使用此功能,我们可能希望将表中较旧的非活动分区移动到数据库外部托管的可能较便宜的存储中,而活动数据则托管在存储在Oracle数据库内部的分区中。

现在我们有了外部分区和内部分区的概念,混合分区表特性使我们能够将内部分区和外部分区集成在同一个表中!

对于这种混合分区表,分区可以驻留在Oracle数据库的两个表空间上,也可以驻留在外部源上,例如带有逗号分隔值(CSV)记录的Linux文件或带有Java服务器的Hadoop分布式文件系统(HDFS)上的文件。

让我们用一个例子来看看这个特性。

假设我们有一些2017年和2018年的销售数据,这些数据位于平面文件(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

我们现在创建一个混合分区表,该表在列DATE_OF_SALES上进行范围分区。

2017年和2018年的分区是外部分区,2019年的分区是内部分区。

注意externallocation子句,它指示分区是一个外部分区,并且数据包含在所提到的文件中。外部文件位于为目录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

让我们对外部分区发出一些查询,并在内部分区中插入一些行。

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