覆盖索引

摘自:SQL Server 查询性能优化——覆盖索引(一)

 

 

覆盖索引又可以称为索引覆盖。
  解释一: 就是select的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖。
  解释二: 索引是高效找到行的一个方法,当能通过检索索引就可以读取想要的数据,那就不需要再到数据表中读取行了。如果一个索引包含了(或覆盖了)满足查询语句中字段与条件的数据就叫做覆盖索引。
  解释三: 是非聚集组合索引的一种形式,它包括在查询里的SelectJoinWhere子句用到的所有列(即建立索引的字段正好是覆盖查询语句[select子句]与查询条件[Where子句]中所涉及的字段,也即,索引包含了查询正在查找的所有数据)。

 

首先,从聚集索引说起,聚集索引实际上就是一个覆盖索引,在大多数情况下,可以很直观地分辨出数据表的当前聚集索引是否有用,因为聚集索引根据键值字段控制了数据行的顺序。由于SQL SERVER以聚集索引的键值字段来排序数据行,所以当你经常需要对某些字段排序时,把这些要排序的字段作为聚集索引的键值,创建聚集索引将对查询性能会有很大的提升。因为数据已经照聚集索引的键值字段的顺序排序,所以查询执行时不需要额外的排序操作。同时如果使用聚集索引来查找同条记录的其他字段的数据,SQL SERVER也不需要额外地通过指针检索数据,因为在聚集索引找到索引键值的同时就已经找到整条数据。

聚集索引在检索符合某个范围的数据时也很有用。例如,你想要找到所有销售订单编号介于18000-19999的订单,而聚集索引就是通过销售订单编号字段建立的,相近的记录全部会摆放在一起,则访问的分页当然就比较少,通过聚集索引可快速定位包含起始销售订单编号的行,然后检索表中所有连续的行,直到检索到最后的销售订单号。

聚集索引在检索占总行数比例很大的数据行时也比较有用。

下图是使用聚集索引查找数据的示意图。

 

使用聚集索引的好处在于:

   1)所需要的数据都在子叶层(即数据页),找到正确的索引键值后不需要再利用指针做额外的查找

   2SQL SERVER将符合相同条件的数据集中放在一起

 

其次,非聚集索引。非聚集索引结构如下图。

 

如果想要使建立的非聚集索引同时具备以上两种好处,那就要建立非聚集覆盖索引。通过覆盖索引,所有查询想要的数据字段都是索引键值的一部分,而存放在索引的子叶层级。覆盖索引不仅仅只包含你写在WHERE条件内的字段,而且还包含所有SELECT 需要的字段,以及在GROUP BY ORDER BY 子句内的字段。

 

 

原文地址:https://www.cnblogs.com/drizzlewithwind/p/5707002.html