ITPub博客

首页 > 数据库 > Oracle > 关于索引的执行计划记载

关于索引的执行计划记载

原创 Oracle 作者:dotaddjj 时间:2011-10-26 22:50:44 0 删除 编辑

对于sql我们经常看见执行计划,刚好接触了资料自己就忍不住整理了一下。

1 全表扫描 full table scans FTS

全表扫描oracle需要读取表中所有行,然后检索合格条件的数据,而一次I/O读取数据块的多少则是由参数db_block_multiblock_read_count参数设定的,而不是只读取一个数据块,这极大的减少I/O总次数,提高系统吞吐量,一般全表扫描才使用多块读操作。

当然大表的全表扫描是很消耗资源的,除非取出数据比较多,大概超过数据的总量的5%-10%,或者使用并行查询。(其中在cbo优化器下 索引利用与否oracle可以更好的判断,而经常能做的是索引长时间运行后予以重建 优化查询速度)

不过对于上述的超过5%~10%比例个人测试并不一定,只是一般而且oracle会选择执行计划消耗最小的sql来执行,所以有时候是否利用索引和全表扫描在cbo中并不是绝对。

2 通过rowid的表读取 table access by rowid或rowid lookup(不过rowid lookep测试中没有发现此类执行计划)

使用rowid存取一次I/O只能读取一个数据块,和全表扫描多块读取不同,如通过索引查询数据时

select * from test05 where owner=upper('OUTLN')

SELECT STATEMENT, GOAL = RULE

TABLE ACCESS BY INDEX ROWID ASHUANG TEST05

INDEX RANGE SCAN ASHUANG INDEX_TEST05

表test05的owner有索引,可以看出应用索引用到索引叶块上记录的rowid读取

3 索引扫描index scan或index lookep索引查找(不过index lookep测试中没有发现此类执行计划)

利用索引大家都可能清楚了,这里提出利用索引查找数据,在索引中查找rowid和利用rowid查找具体的数据都是单独的I/O,所以对于where查找的条件的数据不是很多,很可能选择全表扫描。

还有提出一个唯一索引和非唯一索引的执行基本相同,有区别的是index unique scan是找到合适的值例如where x=’sys’后就停止查找,因为索引的列值唯一,而index range scan还会顺序继续查找。

还会可能存在

select owner from test05 where owner=upper('OUTLN')

SELECT STATEMENT, GOAL = RULE

INDEX RANGE SCAN ASHUANG INDEX_TEST05

此种情况,此时oracle只会扫描索引表而test05不会去扫描,因为owner关键字的值已经存储在索引中了。

其实索引是顺序的,里面已经按关键字进行了排序,如果能按关键字排序查找,也就避免了进一步排序操作。

除了上述的index unique scan和index range scan还有index full scan索引全扫描index fast full scan索引快速扫描

Index full scan

有全表扫描也就有全索引扫描,同样支持多块读取。

select owner from test05 order by owner

不过个人在测试中并没有出现上述索引全扫描的执行计划而是一个全表扫描的执行计划?

同样地索引快速扫描于index full scan类似只是少了一个对查询数据进行排序的过程,当然这种返回方式,可以使用多块读功能和并行读入,获得最大吞吐量提高性质效率。

select owner from test05

同上测试中还是没有发觉上述索引快速扫描的执行计划,还是一个全表扫描。

不过下面的sql

select count(owner) from test05

INDEX FAST FULL SCAN

却是一个索引快速扫描,看来自己的理解还远远不够。

[@more@]

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25362835/viewspace-1055970/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: concept方案对象-01
下一篇: 跳跃索引测试
请登录后发表评论 登录
全部评论
  • 博文量
    220
  • 访问量
    1662979