代码改变世界

db file scattered read和sequential read.

2011-08-22 16:41  Tracy.  阅读(819)  评论(0编辑  收藏  举报

1. db file scattered read-DB 文件分散读取
这种情况通常显示与全表扫描相关的等待。
当数据库进行全表扫时,基于性能的考虑,数据会分散(scattered)读入Buffer Cache。如果这个等待事件比较显著,可能说明对于某些全表扫描的表,没有创建索引或者没有创建合适的索引,我们可能需要检查这些数据表已确定是否进行了正确的设置。
然而这个等待事件不一定意味着性能低下,在某些条件下Oracle 会主动使用全表扫描来替换索引扫描以提高性能,这和访问的数据量有关,在CBO 下Oracle 会进行更为智能的选择,在RBO 下Oracle 更倾向于使用索引。
因为全表扫描被置于LRU(Least Recently Used,最近最少适用)列表的冷端(cold end),对于频繁访问的较小的数据表,可以选择把他们Cache 到内存中,以避免反复读取。
当这个等待事件比较显著时,可以结合v$session_longops 动态性能视图来进行诊断,该视图中记录了长时间(运行时间超过6 秒的)运行的事物,可能很多是全表扫描操作(不管怎样,这部分信息都是值得我们注意的)。


2. db file sequential read-DB 文件顺序读取。
这一事件通常显示与单个数据块相关的读取操作(如索引读取)。
如果这个等待事件比较显著,可能表示在多表连接中,表的连接顺序存在问题,可能没有正确的使用驱动表;或者可能说明不加选择地进行索引。
在大多数情况下我们说,通过索引可以更为快速的获取记录,所以对于一个编码规范、调整良好的数据库,这个等待很大是很正常的。但是在很多情况下,使用索引并不是最佳的选择,比如读取较大表中大量的数据,全表扫描可能会明显快于索引扫描,所以在开发中我们就应该注意,对于这样的查询应该进行避免使用索引扫描。

db file scattered read一般是在一次性读取多个连续的BLOCK的时候,产生的等待事件。很多网友喜欢把这个事件和全表扫描划等号,这其实是不全面的。全表扫描一般来说会产生db file scattered read,但是全索引扫描,索引范围扫描也会产生db file scattered read。db file sequential read是数据库中最常见的等待事件,一个状态良好的系统,这个等待应该占比较高的比重,排在所有等待事件的第一位(没有什么业务的系统可能除外)。