4

我正在使用SQL Server 2008 R2,并且我想在非唯一的可以为空的字段上添加非聚集索引。我的指数也将有一个更加列包括以避免访问我的群集索引:如何通过避免扫描空值来减少索引扫描

CREATE INDEX IX_My_Index 
ON MyTable (myBasicField) 
INCLUDE (myIncludedField); 

myBasicField实际数据会有很多NULLs,我想知道如果有一个方法可以让我增加性能通过不扫描这些NULLs,或阻止NULL值存储在我的索引上。

在此先感谢。

+0

我喜欢过滤的索引答案。这只是别的。你可以把这些数据放在一个带有FK关系的单独表中,然后你完全消除null(如果它是空的,那么在FK表中没有行)。如果两个都是聚簇索引,PK到FK的连接速度相当快。 – Paparazzi 2012-04-09 16:10:20

回答

6

有了SQL Server 2008和更新,你可以使用一个过滤指数。看到intro blog post here - 语法为:

CREATE INDEX IX_My_Index 
ON MyTable (myBasicField) 
INCLUDE (myIncludedField) 
WHERE myBasicField IS NOT NULL; 

包含相同WHERE子句可以利用这一点任何查询,该指数会小很多,因此有更好的表现,如果你排除这样的NULL值。

+0

+1如果用户查询的地方是myBasicField IS NULL,那么你会得到一个全表扫描? – Paparazzi 2012-04-09 14:26:26

+0

@Blam:可能 - 取决于您的查询中可能存在的其他条件。如果'myBasicField'为NULL,那么**这个**索引肯定不会被使用。 – 2012-04-09 14:28:59

+0

谢谢你们的快速回复。这就是我所需要的 – 2012-04-09 14:44:58