创建一个索引计算列来检查空值能给我带来什么吗?
Does creating an indexed computed column to check for nulls buy me anything?
我的表中有可为空的 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
列(我想,我可能读错了计划)。
这样做有什么意义吗?或者是否有不同的方法可以加快只关心列是否为空的查询的速度?
DeletedDate
上的索引(在大多数情况下)只有在绝大多数行未被删除时才有用。为什么?因为如果删除了很多记录,那么几乎每个数据页都会有已删除和未删除的记录。
索引不会减少需要阅读的页数。在这种情况下,扫描数据通常会更快。
一个主要的例外是聚簇索引,其中 DeletedDate
是第一列(或从该列派生的删除标志)。在这种情况下,未删除的记录和删除的记录几乎总是在不同个数据页上。所以,如果删除了 5% 的记录,你只需要读取大约 5% 的数据。
当然,聚簇索引会产生开销。当一条记录被删除时,该记录实际上会在数据库中移动——导致多次 read/write 操作并增加碎片的可能性。使用聚簇索引是否值得额外开销取决于您如何使用数据、更新发生的频率以及其他类似因素。
我的表中有可为空的 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
列(我想,我可能读错了计划)。
这样做有什么意义吗?或者是否有不同的方法可以加快只关心列是否为空的查询的速度?
DeletedDate
上的索引(在大多数情况下)只有在绝大多数行未被删除时才有用。为什么?因为如果删除了很多记录,那么几乎每个数据页都会有已删除和未删除的记录。
索引不会减少需要阅读的页数。在这种情况下,扫描数据通常会更快。
一个主要的例外是聚簇索引,其中 DeletedDate
是第一列(或从该列派生的删除标志)。在这种情况下,未删除的记录和删除的记录几乎总是在不同个数据页上。所以,如果删除了 5% 的记录,你只需要读取大约 5% 的数据。
当然,聚簇索引会产生开销。当一条记录被删除时,该记录实际上会在数据库中移动——导致多次 read/write 操作并增加碎片的可能性。使用聚簇索引是否值得额外开销取决于您如何使用数据、更新发生的频率以及其他类似因素。