我正在创建一个过滤索引,以便 WHERE 过滤器包含完整的查询条件。有了这样的索引,似乎不需要键列,尽管 SQL 要求我添加一个。例如,考虑下表:
CREATE TABLE Invoice
(
Id INT NOT NULL IDENTITY PRIMARY KEY,
Data VARCHAR(MAX) NOT NULL,
IsProcessed BIT NOT NULL DEFAULT 0,
IsInvalidated BIT NOT NULL DEFAULT 0
)
表上的查询查找要处理的新发票,即:
SELECT *
FROM Invoice
WHERE IsProcessed = 0 AND IsInvalidated = 0
因此,我可以使用过滤索引调整这些查询:
CREATE INDEX IX_Invoice_IsProcessed_IsInvalidated
ON Invoice (IsProcessed)
WHERE (IsProcessed = 0 AND IsInvalidated = 0)
GO
我的问题:关键列应该IX_Invoice_IsProcessed_IsInvalidated
是什么?大概没有使用键列。我的直觉使我选择了一个较小的列,并使索引结构保持相对平坦。我应该选择表主键 ( Id
) 吗?过滤器列之一,还是两者都?