全表扫描是从读取数据的同时通过where条件中的查询条件来过滤来筛选出满足条件的数据执行过程。其扫描的的对象是表中的所有数据块,包括空数据库,如果表中的数据大量被删除,那么就会存在大量的空数据块,再次状态下,大量的空数据块也被扫描。
在执行全表扫描时,按照顺序每次将多个数据块从磁盘读取到内存中。在通常情况下,由于数据块在磁盘的位置都是相互连接的,利用一次读取多个数据块的方法,不仅可以提高数据的读取效率,而且可以降低运输成本(把一个数据块读取到内存中所需要的成本)。
我们知道,对于数据量较小的表,全表扫描与索引扫描的损益分界点为15%,对于数据量比较大的数据表而言,损益分界点可能小于5%,对于存储海量数据的表而已,损益分界点可能小于1%。这里1%指通过索引扫描从表中读取1%的数据,也没有通过全表扫描来读取数据有效。磁盘技术不断飞速发展是出现这一现象的原因,尤其是磁盘缓存功能的不断加强使这一现象变的更加明显。我们从逻辑角度分写这一现象,索引扫描是按照随机的方式从表中读取数据,由于满足条件的数据行被分散存储在不同的数据块中,扫描这些数据时是通过磁头的移动来读取这些数据,而全表扫描只需要磁头顺序的扫描数据块将这些数据块内容读取到内存中,从而使得随机读取比顺去读取增加了数据读取时间。
尤其是并行读取数据的情况下,全表执行速度得到更大的提高,在这里需要注意的是在超大型数据表中查询数据时,尽量不要在满足查询条件的查询范围比较大的情况下使用索引。选择使用全表扫描的情况;
(1),在索引不存在的情况下使用全表扫描。
(2),大范围数据读取的情况。
(3),从少量表中读取数据。
(4),并行处理读书数据时。
二,索引扫描
从利用索引查询某个数据行的结果看,虽然显示的是以行为单位的数据,但实际I/O是以数据块为单位读取数据的,通过参考以读入内存中的数据块来查找满足条件的行。同样,查询优化器在计算成本时并不是以行为基准而是以数据块为基准的。另外影响索引读取效率的是聚簇因子(即索引行的顺去与表中数据存储行的顺序相似程度)。索引扫描类型:
(1),索引唯一扫描。
索引唯一扫描主要使用在检索唯一ROWID的查询中,为了进行索引唯一扫描必须基于主键创建主键索引,或者创建唯一索引,且在sql查询语句中必须使用\'=\'比较运算符。否则索引扫描不会使用唯一扫描,而会选择返回扫描。
(2),索引范围扫描。
索引返回扫描时索引扫描中最普遍的扫描方式,在使用索引范围扫描时分两种情况,即有开始值与结束值的情况和有一个以上的行但没有结束之的情况。通过该扫描方式所检索出来的行的顺序与索引的顺序相同,根据此原理可以忽略order by排序。索引范围扫描虽然在最开始为随机扫描,但之后的扫描全都是顺序扫描。在查询条件中使用=、<、<=、>=、>、between、like等比较运算符情况下选择索引范围扫描
(3),索引降序范围扫描。
索引降序范围扫描出了是按照降序从数据表读取数据之外,其他的部分与索引范围扫描相同。
(4),索引跳跃式扫描。
(5),索引全扫描。
(6),索引快速全扫描。