【新特性】05.混合分区表

  特性:混合分区表。简单来讲,可以认为是将之前的分区表和外部表结合起来,当然混合分区表的功能不只这些。一般情况下,我们使用分区表,是将各个分区对应不同的表空间,各个表空间可以对应不同位置、不同种类的存储,但一般都为常规文件系统。而19c当中的混合分区表,在建表的时候,直接可以使用外部表属性,将“冷”数据直接定位在廉价存储、HDFS或者公有云存储上。

  创建混合分区表

一、环境准备

[oracle@T1 XieBro]$ pwd
/opt/XieBro
[oracle@T1 XieBro]$ cat stu2019.txt 
1 ZhangSan 19 19-SEP-2019
2 Li 20 20-FEB-2019
[oracle@T1 XieBro]$ cat stu2020.txt 
3 WangWu 20 20-FEB-2020
4 ZhaoLiu 21 23-JAN-2020

 

二、进入pdb创建mix_table用户,并授权

SQL> create user mix_table identified by mix_table default tablespace users quota unlimited on users;

User created.

SQL> grant dba,connect,resource to mix_table;

Grant succeeded.

 

 三、创建一个目录对象

SQL> create directory mix_table as '/opt/XieBro/';

Directory created.

SQL> grant read,write on directory mix_table to public;

Grant succeeded.

 

四、建表

CREATE TABLE mix_table.stu
(id number(10),
name varchar2(20),
age number, 
enroll_dt date)
EXTERNAL PARTITION ATTRIBUTES (
TYPE oracle_loader
DEFAULT DIRECTORY mix_table
ACCESS PARAMETERS
(RECORDS DELIMITED BY NEWLINE FIELDS TERMINATED BY WHITESPACE)
)
PARTITION BY RANGE (enroll_dt)
(PARTITION stu2019 VALUES LESS THAN (TO_DATE('01-JAN-2020','DD-MON-YYYY')) EXTERNAL LOCATION ('stu2019.txt'),
PARTITION stu2020 VALUES LESS THAN (TO_DATE('01-JAN-2021','DD-MON-YYYY')) EXTERNAL LOCATION ('stu2020.txt'),
PARTITION stu2021 VALUES LESS THAN (TO_DATE('01-JAN-2022','DD-MON-YYYY'))
);

查看数据 

SQL> select * from mix_table.stu;

    ID     NAME                 AGE        ENROLL_DT
---------- -------------------- ---------- ---------
     1     ZhangSan             19         19-SEP-19
     2     Li                   20         20-FEB-19
     3     WangWu               20         20-FEB-20
     4     ZhaoLiu              21         23-JAN-20

 

 五、插入数据

  与以前版本的外部表不同,以前版本的外部表都是以查询为目的,不会对里面的数据进行更改,而在19c的混合分区表中,可以对其中的数据进行更改,这种更改包括插入、更新和删除。我们现在向“数据库内分区”插入数据看看。2021年这个分区是数据库内的分区。

SQL> insert into mix_table.stu values(100,'SunQi',30,to_date('2021-6-6','yyyy-mm-dd'));

1 row created.

SQL> commit;

Commit complete.

SQL> select * from mix_table.stu;

        ID NAME                 AGE        ENROLL_DT
---------- -------------------- ---------- ---------
         1 ZhangSan             19         19-SEP-19
         2 Li                   20         20-FEB-19
         3 WangWu               20         20-FEB-20
         4 ZhaoLiu              21         23-JAN-20
       100 SunQi                30         06-JUN-21

  接下来,我们向外部分区插入数据看看。2019年和2020年的数据是被定义在外部分区上,我们对这个分区插入数据,看到如下结果。

SQL> insert into mix_table.stu values(101,'ZhouBa',30,to_date('2020-6-6','yyyy-mm-dd'));
insert into mix_table.stu values(101,'ZhouBa',30,to_date('2020-6-6','yyyy-mm-dd'))
                      *
ERROR at line 1:
ORA-14466: Data in a read-only partition or subpartition cannot be modified.

 

 将混合分区变为普通分区

  当不想使用混合分区表时,只要将他的外部分区都删除,然后再删除它的外部分区属性,那么就可以将混合分区表转换为普通分区表了。在下面的实验中,我们先创建一个混合分区表,然后看看它的属性,接下来将它的所有外部分区都删除,再删除它的外部分区属性,之后再看看这个表的属性。

 第一步:创建一个混合分区表

CREATE TABLE mix_table.stu_normal
(id number(10),
name varchar2(20),
age number, 
enroll_dt date)
EXTERNAL PARTITION ATTRIBUTES (
TYPE oracle_loader
DEFAULT DIRECTORY mix_table
ACCESS PARAMETERS
(RECORDS DELIMITED BY NEWLINE FIELDS TERMINATED BY WHITESPACE)
)
PARTITION BY RANGE (enroll_dt)
(PARTITION stu2019 VALUES LESS THAN (TO_DATE('01-JAN-2020','DD-MON-YYYY')) EXTERNAL LOCATION ('stu2019.txt'),
PARTITION stu2020 VALUES LESS THAN (TO_DATE('01-JAN-2021','DD-MON-YYYY')) EXTERNAL LOCATION ('stu2020.txt'),
PARTITION stu2021 VALUES LESS THAN (TO_DATE('01-JAN-2022','DD-MON-YYYY')),
PARTITION stu2022 VALUES LESS THAN (TO_DATE('01-JAN-2023','DD-MON-YYYY')),
PARTITION stu2023 VALUES LESS THAN (TO_DATE('01-JAN-2024','DD-MON-YYYY'))
);

 第二步:看看这个表的分区属性

