标签:
CREATE NONCLUSTERED INDEX INDEX_NAME ON Person(Name,Age) SELECT Name,Age FROM Person WHERE Name = ‘欧琳琳‘
索引连接是索引交叉的特例,它将覆盖索引技术应用到索引交叉。如果没有单个覆盖查询的索引而存在多个索引一起可以覆盖该查询,SQL Server可以使用索引连接来完全满足查询而不需要转到基本表。
非聚集索引的连接实际上是非聚集索引的交叉的一种特例。使得多个非聚集索引交叉后可以覆盖所要查询的数据,从而使得从减少查询基本表变成了完全不用查询基本表。
--建立两个非聚集索引,一个在Name列,一个在INSiteId列 CREATE NONCLUSTERED INDEX INDEX_Name ON Person(Name) INCLUDE(Age) --索引还是刚才的索引,但是包含多一列 CREATE NONCLUSTERED INDEX INDEX_INSiteId ON Person(INSiteId) INCLUDE(Height) --同上 SELECT Name,Age,Height,INSiteId FROM Person WHERE INSiteId > 5155400 AND Name = ‘简单‘ --注意条件,索引连接刚好能覆盖所需数据,从而避免查找基本表
查看结果:
索引交叉和索引连接有什么区别呢?前面说到果,索引连接是索引交叉的特例。索引连接在交叉了之后,不用再转到基本表,少了一步书签查找。而索引交叉之后,还有一步书签查找转到基本表获得数据,因为索引交叉的返回列并不能完全符合SELECT的列。
过滤索引是使用过滤器的非聚集索引,这个过滤器基本上是一个WHERE子句,用来在可能没有很好选择性的一个或多个列上创建一个高选择性的关键字组。
例如,一个具有大量NULL值的列可能被存储为稀疏列来降低这些null值的开销。在这个列添加一个过滤索引将使你拥有在不是null的数据上的索引。
在下面的所使用的Person表中,Name列有超过50%是NULL值,执行查询:
SELECT Name,Age FROM Person WHERE Name IS NOT NULL
这是一个聚集表扫描,并没有有效地使用索引。
当我们建立非聚集索引,且加上过滤后:INCLUDE()是为了形成覆盖索引。
CREATE NONCLUSTERED INDEX INDEX_Name ON Person(Name) INCLUDE(Age) WHERE Name IS NOT NULL --过滤的索引上过滤掉NULL值的行
在我的数据库当中,建立索引,加不加过滤没太大区别(因为很遗憾,Name列基本上没有NULL的),但是当过滤条件IS NOT NULL能够过滤很多条数据的时候,这时过滤的作用才能够展示出来。如果过滤条件,能够筛选掉很多条数据,那么性能无疑会大有提升。
过滤索引再许多方面带来回报:
标签:
原文地址:http://www.cnblogs.com/liwenchaoCode/p/5833394.html