我正在創建一個篩選索引,以便WHERE篩選器包含完整的查詢條件。通過這樣的索引,似乎不需要關鍵列,儘管SQL需要我添加一列。例如,考慮表:哪些關鍵列用於包含WHERE子句的過濾索引?
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
)嗎?其中一個過濾器列,或兩者?
您是否嘗試查看針對沒有索引的表的查詢的執行計劃,以查看建議的索引方式? – Tanner
在測試了你的表並查看執行計劃之後,沒有建議任何索引,我懷疑這是因爲你沒有從位列索引中獲得很多好處。這個問題似乎支持了起來http://stackoverflow.com/questions/231125/should-i-index-a-bit-field-in-sql-server – Tanner
@坦納:我已經看過執行計劃。查詢優化器在索引中的行數小於表中行總數的情況下(預期方案)選擇索引。我的問題是關於如何優化索引的效率(大小,I/O)。 –