理论储备
- 聚集索引,数据是按顺序存储的,使用聚集索引查找到的数据就是数据物理存储的位置,聚集索引的叶子节点不仅包含了索引键,还包含了数据页。
- 非聚集索引,索引是完全独立于数据的,是在另外的索引页面中存放非聚集索引数据的,使用非聚集索引查找数据,除非这个非聚集索引已经包含了T-SQL查询需要返回的所有字段,不然索引就需要根据非聚集索引中叶子节点的书签Bookmarks定位到实际的数据页,才能返回所需要的字段值。
- 非聚集索引的物理结构,其叶子节点通常会保留数据行的唯一标识。唯一标识在聚集表中通常为主键值。下图就是非聚集索引的书签查找图。
sqlserver的图形执行计划的阅读方式是从右到左,从上到下。
sqlserver的优化器是基于开销来进行优化的,但是要开销如何得到呢?最主要的是统计信息得到。这样在预估选择什么算法关联时,要先知道处理的数据集大小,数据分布情况,索引是否存在等P73.
- 扫描 p247
- 聚集索引扫描
虽然有时聚集索引扫描和表扫描无异,但有时也会范围扫描。 - 非聚集索引扫描
这个比较简单,如果select表上的非聚集索引索引列,就可以看到 - 表扫描
出现表扫描,就证明这个表上没有聚集索引,有时优化器必须遍历全表来找到数据会用到。
- 查找
- 聚集索引查找
- 非聚集索引查找
- 书签查找
查找和扫描完全不同,扫描是要遍历整个B树,而查找可以通过B树的键值查找,直接提取数据,并返回结果。
误区
- 不管复合索引(多列组成一个索引)中的列的顺序怎样,查找行为都是一样。这是错误的。复合索引中最左边的一列有统计信息,其它列sqlserver不计算统计信息。这说明索引的列是有顺序的,而且非常主要P131.