日期:2014-05-17  浏览次数:20607 次

MSSQL SERVER 覆盖索引和复合索引的区别
MSSQL SERVER  覆盖索引和复合索引的区别 ,如题,求大神指点

执行计划里面,出现的都是 INDEX SEEK。有点迷茫
------解决方案--------------------
联合索引和覆盖索引有很大的区别:
覆盖索引是查询的列可以直接通过索引提取,比如只查询主键的列!或者查询联合索引的所有列或者左边开始的部分列(注意有顺序的)
而联合索引并不一定只从索引中能获取到所有的数据,这个取决于你所查询的列。比如select * from table where ××××××;的方式就不太可能是覆盖索引。因此如果你查询的列能用到联合索引,且你查询的列都能通过联合索引获取,比如你只查询联合索引所在的列或者左边开始的部分列,这就相当于覆盖索引了。通常为了让查询能用到覆盖索引,就将要查询的多列数据设置成联合索引
------解决方案--------------------
引用:
MSSQL SERVER  覆盖索引和复合索引的区别 ,如题,求大神指点

执行计划里面,出现的都是 INDEX SEEK。有点迷茫


当select需检出的字段超过索引覆盖范围时,将大多数会造成RID Lookup操作(这个是要避免的)。
覆盖索引,使用空间换效率的方式,将所有字段进行索引处理。这样无论是where筛选或者是select 多字段处理,都会使用seek处理(当然表中行数,查询优化器认定seek比scan来的成本更低的情况下。

复合索引,个人认为就是轻量化的覆盖索引(节省空间考虑)。如果select where 设计字段均在复合索引范围内,那么完全覆盖也就没有必要了。 

------解决方案--------------------

1、这本书还没有中文译本,同时也证明,如果你不懂英文,你最少落后别人4年以上。还是学学吧。
2、看书名就知道是英文的拉。
3、2005技术内幕其中一本好像是那个什么性能的那本,听说译得非常烂,连书名都错了。所以还是英文比较准确。
4、我再简单说说覆盖索引,当你要查询的列,无论在where或者select中,如果某些列没有索引,这时2008会考虑选择性、数据分布等因素,提出建议让你创建一个覆盖索引,把涉及的列放到include里面。
------解决方案--------------------

1、覆盖索引的include 的列被更新时,不需要去重新维护索引。对于大表来说更新带来的索引维护成本很高
2、覆盖索引included columns 仅仅存储在索引的页级别,更高层次树中只存储键列,所以覆盖索引的存储空间更小,以便更快的搜索


------解决方案--------------------
俺是从一篇文章中理解覆盖索引的。。本身比较菜,不敢多少啥,把文章分享给你http://rdc.taobao.com/blog/cs/?p=406