在Oracle12.2版本之前,如果想把一个非分区表转为分区表常用的有这几种方法:1、建好分区表然后插入选择把数据插入到分区表中;2、使用在线重定义(DBMS_REDEFINITION)的方法。它们的币是:第一种方法,如果对表有频繁的DML操作,尤其是更新操作,就需要停业务来做转换。第二种方法可以在线进行操作,不需要停业务,但操作步骤比较复杂,且可能出错。
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 *,得到scott.emp; Table 创建。 zx@ORA12C> create  index idx_emp_no 提醒emp (empno); Index 创建。 zx@ORA12C> create  index idx_emp_job 提醒emp(工作); Index 创建。 zx@ORA12C> col  table_name for 故事本来 zx@ORA12C> col  index_name for 故事本来 zx@ORA12C> select  table_name partitioned 得到user_tables where table_name=癊MP”; TABLE_NAME ,,,,,,,,,,,,,,,,,,,,标准 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -,- - - - - - EMP ,,,,,,,,,,,,,,,,,,,,,,,,,,,没有 分区,zx@ORA12C> select  index_name status 得到user_indexes where table_name=癊MP”; INDEX_NAME ,,,,,,,,,,,,,,,,,,,, PAR 状态 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -,-安康;- - - - - - - IDX_EMP_NO ,,,,,,,,,,,,,,,,,,,, NO 有效 IDX_EMP_JOB ,,,,,,,,,,,,,,,,,,, NO ,有效的
2,使用alter table语句,执行分区表转换操作
zx@ORA12C> alter table emp 修改 2,,,,,,partition by range (deptno), interval (10) 3,,,,,,(,partition p1  values less than (10), 4,,,,,,,,partition p2 values less than (20) 5,,,,,),在线 6,,,,, Table 改变。
3,查看现在的表和索引的状态
zx@ORA12C> select table_name, partitioned 得到user_tables where table_name=癊MP”; TABLE_NAME ,,,,,,,,,,,,,,,,,,,,标准 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -,- - - - - - EMP ,,,,,,,,,,,,,,,,,,,,,,,,,,,是的 分区,zx@ORA12C> select  index_name status 得到user_indexes where table_name=癊MP”; INDEX_NAME ,,,,,,,,,,,,,,,,,,,, PAR 状态 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -,-安康;- - - - - - - IDX_EMP_NO ,,,,,,,,,,,,,,,,,,,, NO 有效 IDX_EMP_JOB ,,,,,,,,,,,,,,,,,,, NO 有效 zx@ORA12C> select  table_name partition_name 得到user_tab_partitions where table_name=癊MP”; TABLE_NAME ,,,,,,,,,,,,,,,,,,, PARTITION_NAME - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -,- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - EMP ,,,,,,,,,,,,,,,,,,,,,,,,,,, P1 EMP ,,,,,,,,,,,,,,,,,,,,,,,,,,, P2 null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null nullOracle 12.2新特性——在线把非分区表转为分区表