Oracle row movement

原创 2012年03月30日 14:43:14
ROW MOVEMENT特性最初是在8i时引入的,其目的是提高分区表的灵活性,这一特性默认是关闭,只要使用一下3个功能才需要打开:


1.Flashback Table

这一功能能帮助我们及时回滚一些误操作,防止数据意外丢失。在使用该功能之前,必须先打开ROW MOVEMENT,否则就会抛ORA-08189错误。

select username, rowid from test_move;

delete from test_move where username = 'MYTBC';

commit;

alter table test_move enable row movement;

flashback table test_move to timestamp(systimestamp - interval '3' minute);
--闪回到3分钟前得状态,那时username='MYTBC'记录未被删除。

select username, rowid from test_move;
--查询可知,数据被找回来,此时,再比较flashback前后记录的ROWID,大多数记录的物理位置都变化。

这个过程的内部操作, 可以通过对Flashback Table做SQL Trace来进一步观察。通过Trace,我们不难发现,
Flashback Table实际是通过Flashback Query将表中数据进行了一次删除、插入操作,因此ROWID会发生变化。


2.Shrink Segment (减低表的高水位)

Shrink Segment能帮助我们压缩数据段、整理数据碎片、降低高水位,以提高性能、节省空间。它也同样要求开启ROW MOVEMENT。

select username, rowid from test_move;

delete from test_move where username = 'MYTBC';

--
这个时候 shrink space 会报10636错误

alter table test_move enable row movement;

alter table test_move shrink space;

select username, rowid from test_move;

我们可以看到在Shrink后,ROWID也变化了。从对其过程的Trace来看,Shrink对数据的改变不是通过SQL实现的,而是通过更底层的函数来实现的。


3.更新Partition Key

在更新记录中的Partition Key时,可能会导致该记录超出当前所在分区的范围,需要将其转移到其他对应分区上,因此要求开启ROW MOVEMENT。

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会报14402错误

alter table test_move enable row movement;

update test_move set owner='SYS' where owner='DEMO' and table_name='T_TEST';

这一操作产生影响的特殊之处在于这是个DML操作,是和online transaction密切相关。对于这样一个UPDATE,实际上分为3步:先从原有分区将数据删除;将原数据转移到新分区上;更新数据。
其影响就在于以下几个方面:
一个UPDATE被分解为DELET、INSERT、UPDATE三个操作,增加了性能负担。其中,DELETE的查询条件与原UPDATE的查询条件相同,新的UPDATE的查询条件是基于INSERT生成的新的ROWID;
相应的Redo Log、Undo Log会增加;
如果Update语句还涉及到了Local Index的字段的话,新、旧2个分区上的Local Index都要被更新。

还有一点,Row Movement会和域索引(Domain Index)产生冲突:如果表上定义了域索引,开启Row Movement就会失败;反之亦然。

相关文章推荐

关于row movement的一点应用

今天对一张创建了分区表的表进行updateca

关于alter table enable row movement的应用

1.      一般用于分区表,将row movement设置为enable,有可能发生行的物理移动,行的rowdi会变化,某一行更新时,如果更新的是分区列,并且更新后的列值不属于原来的这个分区,如果...

Oracle row movement

ROW MOVEMENT特性最初是在8i时引入的,其目的是提高分区表的灵活性,这一特性默认是关闭,只要使用一下3个功能才需要打开...

Goldengate常见错误处理方式

1.OGG-01296 WARNING OGG-01154 Oracle GoldenGate Delivery for Oracle, rep_hr.prm: SQL error 1403 m...

alter table table_name enable row movement

Row movement 从字面意思解释为行移动.默认情况下,oracle数据块中的一行其生命周期内是不会发生移动的,即其rowid不会发生改变. 但是在某些情景下,我们希望行的rowid可以发生...
  • joeadai
  • joeadai
  • 2015年02月16日 15:50
  • 2081

alter table XXX enable row movement引起无效对象

如果经常在表上执行DML操作,会造成数据库块中数据分布稀疏,浪费大量空间。同时也会影响全表扫描的性能,因为全表扫描需要访问更多的数据块。从oracle10g开始,表可以通过shrink来重组数据使数据...

oracle存储过程之insert的使用,含游标的使用

body部分: -- 获取指定计划的指定阶段的指定修改次数的计划类型编号和名称 by shiwei --变更阶段使用 procedure proc_sy_syjs_getAProChang...
  • swqqcs
  • swqqcs
  • 2013年01月17日 13:58
  • 1934

oracle汉字占用字节长度

今天调查一个数据库问题的时候,发现

Row Movement

  • 2012年10月23日 10:29
  • 16KB
  • 下载

Row Movement对系统的影响 实例

ROW MOVEMENT特性最初是在8i时引入的,其目的是提高分区表的灵活性——允许更新Partition Key。这一特性默认是关闭,只是在使用到一些特殊功能时会要求打开。除了之前提到的更新Part...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Oracle row movement
举报原因:
原因补充:

(最多只允许输入30个字)