明明是全表扫描的SQL,为什么99%以上的等待时间是db file sequential read,即单块读?!多执行几次waitprof脚本,得到的结果是一致的(注意这里的数据,特别是平均等待时间并不一定是准确的值,这里重点关注的是等待时间的分布)。
那么SQL执行计划为全表扫描(或索引快速全扫描)的时候,在运行时会有哪些情况实际上是单块读?我目前能想到的有:
db_file_multiblock_read_count参数设置为1
表或索引的大部分块在buffer cache中,少量不连续的块在磁盘上。
一些特殊的块,比如段头
行链接的块
LOB列的索引块和cache的LOB块(虽然10046事件看不到lob索引和cache的lob的读等待,但客观上是存在的。)
那么在这条SQL语句产生的大量单块读,又是属于什么情况呢?我们来看看单块读更细节的情况:
SQL> @waitprof print 4038 e1 200000
% Total Total Event Distinct Avg time
SID STATE EVENT P1 Time Time ms Events ms/Event
------- ------- ------------------------ ------------------ ------------ ---------- ----------
4038 WAITING db file sequential read file#= 353 30.63 581.923 35 16.626
4038 WAITING db file sequential read file#= 355 28.14 534.641 40 13.366
4038 WAITING db file sequential read file#= 354 20.52 389.909 24 16.246
4038 WAITING db file sequential read file#= 3 19.63 372.942 35 10.655
4038 WORKING On CPU / runqueue .66 12.616 133 .095
4038 WAITING db file sequential read file#= 293 .42 7.971 1 7.971
多次执行同样的SQL,发现绝大部分的单块读发生在3、353-355这四个文件上,我们来看看这4个文件是什么:
SQL> select file_id,tablespace_name from dba_data_files where file_id in (355,3,353,354);
FILE_ID TABLESPACE_NAME
---------- ------------------------------
3 UNDOTBS1
353 UNDOTBS1
354 UNDOTBS1
355 UNDOTBS1
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-30053-2.html
1%