ORACLE 19C新特性-HYBRID PARTITIONED TABLES

这是我比较喜欢的一个新特性。在Oracle 12c第2版中,新功能之一是能够在外部表上创建分区。Oracle 19c中的新功能是我们可以创建混合分区表的功能。 可以在数据库中存在一些分区,某些分区托管在数据库外部 。这个可以在普通文件系统,ACFS文件系统,甚至是Hadoop文件系统上。使用此功能,我们可能希望将表中的较旧的非活动分区移动到数据库外部托管的廉价存储中,而活动数据则托管在Oracle数据库的分区中。而”HYBRID PARTITIONED TABLES”功能使我们能够将内部和外部分区进行这种集,所有数据都在同一个表中。

对于混合分区表,分区既可以在Oracle数据库中的表空间上,也可以在外部源上,例如具有逗号分隔值(CSV)的Linux文件或具有的Hadoop分布式文件系统(HDFS)上的文件。我们来测试一下这个新功能吧。

让我们假设我们有一些学生的信息,2017年和2018年的数据位于平面文件中(st2017.txt和st2018.txt)。现在,我们创建一个HYBRID分区表,该表在student_p1列上进行了范围分区。2017年和2018年的分区是外部分区,而2019年的分区是内部分区。

请注意EXTERNAL LOCATION子句,该子句指示该分区是外部分区,并且数据包含在上述文件中。外部文件位于为目录DATA_PUMP_DIR定义的目录位置中。

CREATE TABLE students
(student_id number, 
 student_name varchar2(20),
 sex number,
 birthday date)
EXTERNAL PARTITION ATTRIBUTES (
TYPE oracle_loader
DEFAULT DIRECTORY DATA_PUMP_DIR
ACCESS PARAMETERS(FIELDS TERMINATED BY ',')
REJECT LIMIT UNLIMITED
)
PARTITION BY RANGE (student_id) 
(PARTITION student_2017 VALUES LESS THAN (200) EXTERNAL LOCATION ('st2017.txt'),
 PARTITION student_2018 VALUES LESS THAN (400) EXTERNAL LOCATION ('st2018.txt'),
 PARTITION student_2019 VALUES LESS THAN (600),
 PARTITION student_pmax VALUES LESS THAN (MAXVALUE)
)
;    
Table created.

SQL> select hybrid from dba_tables where table_name='STUDENTS';

HYB
---
YES

[oracle@oracle-19c-vagrant ]$ cat st2017.txt 
1,'zhangsan',0,20-JAN-2008,
2,'lisi',0,12-FEB-2008,
3,'wangyi',0,15-JUL-2008,
4,'zhangjian',0,20-MAR-2008,
5,'zhaoxiaoxia',1,5-APR-2008,
[oracle@oracle-19c-vagrant ]$ cat st2018.txt 
201,'liming',0,19-JAN-2009,
202,'lisisi',1,29-DEC-2008,
203,'wanghaili',1,7-MAR-2009,
204,'zengqian',1,16-JUL-2009,
205,'liufeng',0,14-APR-2009,

现在我们的混合分区表就创建好了,我们可以做一些基础的查询。

SQL>  select * from students where student_id < 200 ;

STUDENT_ID STUDENT_NAME 	       SEX BIRTHDAY
---------- -------------------- ---------- ---------
	 1 'zhangsan'			 0 20-JAN-08
	 2 'lisi'			 0 12-FEB-08
	 3 'wangyi'			 0 15-JUL-08
	 4 'zhangjian'			 0 20-MAR-08
	 5 'zhaoxiaoxia'		 1 05-APR-08

SQL> select * from students partition(student_2018);

STUDENT_ID STUDENT_NAME 	       SEX BIRTHDAY
---------- -------------------- ---------- ---------
       201 'liming'			 0 19-JAN-09
       202 'lisisi'			 1 29-DEC-08
       203 'wanghaili'			 1 07-MAR-09
       204 'zengqian'			 1 16-JUL-09
       205 'liufeng'			 0 14-APR-09

这里需要注意的一点是,我们不能在外部分区上执行DML操作。只能对数据位于数据库中的内部分区执行数据操作。例如。

SQL> insert into students values(6,'Test',0,sysdate);
insert into students values(6,'Test',0,sysdate)
            *
ERROR at line 1:
ORA-14466: Data in a read-only partition or subpartition cannot be modified

SQL> delete students where STUDENT_ID=205;
delete students where STUDENT_ID=205
       *
ERROR at line 1:
ORA-14354: operation not supported for a hybrid-partitioned table

SQL> insert into students values(401,'Test',0,sysdate);
1 row created.

SQL> commit;
Commit complete.

SQL> select * from students partition (student_2019);

STUDENT_ID STUDENT_NAME 	       SEX BIRTHDAY
---------- -------------------- ---------- ---------
       401 Test 			 0 29-FEB-20

当然还有很多高级功能,例如怎么把普通分区表转换成混合分区表,将混合分区表转换成 Internal Partitioned Tables等等,详情参考参考文档:Managing Hybrid Partitioned Tables
官方链接:https://docs.oracle.com/en/database/oracle/oracle-database/19/vldbg/manage_hypt.html#GUID-4D0F2F16-5601-4240-AD94-219D85FD6AED

分享到: 更多

Post a Comment

Your email is never published nor shared. Required fields are marked *