Oracle 12.2新特性----在线把非分区表转为分区表
在Oracle12.2版本之前,如果想把一个非分区表转为分区表常用的有这几种方法:1、建好分区表然后insert into select 把数据插入到分区表中;2、使用在线重定义(DBMS_REDEFINITION)的方法。它们的币是:第一种方法,如果对表有频繁的DML操作,尤其是update操作,就需要停业务来做转换。第二种方法可以在线进行操作,不需要停业务,但操作步骤比较复杂,且可能出错。 Oracle12cR2版本中提供了一种新特性,一条语句就可以把非分区表转换为分区表,语法如下: ALTERTABLEtable_nameMODIFYtable_partitioning_clauses [filter_condition] [ONLINE] [UPDATEINDEXES[(index{local_partitioned_index|global_partitioned_index|GLOBAL} [,index{local_partitioned_index|global_partitioned_index|GLOBAL}]...) ] ] 下面来测试一下这个新特性 1、创建测试表及相关索引,并查看状态 zx@ORA12C>createtableempasselect*fromscott.emp; Tablecreated. zx@ORA12C>createindexidx_emp_noonemp(empno); Indexcreated. zx@ORA12C>createindexidx_emp_jobonemp(job); Indexcreated. zx@ORA12C>coltable_namefora30 zx@ORA12C>colindex_namefora30 zx@ORA12C>selecttable_name,partitionedfromuser_tableswheretable_name='EMP'; TABLE_NAMEPAR --------------------------------- EMPNO zx@ORA12C>selectindex_name,partitioned,statusfromuser_indexeswheretable_name='EMP'; INDEX_NAMEPARSTATUS ----------------------------------------- IDX_EMP_NONOVALID IDX_EMP_JOBNOVALID 2、使用alter table语句,执行分区表转换操作 zx@ORA12C>altertableempmodify 2partitionbyrange(deptno)interval(10) 3(partitionp1valueslessthan(10),4partitionp2valueslessthan(20) 5)online 6; Tablealtered. 3、查看现在的表和索引的状态 zx@ORA12C>selecttable_name,partitionedfromuser_tableswheretable_name='EMP'; TABLE_NAMEPAR --------------------------------- EMPYES zx@ORA12C>selectindex_name,statusfromuser_indexeswheretable_name='EMP'; INDEX_NAMEPARSTATUS ----------------------------------------- IDX_EMP_NONOVALID IDX_EMP_JOBNOVALID zx@ORA12C>selecttable_name,partition_namefromuser_tab_partitionswheretable_name='EMP'; TABLE_NAMEPARTITION_NAME ------------------------------------------------------------ EMPP1 EMPP2 EMPSYS_P405 EMPSYS_P406 现在表EMP已经被转换为分区表了,索引转换为分区索引,但索引状态是正常的。 4、如果想在转换表时同时转换索引可以使用UPDATE INDEXES子句 zx@ORA12C>altertableempmodify 2partitionbyrange(deptno)interval(10) 3(partitionp1valueslessthan(10),4partitionp2valueslessthan(20) 5)online 6updateindexes 7(idx_emp_nolocal) 8; Tablealtered. zx@ORA12C>coltable_namefora30 zx@ORA12C>colindex_namefora30 zx@ORA12C>selecttable_name,statusfromuser_indexeswheretable_name='EMP'; INDEX_NAMEPARSTATUS ----------------------------------------- IDX_EMP_NOYESN/A IDX_EMP_JOBNOVALID zx@ORA12C>selecttable_name,partition_namefromuser_tab_partitionswheretable_name='EMP'; TABLE_NAMEPARTITION_NAME ------------------------------------------------------------ EMPP1 EMPP2 EMPSYS_P403 EMPSYS_P404 zx@ORA12C>selectindex_name,partition_name,statusfromuser_ind_partitionswhereindex_name='IDX_EMP_NO'; INDEX_NAMEPARTITION_NAMESTATUS -------------------------------------------------------------------- IDX_EMP_NOP1USABLE IDX_EMP_NOP2USABLE IDX_EMP_NOSYS_P403USABLE IDX_EMP_NOSYS_P404USABLE 从上面的执行结果来看,不仅表EMP转换为分区表,而且索引IDX_EMP_NO也转换分区索引,所有索引状态均正常。 下面是官方文档里的一些注意事项: When using the
参考:http://docs.oracle.com/database/122/VLDBG/evolve-nopartition-table.htm#VLDBG-GUID-5FDB7D59-DD05-40E4-8AB4-AF82EA0D0FE5 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |