【转】 【概念】为什么有时全表扫描比通过索引扫描效率更高
2010-04-15 15:18
726 查看
【概念】为什么有时全表扫描比通过索引扫描效率更高
http://space.itpub.net/519536/viewspace-612715
伟大的Oracle SQL优化器可以判断出在某些情况下,使用全表扫描比使用索引扫描能更快的得到数据结果。
有没有想过,她是怎么做到的呢?
背后的原理是什么呢?
举一个非常好理解的场景(scenario:通过索引读取表中20%的数据)解释一下这个有趣的概念:
假设一张表含有10万行数据--------100000行
我们要读取其中20%(2万)行数据----20000行
表中每行数据大小80字节----------80bytes
数据库中的数据块大小8K----------8000bytes
所以有以下结果:
每个数据块包含100行数据---------100行
这张表一共有1000个数据块--------1000块
上面列出了一系列浅显易懂的数据,我们挖掘一下这些数据后面的故事:
通过索引读取20000行数据 = 约20000个table access by rowid = 需要处理20000个块来执行这个查询
但是,请大家注意:整个表只有1000个块!
所以:如果按照索引读取全部的数据的20%相当于将整张表平均读取了20次!!So,这种情况下直接读取整张表的效率会更高。很幸运,Oracle也是这么想的:)
-- The End --
http://space.itpub.net/519536/viewspace-612715
伟大的Oracle SQL优化器可以判断出在某些情况下,使用全表扫描比使用索引扫描能更快的得到数据结果。
有没有想过,她是怎么做到的呢?
背后的原理是什么呢?
举一个非常好理解的场景(scenario:通过索引读取表中20%的数据)解释一下这个有趣的概念:
假设一张表含有10万行数据--------100000行
我们要读取其中20%(2万)行数据----20000行
表中每行数据大小80字节----------80bytes
数据库中的数据块大小8K----------8000bytes
所以有以下结果:
每个数据块包含100行数据---------100行
这张表一共有1000个数据块--------1000块
上面列出了一系列浅显易懂的数据,我们挖掘一下这些数据后面的故事:
通过索引读取20000行数据 = 约20000个table access by rowid = 需要处理20000个块来执行这个查询
但是,请大家注意:整个表只有1000个块!
所以:如果按照索引读取全部的数据的20%相当于将整张表平均读取了20次!!So,这种情况下直接读取整张表的效率会更高。很幸运,Oracle也是这么想的:)
-- The End --
相关文章推荐
- 【概念】为什么有时全表扫描比通过索引扫描效率更高
- 为什么有时全表扫描比通过索引扫描效率更高 (转)
- 为什么有时全表扫描比通过索引扫描效率更高
- 写一条SQL,使它通过全表扫描方式的效率优于索引访问,分别给出各自的执行计划。
- Problem shooting:为什么有时在Android平台上通过代理网关访问HTTPS网站会出现连接失败
- (转)Oracle中通过位图索引提高查询效率
- 关于为什么保存Transform等引用效率会更高
- 为什么Oracle有时会用索引来查找数据?--强制Oracle使用最优的“执行计划”
- [Unity3D]关于为什么保存Transform等引用效率会更高
- 为什么有时Oracle数据库不用索引来查找数据?
- 天下数据浅谈如何通过IDC带来更高的效率
- Mysql语句执行效率检查和通过索引优化_实例
- Mysql为什么企业一般使用InnoDB引擎而不是使用效率更高的MyISAM引擎?
- 关于为什么保存Transform等引用效率会更高
- 为什么我的ArcSDE数据重建索引和分析(Analye)后反而效率更慢
- 为什么索引会提高效率
- 为什么有时Oracle 数据库不用索引来查找数据?
- Oracle中通过位图索引提高查询效率
- 前置++为什么比后置++效率更高?
- 为什么索引会提高效率