SQL> conn mix_table/mix_table@pdb

Connected.

SQL> SELECT HYBRID FROM DBA_TABLES WHERE TABLE_NAME='STU_NORMAL';

HYB
---
YES

 通过查询,我们发现,刚创建的stu_normal是一个混合分区表。

 第三步:删除所有外部分区,并删除分区属性

SQL> ALTER TABLE MIX_TABLE.STU_NORMAL DROP PARTITION STU2019;

Table altered.

SQL> ALTER TABLE MIX_TABLE.STU_NORMAL DROP PARTITION STU2020;

Table altered.

SQL> ALTER TABLE MIX_TABLE.STU_NORMAL DROP EXTERNAL PARTITION ATTRIBUTES();

Table altered.

SQL> SELECT HYBRID FROM DBA_TABLES WHERE TABLE_NAME='STU_NORMAL';

HYB
---
NO

  stu_normal有两个外部分区,我们先将这两个外部分区都删除,然后在删除这个表的外部分区属性。这时候查看表的混合分区属性时,就会得到下图中的“NO”,表示这个表已经不是一个混合分区表了。

混合分区表中的ADO

   Automatic Data Optimization (ADO),自动数据优化策略。在之前版本的数据库中就提供了,我们可以设定策略,比如对于很久不访问的数据进行压缩。在19c的混合分区表中,也可以使用这项技术,但仅限于数据库内的分区。我们在下面的例子中,为2021这个分区设定数据压缩策略,对那些6个月没有修改的数据进行压缩。

CREATE TABLE mix_table.stu_ado
(id number(10),
name varchar2(20),
age number, 
enroll_dt date)
EXTERNAL PARTITION ATTRIBUTES (
TYPE oracle_loader
DEFAULT DIRECTORY mix_table
ACCESS PARAMETERS
(RECORDS DELIMITED BY NEWLINE FIELDS TERMINATED BY WHITESPACE)
)
PARTITION BY RANGE (enroll_dt)
(PARTITION stu2019 VALUES LESS THAN (TO_DATE('01-JAN-2020','DD-MON-YYYY')) EXTERNAL LOCATION ('stu2019.txt'),
PARTITION stu2020 VALUES LESS THAN (TO_DATE('01-JAN-2021','DD-MON-YYYY')) EXTERNAL LOCATION ('stu2020.txt'),
PARTITION stu2021 VALUES LESS THAN (TO_DATE('01-JAN-2022','DD-MON-YYYY'))
);
SQL> SELECT HYBRID FROM DBA_TABLES WHERE TABLE_NAME='STU_ADO';

HYB
---
YES

SQL> ALTER TABLE MIX_TABLE.STU_ADO MODIFY PARTITION STU2021 ILM ADD POLICY ROW STORE COMPRESS ADVANCED ROW AFTER 6 MONTHS OF NO MODIFICATION;

Table altered.

SQL> COL POLICY_NAME FOR A5

POLIC POLICY_TYPE   ENA
----- ------------- ---
P1    DATA MOVEMENT YES

   可以看到策略已经应用成功

 混合分区表split分区

   在混合分区表当中,我们可以像之前版本的数据库一样,对于默认分区进行拆分。比如下面的例子当中,2020年之后的数据都将进入默认分区stu_future。我们现在对这个分区进行拆分,拆分成2021分区和stu_future,stu_future将继续作为默认分区。

CREATE TABLE mix_table.stu_split
(id number(10),
name varchar2(20),
age number, 
enroll_dt date)
EXTERNAL PARTITION ATTRIBUTES (
TYPE oracle_loader
DEFAULT DIRECTORY mix_table
ACCESS PARAMETERS
(RECORDS DELIMITED BY NEWLINE FIELDS TERMINATED BY WHITESPACE)
)
PARTITION BY RANGE (enroll_dt)
(PARTITION stu2019 VALUES LESS THAN (TO_DATE('01-JAN-2020','DD-MON-YYYY')) EXTERNAL LOCATION ('stu2019.txt'),
PARTITION stu2020 VALUES LESS THAN (TO_DATE('01-JAN-2021','DD-MON-YYYY')),
PARTITION stufuture VALUES LESS THAN (MAXVALUE)
);

  在创建stu_split之后,查询一下它的混合分区属性,发现他是混合分区表。然后我们将它的默认分区拆分成2021分区和stu_future分区,将2021年之后的数据都放入默认分区stu_future。我们再次查询这个表的混合分区属性,发现它还是混合分区表,最后看看这个混合分区表的分区信息,我们发现新添加的2021分区已经显示出来了。

SQL> ALTER TABLE MIX_TABLE.STU_SPLIT SPLIT PARTITION stufuture INTO
(PARTITION stu2021 VALUES LESS THAN(TO_DATE('01-01-2022','dd-mm-yyyy')),
PARTITION stufuture);

Table altered.

SQL> col table_name for a10
SQL> col partition_name for a15

TABLE_NAME PARTITION_NAME
---------- ---------------
STU_SPLIT  STU2019
STU_SPLIT  STU2020
STU_SPLIT  STU2021
STU_SPLIT  STUFUTURE

 

posted @ 2021-07-20 14:19  蟹Bro  阅读(236)  评论(0编辑  收藏  举报