暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Index之创建带有包含列的索引

SQLServer爱好者 2021-04-29
624

名次解释:

    【覆盖查询】当索引包含查询引用的所有列时,它通常称为“覆盖查询”。

    【索引覆盖】如果返回的数据列就包含于索引的键值中,或者包含于索引的键值+聚集索引的键值中,那么就不会发生Bookup Lookup,因为找到索引项,就已经找到所需的数据了,没有必要再到数据行去找了。这种情况,叫做索引覆盖;

    【复合索引】和复合索引相对的就是单一索引了,就是索引只包含一个字段,所以复合索引就是包含两个或者多个字段的索引;

    【非键列】  键列就是在索引中所包含的列,当然非键列就是该索引之外的列了;

 

概述:

    在 SQL Server 2005 中,可以通过将非键列添加到非聚集索引的叶级别来扩展非聚集索引的功能。通过包含非键列,可以创建覆盖更多查询的非聚集索引。

    这是因为非键列具有下列优点:

• 它们可以是不允许作为索引键列的数据类型。

• 在计算索引键列数或索引键大小时,数据库引擎不考虑它们。 

 

    当查询中的所有列都作为键列或非键列包含在索引中时,带有包含性非键列的索引可以显著提高查询性能。这样可以实现性能提升,因为查询优化器可以在索引中找到所有列值;不访问表或聚集索引数据,从而减少磁盘 I/O 操作。

    比起复合索引是有性能上的提升的,因为索引的大小变小了;键列存储在索引的所有级别中,而非键列仅存储在叶级别中。

 

限制和局限

• 只能对非聚集索引定义非键列。 

除了 text、ntext 和 image 之外的所有数据类型都可以用作非键列。


【举个例子】

SELECT UserName,Password,RealName,Mobile,Age

FROM Users

WHERE UserName = XXX AND Age = XX


说明:

1.这是一个我们很常见的查询语句,我们如何提高查询效率呢?

2.首先我们来看看谓词,这条语句是通过UserName = XXX AND Age = XX作为条件的,那么我们就应该建立一个组合索引,也称为复合索引,注意索引中的键列的位置,先UserName后Age;

3.其实上面那个是一个非聚集索引,那我们就可以把Password,RealName,Mobile这三列作为索引包含列;

4.所以,最终就是建立一个以UserName 和 Age做为键列、Password,RealName,Mobile作为非键列的非聚集索引;

5.通常来说我们系统的用户表并不是很大,所以这样的优化起不了很明显的效果,如果有兴趣的可以使用大表进行性能测试;


创建脚本:

    CREATE NONCLUSTEREDINDEX IX_Users_Include

       ON Users(UserName, Age)

       INCLUDE(Password,RealName,Mobile)



文章转载自SQLServer爱好者,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论