简单地说, 聚焦索引和数据存储在一起, 决定表数据的物理存储顺序, 所以一个表只能有一个聚焦索引, 其叶子结点是数据行, 所以, 通过聚焦索引找到一条记录的时候, 这条记录相关的列的值也可以直接取出来
非聚焦索引单独存储, 如果查询的结果引用了非聚焦索引不包括的那些列, 那么非聚焦索引还需要通过行定位器去表中取该记录对应的列的数据, 这里面就有一个再次查找的问题
所以一般人会认为聚焦索引的效率会比非聚焦索引的效率高, 是基于非聚焦索引存在2次查找的问题
非聚焦索引的行定位器体现了聚焦索引与非聚焦索引之间的联系, 如果表中包含聚焦索引, 那么行定位器就是聚焦索引的值(如果聚焦索引不是唯一的, 则还包含一个附加的定位值), 如果表中没有聚焦索引, 那么行定位器是根据页ID之类的计算出来的一个值
因为通常我们对一个表的查询不是按照单一的模式(固定的查询条件), 而是有多种查询方式, 所以一个表上通常都会有好几个索引, 通过分析上面索引特性和索引之间的关系, 我们通常可以得出这样的索引使用结论:
1. 聚焦索引
   表中应该需要一个, 这样非聚焦索引可以通过聚焦索引有序的定位具体的数据(如果一个表中没有聚焦索引, 非聚焦索引的使用率通常会比较低)
   非聚焦索引应试具有唯一性, 长度尽量最小, 毕竟每个非聚焦索引中都包含聚焦索引值, 越小意味着非聚焦索引的存储开销越小, 而唯一可以确保记录定位时没有其他依赖
    聚焦索引的记录顺序,尽量保持与数据存储顺序一致, 这可以降低索引碎片的产生
2. 非聚焦索引
   这个主要考虑数据的选择性, 如果通过某个索引查询出来的满足条件的记录数, 占总记录数比较高的比例, 那么这个索引基本上是没有什么必要的(除非这个索引包含了查询所需的所有数据)
另外, 索引的目的是快速定位记录, 而T-SQL中, 需要定位的, 主要就是 WHERE 条件, 其他  JOIN 也有一定的需求, 所以需要为那些列建立索引, 通常是考虑那些列会出现在 WHERE 和 JOIN 中       

posted on 2013-04-22 15:03  代岳强  阅读(488)  评论(0编辑  收藏  举报