在我的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])
因此,由于我的大多数查询都会检查已删除的标志,它们应该都是这样的吗?
答案 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