Oracle 18c新功能—在线分区策略修改

发布于:2021-02-04 13:50:20

0

206

0

Oracle Oracle 18c 在线分区 策略修改 数据库

在oracle12crelease2中,添加了一个新特性,通过在altertable SQL语句中添加MODIFY子句,我们可以将非分区表转换为分区表。此外,可以在线执行该操作,从而在执行转换时启用并发DML操作。

在需要为特定表启用分区但无法承受执行转换的停机时间的情况下,这是一个非常好的特性。

oracle18c中添加了一个新特性,我们现在还通过altertablemodifypartitionsql语句在线更改表的分区策略。

例如,我们可以将表的分区策略从散列分区更改为范围分区,并且该操作也可以在线执行,而不会影响表上的DML操作。

索引也作为表修改的一部分进行维护。

这个新特性使我们能够根据不断变化的业务或应用程序需求调整表的分区方法或策略,而不需要任何相关的停机时间来进行更改。

让我们通过一个简单的例子来看看这个特性。

创建一个非分区表

create table emp(
 empno    number(4,0),
 ename    varchar2(10),
 job      varchar2(9),
 mgr      number(4,0),
 hiredate date,
 sal      number(7,2),
 comm     number(7,2),
 deptno   number(2,0)
 );

create index emp_ind on emp (empno);

insert into emp
values(
7839, 'KING', 'PRESIDENT', null,
to_date('17-11-2011','dd-mm-yyyy'),
5000, null, 10
);
insert into emp
values(
7698, 'BLAKE', 'MANAGER', 7839,
to_date('1-5-2011','dd-mm-yyyy'),
2850, null, 30
);
insert into emp
values(
7782, 'CLARK', 'MANAGER', 7839,
to_date('9-6-2011','dd-mm-yyyy'),
2450, null, 10
);
insert into emp
values(
7566, 'JONES', 'MANAGER', 7839,
to_date('2-4-2011','dd-mm-yyyy'),
2975, null, 20
);
insert into emp
values(
7788, 'SCOTT', 'ANALYST', 7566,
to_date('13-JUL-2014','dd-mon-yyyy') - 85,
3000, null, 20
);
insert into emp
values(
7902, 'FORD', 'ANALYST', 7566,
to_date('3-12-2011','dd-mm-yyyy'),
3000, null, 20
);
insert into emp
values(
7369, 'SMITH', 'CLERK', 7902,
to_date('17-12-2012','dd-mm-yyyy'),
800, null, 20
);
insert into emp
values(
7499, 'ALLEN', 'SALESMAN', 7698,
to_date('20-2-2011','dd-mm-yyyy'),
1600, 300, 30
);
insert into emp
values(
7521, 'WARD', 'SALESMAN', 7698,
to_date('22-2-2011','dd-mm-yyyy'),
1250, 500, 30
);
insert into emp
values(
7654, 'MARTIN', 'SALESMAN', 7698,
to_date('28-9-2011','dd-mm-yyyy'),
1250, 1400, 30
);
insert into emp
values(
7844, 'TURNER', 'SALESMAN', 7698,
to_date('8-9-2011','dd-mm-yyyy'),
1500, 0, 30
);
insert into emp
values(
7655, 'ADAMS', 'CLERK', 7788,
to_date('13-JUL-2014', 'dd-mon-yyyy'),
1100, null, 20
);
insert into emp
values(
7900, 'JAMES', 'CLERK', 7698,
to_date('3-12-2011','dd-mm-yyyy'),
950, null, 30
);

insert into emp
values(
7934, 'MILLER', 'CLERK', 7782,
to_date('23-1-2013','dd-mm-yyyy'),
1300, null, 10
);

commit;

在线将非分区表转换为分区表。

SQL> ALTER TABLE hr.emp
MODIFY
PARTITION BY RANGE (HIREDATE)
(PARTITION p1 VALUES LESS THAN (TO_DATE('01-JAN-2012', 'DD-MON-YYYY')),
PARTITION p2 VALUES LESS THAN (TO_DATE('01-JAN-2013', 'DD-MON-YYYY')),
PARTITION p3 VALUES LESS THAN (TO_DATE('01-JAN-2014', 'DD-MON-YYYY')),
PARTITION p4 VALUES LESS THAN (TO_DATE('01-JAN-2015', 'DD-MON-YYYY')),
PARTITION p5 VALUES LESS THAN (MAXVALUE))
ONLINE
INCLUDING INDEXES;    

Table altered.

SQL> SELECT PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME='EMP';

PARTITION_NAME
--------------------------------------------------------------------------------
P1
P2
P3
P4
P5

联机将范围分区表转换为哈希分区表。

SQL> ALTER TABLE hr.emp
MODIFY
PARTITION BY HASH (JOB)
PARTITIONS 5;

Table altered.

SQL> SELECT PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME='EMP';

PARTITION_NAME
--------------------------------------------------------------------------------
SYS_P288
SYS_P289
SYS_P290
SYS_P291
SYS_P292


SQL> select count(*) from emp partition (SYS_P289);

 COUNT(*)
----------
10

SQL> select count(*) from emp partition (SYS_P290);

 COUNT(*)
----------
4