首页 > 数据库 > Oracle > 【oracle】更新partition key
更新partition key时,会导致该记录超出当前所在分区的范围,需要将其转移到其他对应分区上,因此需要开启ROW MOVEMENT;
举例如下:
//准备数据,数据来自于dba_tables,需要赋予权限
grant select on dba_tables to sunmi;
//创建分区表
drop table test_move;
create table test_move
partition by list (owner)
(partition p1 values ('SYS'),
partition p2 values ('DEMO'),
partition p3 values ('SYSTEM'),
partition def values (default))
as select * from dba_tables;
//这时候修改一条记录的分区键
update test_move set owner='SYSTEM' where table_name='WRH$_PARAMETER_NAME'
//会报如下14402错误:

//这时候要修改表的row movement为enable
alter table test_move enable row movement ;
//在修改一条数据的分区键
update test_move set owner='SYSTEM' where table_name='WRH$_PARAMETER_NAME'commit;
//修改正常。
原因:
这一操作产生影响的特殊之处在于这是个DML操作,是和online transaction密切相关的。这样对于一个update,实际上分为3步:
1、删除原有分区的数据
2、将原有数据转移到新分区上
3、更新数据
即一个update操作被拆分成:delete、insert、update三个操作。增加了性能负担。其中delete的查询条件与原update的查询条件相同,新的update的查询条件是基于insert生成的新的ROWID;相应的Redo Log、Undo log会增加。如果update语句还涉及到Local Index的字段的话,新、旧2个分区上的local index都要被更新。
还有一点,row movement会和域索引(Domain Index)产生冲突,如果表上定义了域索引,开启Row movement会失败,反之亦然。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22825655/viewspace-1116113/ ,如需转载,请注明出处,否则将追究法律责任。