我的表中有可以为空的 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
列(我想,我可能会错误地阅读该计划)。
这样做是否可以购买或者是否有不同的方法可以加快查询速度,只关心列是否为空?
答案 0 :(得分:0)
DeletedDate
上的索引(在大多数情况下)仅在绝大多数行未被删除时才有用。为什么?因为如果删除了很多记录,那么几乎每个数据页都会同时删除和删除记录。
索引不会减少需要读取的页数。在这种情况下,扫描数据通常会更快。
一个主要的例外是聚簇索引,其中DeletedDate
是第一列(或从该列派生的删除标志)。在这种情况下,未删除的记录和已删除的记录几乎总是在不同的数据页上。因此,如果删除了5%的记录,您只需要读取大约5%的数据。
当然,聚集索引会产生开销。删除记录时,记录实际上会在数据库中移动 - 导致多次读/写操作并增加碎片的可能性。是否使用聚簇索引值得额外开销取决于您使用数据的方式,更新发生的频率以及其他类似因素。