由ORA_ROWSCN想到的

在ORACLE10G中提供了一个新的功能,ORA_ROWSCN。ORACLE会在表中记录每条记录的最后的变化的SCN。
默认的情况下,每个块中所有的记录的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的优点和缺点。
就写到这吧。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值