在我的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 )
参考号:创建索引
创建过滤索引