“删除”标志上是否应该有索引?

时间:2014-08-26 00:14:38

标签: sql sql-server indexing

在我的SQL Server 2008 R2数据库中,我们使用了Soft Deletes(一个可以为空的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])

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

1 个答案:

答案 0 :(得分:3)

您可以使用筛选索引缩小索引的大小:

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 )

参考:CREATE INDEX

Create Filtered Indexes