發(fā)布于:2021-02-04 13:50:20
0
229
0
在oracle12crelease2中,添加了一個(gè)新特性,通過(guò)在altertable SQL語(yǔ)句中添加MODIFY子句,我們可以將非分區(qū)表轉(zhuǎn)換為分區(qū)表。此外,可以在線執(zhí)行該操作,從而在執(zhí)行轉(zhuǎn)換時(shí)啟用并發(fā)DML操作。
在需要為特定表啟用分區(qū)但無(wú)法承受執(zhí)行轉(zhuǎn)換的停機(jī)時(shí)間的情況下,這是一個(gè)非常好的特性。
oracle18c中添加了一個(gè)新特性,我們現(xiàn)在還通過(guò)altertablemodifypartitionsql語(yǔ)句在線更改表的分區(qū)策略。
例如,我們可以將表的分區(qū)策略從散列分區(qū)更改為范圍分區(qū),并且該操作也可以在線執(zhí)行,而不會(huì)影響表上的DML操作。
索引也作為表修改的一部分進(jìn)行維護(hù)。
這個(gè)新特性使我們能夠根據(jù)不斷變化的業(yè)務(wù)或應(yīng)用程序需求調(diào)整表的分區(qū)方法或策略,而不需要任何相關(guān)的停機(jī)時(shí)間來(lái)進(jìn)行更改。
讓我們通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)看看這個(gè)特性。
創(chuàng)建一個(gè)非分區(qū)表
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;
在線將非分區(qū)表轉(zhuǎn)換為分區(qū)表。
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
聯(lián)機(jī)將范圍分區(qū)表轉(zhuǎn)換為哈希分區(qū)表。
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
作者介紹
熱門(mén)博客推薦