覆盖索引:是非聚集复合索引的一种形式,它包括在查询里的Select,Join和Where子句用到的所有列.因此,索引包含了查询正在查找的数据,SQLServer不必查找表的实际数据,减少了逻辑和(或)物理I/O,从而提升性能.
帮助确定一个覆盖索引是否有助于查询性能的一个方法是在SQLServer2005的企业管理器里为讨论的查询创建一个图形化的查询执行计划,看看是否执行了任何书签查找(Bookmark Lookup).本质上,书签查找告诉你查询处理器不得不从表或者聚集索引里查找需要的行列,而不是能直接从非聚集索引里读取.书签查找能降低查询性能因为它们产生了额外的磁盘I/O来返回列数据.
书签查找是从非聚集索引行到基表(或聚集索引)里的实际数据行的一个导航机制,并且当在处理大量行的时候开销很大.当查询要求很少的行时,SQLServer优化器试图使用列或包含在WHERE子句的列上的非聚集索引来返回查询需要的数据.如果查询从列上要求的数据不包含在非聚集索引里,SQLServer必须返回到包含那些列的数据的数据页.不论表是否有没有聚集索引,查询将仍然不得不返回到表或聚集索引去获取数据.
避免书签查找的一种方法是创建覆盖索引.这种方法查询的所有列都直接在非聚集索引里可用,这意味着书签查找是不必要的,这就减少了磁盘I/O,从而提升了你查询的性能.
矛盾:覆盖索引可以用来提升查询性能,因为索引包含了所有查询里的列.非聚集索引为表里的每一行用索引键值来存储一行.另外,SQLServer能使用索引页级里的这些行来执行聚集计算.这意味着SQLServer不必去实际的表执行聚集计算,这样可以提升性能.
虽然覆盖索引能提升获取数据的性能,但它们也能降低INSERT,UPDATE和DELETE查询的性能.这是因为维护覆盖索引要求做一些额外的工作.通常这不是问题,除非你的数据库经常遭受非常高的INSERT,UPDATE和DELETE.你也许不得不在你的产品系统上应用覆盖索引之前去实验看看它们是否在提升性能方面上比影响性能方面更有帮助.
虽然引入覆盖索引对性能问题既有积极也有消极的影响,正如上面讨论的,本文将着重讨论在SQLServer2005下运行查询时在下面的条件下找出将要发生的事:
没有任何索引的性能 有非聚集索引的性能 有覆盖索引的性能
结论:覆盖索引既有优势也有劣势.觉得优势是否超过劣势,执行覆盖索引对你特定需求是否是最好的,这是你作为DBA的工作.