|
|
原帖由 棉花糖ONE 于 2008-9-8 09:11 发表 ![]()
虽然你的那个最后是达到结果了,但是还是没想明白,order by rowid怎么会影响一个块里的行,还有一个问题就是,从你的hint上看也应该是hash join+full table scan+index fast full scan,正常的等待事件应该是sequential scan而非scatter scan
按照ROWID的结构,ROWID的顺序即是数据块的顺序,而CURSOR返回的记录的顺序即是更新的顺序,所以更新就会按数据块的物理顺序依次处理,即更新完一个数据块里的所有行,再更新下一个数据块的数据。这样一来,对于每个数据块,就只有第一行会产生物理读,其他的行,因为数据块已经在内存里了,就只都是逻辑读了。
按数据块的顺序更新可能还有另外一个好处,就是磁盘的顺序读写成本更小,因为磁头减少了磁头的寻道动作。对于单个磁盘肯定是这样,但对于做了条带的RAID是不是也有这个好处,就不清楚了。但有一点是肯定的,就是好的存储设备会根据顺序访问的规律做预读,即监测到顺序访问时,会提前把后续的数据块读入存储的缓存。
CURSOR上的HINT只对CURSOR里的SELECT其作用。从SQL TRACE文件看到的大量的db file sequential read事件是UPDATE语句等待的,不是SELECT语句等待的。
[ 本帖最后由 fromeast 于 2008-9-8 10:37 编辑 ] |
|