'Deleted'标志上应该有一个索引吗?



在我的SQL Server 2008 R2数据库中,我们使用软删除(一个可为null的DateTime列,称为"Deleted")。

这在我们数据库的每个表上。

我一直在添加索引,主要基于较大的表、WHERE子句中常用的列或JOIN ON子句。

不过,我的问题是,我是否也应该在所有这些索引中包括DELETED列,因为大多数时候,我可能会做一些类似的事情:

SELECT ....
FROM TableA a
INNER JOIN TableB b
ON b.TableAId = a.Id
AND b.Deleted IS NULL
WHERE a.AFieldId = x

在这种情况下,拥有这样的索引是否有益:

CREATE NONCLUSTERED INDEX idx_TableA
ON [dbo].[Tableb] (TableAId, [Deleted])

因此,由于我的大多数查询都检查已删除的标志,它们应该都是这样的吗?

您可以使用过滤后的索引缩小索引的大小:

CREATE NONCLUSTERED INDEX idx_TableA
ON [dbo].[Tableb] (TableAId)
WHERE ( [Deleted] IS NULL )

当然,最适用的指数几乎总是一个覆盖指数:

CREATE NONCLUSTERED INDEX idx_TableA
ON [dbo].[Tableb] (TableAId)
INCLUDE ( column list )
WHERE ( [Deleted] IS NULL )

参考号:创建索引

创建过滤索引

相关内容

最新更新