关于ORA_ROWSCN 的一点研究

简介: 10g里为表新增加了一个伪列ORA_ROWSCN先来简单理解一下ORA_ROWSCN的实现原理。我们知道,每个Block在头部是记录了该block最近事务的SCN的,所以默认情况下,只需要从block头部直接获取这个值就可以了,不需要其他任何的开销。

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
                                                                     


 

目录
相关文章
|
Oracle 关系型数据库 数据库
ORA-00600 3020 ORA-10567案例
PlateSpin克隆复制出的Oracle数据库服务器,往往启动数据库实例都会遇到一些杂七杂八的问题。今天测试DR环境时又遇到了一个特殊场景,在此之前,我已经遇到了下面两起案例: ORA-00600: internal error code, arguments: [kcratr1_last...
1376 0
|
SQL Oracle 关系型数据库
|
存储 Oracle 关系型数据库
|
存储 Oracle 关系型数据库
|
SQL Oracle 关系型数据库