10g里为表新增加了一个伪列ORA_ROWSCN
先来简单理解一下ORA_ROWSCN的实现原理。我们知道,每个Block在头部是记录了该block最近事务的SCN的,所以默认情况下,只需要从block头部直接获取这个值就可以了,不需要其他任何的开销。但是这是不精确的,一个block中会有很多行记录,每次事务不可能影响到整个block中所有的行,所以这是一个不精准的估算值,同一个block的所有记录ORA_ROWSCN都会是相同的,基本上没有多大的使用价值,
主要是这么几点:
1.默认情况,ora_rowscn记录的scn并不准确,记录的是block的scn。
2.创建表的时候ROWDEPENDENCIES可以来使ora_rowscn真正记录行一级的scn。
3.不能用在查询view时。
4.不能用于flashback query。
可以用来:
1.确认行所在块最后一次修改的scn
2.确认行所在块最后一次修改的大概时间
3.大部分的时候可以确定出两行记录创建的先后顺序(没在同一个块上)
4.如果CREATE TABLE ... ROWDEPENDENCIES 可以精确到行
实验如下:
SQL> create table t1 (id number,name varchar2(10));
表已创建。
SQL> insert into t1 values (1,'yang');
已创建 1 行。
SQL> commit;
提交完成。
SQL> insert into t1 values (2,'shen');
已创建 1 行。
SQL> commit;
提交完成。
SQL> select ora_rowscn ,id from t1ORA_ROWSCN ;
ORA_ROWSCN ID
---------- ----------
2767178 1
2767178 2
------查询ORA_ROWSCN ,在不同时间提交的事务,在这里具有相同的ORA_ROWSCN值。
再次插入后,查看ORA_ROWSCN 。
SQL> insert into t1 values (3,'yangyi');
已创建 1 行。
SQL> commit;
提交完成。
SQL> select ora_rowscn ,id from t1;---同时变化
ORA_ROWSCN ID
---------- ----------
2767205 1
2767205 2
2767205 3
SQL> update t1 set name='xiaonan' where id =3;---更新但不提交。ORA_ROWSCN 不变
已更新 1 行。
SQL> select ora_rowscn ,id from t1;
ORA_ROWSCN ID
---------- ----------
2767205 1
2767205 2
2767205 3
SQL> commit;-----提交后,ORA_ROWSCN 发生变化。
提交完成。
SQL> select ora_rowscn ,id from t1;
ORA_ROWSCN ID
---------- ----------
2767227 1
2767227 2
2767227 3
二 创建一个大表,使其占用多个数据块。
SQL> create table t2 (id number,name char(2000),des char(2000));
表已创建。
SQL> insert into t2 values (1,'a','a');
已创建 1 行。
SQL> insert into t2 values (2,'b','b');
已创建 1 行。
SQL> insert into t2 values (3,'c','c');
已创建 1 行。
SQL> insert into t2 values (4,'d','d');
已创建 1 行。
SQL> commit;-----------一起提交。
提交完成。
SQL> select ora_rowscn ,id from t2;
ORA_ROWSCN ID
---------- ----------
2767327 3
2767327 4
2767327 1
2767327 2 --查看ORA_ROWSCN的值都相同
SQL> update t2 set name='aa' where id=1;-----单独更新一行。
已更新 1 行。
SQL> select ora_rowscn ,id from t2;
ORA_ROWSCN ID
---------- ----------
2767327 3
2767327 4
2767327 1
2767327 2 ---未提交。
SQL> commit;
提交完成。
SQL> select ora_rowscn ,id from t2;
ORA_ROWSCN ID
---------- ----------
2767327 3
2767327 4
2767468 1
2767327 2
提交后,更新的行的ORA_ROWSCN的值发生改变,而其他的不变。
SQL> update t2 set name='bb' where id=2;---再次更新一行
已更新 1 行。
SQL> select ora_rowscn ,id from t2;
ORA_ROWSCN ID
---------- ----------
2767327 3
2767327 4
2767468 1
2767327 2
SQL> commit;----------提交并查看
提交完成。
SQL> select ora_rowscn ,id from t2;
ORA_ROWSCN ID
---------- ----------
2767327 3 --3,4 均为改变
2767327 4
2767468 1
2767484 2 --发生改变
SQL> analyze table t1 compute statistics;
表已分析。
SQL> select blocks from user_tables where table_name='T1';
BLOCKS
----------
5
SQL> analyze table t2 compute statistics;
表已分析。
SQL> select blocks from user_tables where table_name='T2';
BLOCKS
----------
5
由其原理可知 ORA_ROWSCN 是数据块级别的,一个数据块里的所有记录都是同一个 ORA_ROWSCN ,这个数据块里的任意一条记录被改变,整个数据块里的ORA_ROWSCN 都会发生改变。
三 使用rowdependencies参数。
SQL> create table t3 (id number,name varchar2(10)) rowdependencies;
表已创建。
SQL> insert into t3 values (1,'yang');
已创建 1 行。
SQL> commit;
提交完成。
SQL> insert into t3 values (2,'shen');
已创建 1 行。
SQL> commit;
提交完成。
ORA-00917: 缺失逗号
SQL> insert into t3 values (3,'xiaonan');
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from t3;
ID NAME
---------- ----------
1 yang
2 shen
3 xiaonan
SQL> insert into t3 values (4,'xiaonan');
已创建 1 行。
SQL> commit;
提交完成。
SQL> select ora_rowscn ,id from t3;
ORA_ROWSCN ID
---------- ----------
2768721 1
2768740 2
2768759 3
2768790 4
----每一行的ORA_ROWSCN 的值都不一样。
SQL> analyze table t3 compute statistics;
表已分析。
SQL> select blocks from user_tables where table_name='T3';
BLOCKS
----------
5