【概念】为什么有时全表扫描比通过索引扫描效率更高
来源:互联网 发布:淘宝抓绒衣 编辑:程序博客网 时间:2024/05/15 23:48
伟大的Oracle SQL优化器可以判断出在某些情况下,使用全表扫描比使用索引扫描能更快的得到数据结果。
有没有想过,她是怎么做到的呢?
背后的原理是什么呢?
举一个非常好理解的场景(scenario:通过索引读取表中20%的数据)解释一下这个有趣的概念:
假设一张表含有10万行数据--------100000行
我们要读取其中20%(2万)行数据----20000行
表中每行数据大小80字节----------80bytes
数据库中的数据块大小8K----------8000bytes
所以有以下结果:
每个数据块包含100行数据---------100行
这张表一共有1000个数据块--------1000块
上面列出了一系列浅显易懂的数据,我们挖掘一下这些数据后面的故事:
通过索引读取20000行数据 = 约20000个table access by rowid = 需要处理20000个块来执行这个查询
有没有想过,她是怎么做到的呢?
背后的原理是什么呢?
举一个非常好理解的场景(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://blog.itpub.net/519536/viewspace-612715/
补充:由于索引扫描后要利用索引中的指针去逐一访问记录,假设每个记录都使用索引访问,则读取磁盘的次数是查询包含的记录数T,而如果表扫描则读取磁盘的次数是存储记录的块数B,如果T>B 的话索引就没有优势了。对于大多数数据库来说,这个比例是10%(oracle,postgresql等),即先对结果数量估算,如果小于这个比例用索引,大于的话即直接表扫描。
可以参考《全表扫描和索引扫描的区别》http://blog.csdn.net/ystyaoshengting/article/details/41043969
0 0
- 【转】 【概念】为什么有时全表扫描比通过索引扫描效率更高
- 【概念】为什么有时全表扫描比通过索引扫描效率更高
- 什么时候全表扫描比使用索引扫描能更快?
- 有时 走索引 没有全表扫描快
- 表里有索引,为什么还都是全表扫描?
- 全表扫描 vs 索引
- 全表扫描和索引扫描的区别
- 数据库中的全表扫描和索引扫描
- 全表扫描和索引扫描的区别
- oracle 索引 避免全表扫描
- Oracle 索引 避免全表扫描
- mysql索引与全表扫描
- 前置++为什么比后置++效率更高?
- oracle 全扫描和索引扫描
- mysql 全表扫描、全索引扫描、索引覆盖(覆盖索引)
- 3.2.5 索引全扫描
- 获得全索引扫描对象
- 【索引】索引五种扫描方式至索引全扫描
- maven项目的org/codehaus/plexus/util/scanner问题
- Populating Next Right Pointers in Each Node II
- Ubuntu 给matlab创建快捷方式
- C++ OO设计原则
- 快速排序(quick sort)
- 【概念】为什么有时全表扫描比通过索引扫描效率更高
- Hexagon DSP的所有寄存器
- Android代码混淆
- 嵌入式C语言之---模块化编程
- 《深入理解计算机系统》第二章习题2_66
- 通过Id遍历标签
- POJ 2449 Remmarguts' Date【SPFA】【A*】
- Mysql:操作笔记
- java中接口的概念及使用(补充final修饰符的使用)