SQL Server索引中include的魅力[具有包含性列的索引]
开文之前首先要讲讲几个概念 【覆盖查询】 当索引包含查询引用的所有列时,它通常称为“覆盖查询”。 【索引覆盖】 如果返回的数据列就包含于索引的键值中,或者包含于索引的键值+聚集索引的键值中,那么就不会发生Bookup Lookup,因为找到索引项,就已经找到所需的数据了,没有必要再到数据行去找了。这种情况,叫做索引覆盖; 【复合索引】 和复合索引相对的就是单一索引了,就是索引只包含一个字段,所以复合索引就是包含两个或者多个字段的索引; 【非键列】 键列就是在索引中所包含的列,当然非键列就是该索引之外的列了; 下面就开始今天的主题 【摘要1】 在 SQL Server 2005 中,可以通过将非键列添加到非聚集索引的叶级别来扩展非聚集索引的功能。通过包含非键列,可以创建覆盖更多查询的非聚集索引。这是因为非键列具有下列优点: 说明:第一:只能是针对非聚集索引;第二:比起复合索引是有性能上的提升的,因为索引的大小变小了; 【摘要2】 键列存储在索引的所有级别中,而非键列仅存储在叶级别中。 说明:这就表现为包含与不包含的关系了。有关索引级别的详细信息,请参阅表组织和索引组织。 【摘要3】 使用包含性列以避免大小限制 说明:当你把一个nvarchar(500)的字段设置为主键的时候,你就可以看到不能超出900字节的提示了。一般来说我们是不太会做这些操作的,所以那个错误提示也是不常见的,也许你可能还见过。 一个数据页的大小才8k,所以我们合理的设置每个字段的大小,不要浪费太多的空间,这样对查询也是有好处的,这个include就比较好的的解决了索引和空间的问题,虽然那些include的数据也会占用空间。 虽然可以设置include,但是也尽量不要使用太多的字段作为索引包含的非键列。 【摘要4】 带有包含性列的索引准则 说明:include不能使用在聚集索引中。后面的两点,这个在实际中很难想象会有这样的需求要把重复列放到一个索引中。如果有朋友遇到过这样的需求可以告知一些,不胜感激。那如果有是否可以通过不同的列名(其实保存是同样的值)来解决这个问题呢?? 【摘要5】 列大小准则 说明:varchar(max)这样的定义是在2005之后才有的,所以这些数值也是对2005后的版本才生效的。 最大的表列数为:1024 最大非键列数为:1023 【摘要6】 修改已定义为包含性列的表列时,要受下列限制: 说明:这些细小的东西一直没有注意过。所以要记录下来,用来“防身”,呵呵。 【摘要7】 设计建议 说明:也就是说把常用的where后面的条件查询的字段作为索引的键列,而需要返回的字段就作为索引包含的非键列。 如果where的是两个或两个以上的谓词的话,这个索引就可以创建为复合索引了。以前天真的认为要返回的字段只能通过在复合索引中入这些字段,不管它是否会用来做谓词。看到这篇文章,才有了豁然开朗的感觉。 【摘要8】 USE AdventureWorks; 说明:这个是使用include的语法,在表的设计中的索引设计中是没有办法选择的; 【摘要9】 性能注意事项 说明:“这是因为列值被复制到了索引叶级别”这句很好的说明了物理上的存储结构和原理。 【图片解析】 上图也说明了为什么不能在聚集索引中建立具有包含性列的索引,因为非聚集索引的叶层是由索引页而不是由数据页组成,这就得说到聚集和非聚集索引的的物理存储了,聚集索引的顺序排序和存储就是基表的顺序和存储结构。 【一个例子】 SELECT UserName,Password,RealName,Mobile,Age FROM bw_Users WHERE UserName = XXX AND Age = XX 说明:
【其它】
官方解释:具有包含性列的索引 本文出处:http://gaizai.cnblogs.com/ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- SqlServer两个字段字符中字符是否包含比对。
- 全国省市区县最全最新数据表(数据来源谷歌)
- sql-server – 主键列上的非聚簇索引?
- char、varchar、nchar、nvarchar的区别
- distinct 多列问题结合group by的解决方法
- .net – 为什么Guid.ToString()会颠倒字节顺序?
- MSSQLSERVER数据库- 慎用SELECT INTO复制表
- Big impact when set property type in-properly
- sql-server – 使用一个数据库的多个应用程序?
- 设计模式 - Template Method Pattern(模板方法模式)