Oracle 12.2新特性----在线把非分区表转为分区表

发布时间:2020-06-23 20:28:16 作者:hbxztc
来源:网络 阅读:927

在Oracle12.2版本之前,如果想把一个非分区表转为分区表常用的有这几种方法:1、建好分区表然后insert into select 把数据插入到分区表中;2、使用在线重定义(DBMS_REDEFINITION)的方法。它们的币是:第一种方法,如果对表有频繁的DML操作,尤其是update操作,就需要停业务来做转换。第二种方法可以在线进行操作,不需要停业务,但操作步骤比较复杂,且可能出错。

Oracle12cR2版本中提供了一种新特性,一条语句就可以把非分区表转换为分区表,语法如下:

ALTER TABLE table_name MODIFY table_partitioning_clauses
  [ filter_condition ]
  [ ONLINE ]
  [ UPDATE INDEXES [ ( index { local_partitioned_index | global_partitioned_index | GLOBAL }
                     [, index { local_partitioned_index | global_partitioned_index | GLOBAL } ]... )
                   ]
  ]

下面来测试一下这个新特性

1、创建测试表及相关索引,并查看状态

zx@ORA12C>create table emp as select * from scott.emp;

Table created.

zx@ORA12C>create index idx_emp_no on emp(empno);

Index created.

zx@ORA12C>create index idx_emp_job on emp(job);

Index created.

zx@ORA12C>col table_name for a30
zx@ORA12C>col index_name for a30
zx@ORA12C>select table_name,partitioned from user_tables where table_name='EMP';

TABLE_NAME                     PAR
------------------------------ ---
EMP                            NO

zx@ORA12C>select index_name,partitioned,status from user_indexes where table_name='EMP';

INDEX_NAME                     PAR STATUS
------------------------------ --- --------
IDX_EMP_NO                     NO  VALID
IDX_EMP_JOB                    NO  VALID

2、使用alter table语句,执行分区表转换操作

zx@ORA12C>alter table emp modify
  2    partition by range (deptno) interval (10)
  3    ( partition p1 values less than (10),
  4      partition p2 values less than (20)
  5    ) online
  6  ;

Table altered.

3、查看现在的表和索引的状态

zx@ORA12C>select table_name,partitioned from user_tables where table_name='EMP';

TABLE_NAME                     PAR
------------------------------ ---
EMP                            YES

zx@ORA12C>select index_name,partitioned,status from user_indexes where table_name='EMP';

INDEX_NAME                     PAR STATUS
------------------------------ --- --------
IDX_EMP_NO                     NO  VALID
IDX_EMP_JOB                    NO  VALID

zx@ORA12C>select table_name,partition_name from user_tab_partitions where table_name='EMP';

TABLE_NAME                     PARTITION_NAME
------------------------------ ------------------------------
EMP                            P1
EMP                            P2
EMP                            SYS_P405
EMP                            SYS_P406

现在表EMP已经被转换为分区表了,索引转换为分区索引,但索引状态是正常的。

4、如果想在转换表时同时转换索引可以使用UPDATE INDEXES子句

zx@ORA12C>alter table emp modify
  2    partition by range (deptno) interval (10)
  3    ( partition p1 values less than (10),
  4      partition p2 values less than (20)
  5    ) online
  6    update indexes
  7    (idx_emp_no local)
  8  ;

Table altered.

zx@ORA12C>col table_name for a30
zx@ORA12C>col index_name for a30
zx@ORA12C>select table_name,partitioned from user_tables where table_name='EMP';

TABLE_NAME                     PAR
------------------------------ ---
EMP                            YES

zx@ORA12C>select index_name,partitioned,status from user_indexes where table_name='EMP';

INDEX_NAME                     PAR STATUS
------------------------------ --- --------
IDX_EMP_NO                     YES N/A
IDX_EMP_JOB                    NO  VALID

zx@ORA12C>select table_name,partition_name from user_tab_partitions where table_name='EMP';

TABLE_NAME                     PARTITION_NAME
------------------------------ ------------------------------
EMP                            P1
EMP                            P2
EMP                            SYS_P403
EMP                            SYS_P404

zx@ORA12C>select index_name,partition_name,status from user_ind_partitions where index_name='IDX_EMP_NO';

INDEX_NAME                     PARTITION_NAME                 STATUS
------------------------------ ------------------------------ --------
IDX_EMP_NO                     P1                             USABLE
IDX_EMP_NO                     P2                             USABLE
IDX_EMP_NO                     SYS_P403                       USABLE
IDX_EMP_NO                     SYS_P404                       USABLE

从上面的执行结果来看,不仅表EMP转换为分区表,而且索引IDX_EMP_NO也转换分区索引,所有索引状态均正常。

下面是官方文档里的一些注意事项:

When using the UPDATE INDEXES clause, note the following.

参考:http://docs.oracle.com/database/122/VLDBG/evolve-nopartition-table.htm#VLDBG-GUID-5FDB7D59-DD05-40E4-8AB4-AF82EA0D0FE5


推荐阅读:
  1. Oracle12C新特性有哪些
  2. Oracle普通表转分区表的几种方法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

oracle convert online

上一篇:Xcode 4.6.2 运行次数为偶数程序崩溃问题

下一篇:剑指offer:从上到下打印二叉树

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》