【发布时间】:2014-04-16 22:51:23
【问题描述】:
我正在创建一个过滤索引,以便 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)吗?过滤器列之一,还是两者都?
【问题讨论】:
-
您是否尝试过查看针对没有索引的表的查询的执行计划,以了解建议的索引方式?
-
在测试您的表并查看执行计划后,没有建议索引,我怀疑这是因为您没有从位列索引中获得太多好处。这个问题似乎支持stackoverflow.com/questions/231125/…
-
@Tanner:我查看了执行计划。查询优化器在索引中的行数与表中的总行数相比较小的条件下选择索引(预期场景)。我的问题是关于如何优化索引的效率(大小、I/O)。
标签: sql sql-server sqlperformance filtered-index