Oracle ORA_ROWSCN

今天看到一篇关于ORA_ROWSCN的文章,虽然简短,没有什么实例,但是已经把ORA_ROWSCN大概是怎么回事介绍清楚了。记录一下。

 

=================================================================================

 

默认的情况下,每个块中所有的记录的ORA_ROWSCN都是相同的,当块中任意一条记录发生改变的情况下,块中所有记录的ORA_ROWSCN都会变化为最新值,ORA_ROWSCN的最小粒度是块。
当我们使用create table …… rowdependencies;建表的时候,每条记录会有自己的ORA_ROWSCN段,在这种情况下块内的一条记录的更改仅仅会影响该记录的ORA_ROWSCN,不会对块内其他记录的ORA_ROWSCN产生影响。这个时候,ORA_ROWSCN的最小粒度是记录。
这个功能比较适合那些需要做增量刷新的操作,通过ORA_ROWSCN来迅速的找到那些发生变化的块,忽略那些没有发生变化的块,提高了刷新的效率。
写到这的时候,不知道大家有没有想另外的一个问题,那就是ORA_ROWSCN是怎么实现的,使用ORA_ROWSCN有什么注意的事项么?这是我们大家共同的一个问题,仅仅注意到一个功能积极的部分,很少想这个功能是否适合我,使用这个功能会给系统带来什么样子的风险,而往往风险才是我们需要更多考虑的地方。在数据库方面有一句话还是比较实在的,“无过便是功”。与系统的优化相比,系统的稳定则更加重要一些。
还是回到ORA_ROWSCN上来吧。
当我们没有开启rowdependencies的时候,块内的所有记录的ORA_ROWSCN都是一样的,可以猜想oracle会直接读取block head来获得ORA_ROWSCN,因为这样做的话效率会高一些,也更加的方便直接。事实上,oracle也是这样做的。所以在这种情况下,对于DML操作来说,并没有增加任何的开销,block head的scn是肯定要记录的。因此,在默认情况下,使用ORA_ROWSCN并不会带来任何的影响的。
那当我们开启了rowdependencies呢?这个时候块中的每条记录都会有自己的ORA_ROWSCN了,那肯定是在块中完整的记录下每条记录的scn号。这样就带了两个需要考虑的问题,空间上会存在浪费,这部分空间用来记录每条记录的scn。当记录的字段比较多,记录的长度比较长的时候可能影响的百分比会小一些,可是对于那些字段比较少的,记录的长度比较短的表影响将会是巨大的,空间的占用完全有可能增大100%以上。对时间上的浪费也很好理解,在表上的DML操作会更新一个字段,时间的浪费也就是必然的了。
上面的分析仅仅是抽象的,还需要一些测试数据的支持。有时间话,我会做一个测试,看看到底会对空间和时间有多大的影响。
在论坛上经常会有朋友问,深入的学习oracle到底有没有用?这句问题怎么回答呢,还是那句话,在时间允许的情况下深入学习oracle的肯定是有好处的;在时间不允许的情况下,就要“适度”了,这个度到底是怎么划分呢。拿上面的例子来说吧,如果能知道ORA_ROWSCN的产生原理就应该是足够了,这样经过简单的分析就可以知道ORA_ROWSCN的优点和缺点。
就写到这吧。

 

你可能感兴趣的:(oracle,数据库,优化,测试,table)