创建索引计算列以检查空值是否会给我带来任何东西?

时间:2017-05-03 14:12:24

标签: sql sql-server sql-server-2008-r2 query-performance

我的表中有可以为空的 DeletedDate 列,每当我针对这些表编写查询时,我通常会检查以确保DeletedDate IS NULL。我的想法是,如果我创建一个名为 IsDeleted 的索引,持久,计算列,它可能会加快我的查询速度,因为它只需要检查单个位值而不是它会索引一系列的日期。

[IsDeleted] AS (isnull(CONVERT([bit],case when [DeletedDate] IS NULL then (0) else (1) end),(0))) PERSISTED NOT NULL,

但是,我查看了执行计划,它似乎仍然在查看DeletedDate列(我想,我可能会错误地阅读该计划)。

这样做是否可以购买或者是否有不同的方法可以加快查询速度,只关心列是否为空?

1 个答案:

答案 0 :(得分:0)

DeletedDate上的索引(在大多数情况下)仅在绝大多数行未被删除时才有用。为什么?因为如果删除了很多记录,那么几乎每个数据页都会同时删除和删除记录。

索引不会减少需要读取的页数。在这种情况下,扫描数据通常会更快。

一个主要的例外是聚簇索引,其中DeletedDate是第一列(或从该列派生的删除标志)。在这种情况下,未删除的记录和已删除的记录几乎总是在不同的数据页上。因此,如果删除了5%的记录,您只需要读取大约5%的数据。

当然,聚集索引会产生开销。删除记录时,记录实际上会在数据库中移动 - 导致多次读/写操作并增加碎片的可能性。是否使用聚簇索引值得额外开销取决于您使用数据的方式,更新发生的频率以及其他类似因素。