Sql-Server
聚集索引與非聚集索引
ID
我的數據庫目前在每個表的列上都有一個主鍵/聚集索引。但是,連接到數據庫的應用程序總是查看定義為:SELECT * FROM Table WHERE DeletedDate IS NULL
最好將它添加到聚集索引中,還是將非聚集索引作為包含
DeletedDate
的更好做法?DeletedDate
由於我們在談論聚集索引,僅僅因為您將 CI 鍵列定義為
ID
,您仍然擁有DeletedDate
索引的葉子數據頁中的數據。這就是聚集索引的本質:它是表數據。因為您通常有如下查詢:
select * from YourTable where DeletedDate is null;
您可能會從過濾索引中受益。
create nonclustered index IX_YourFilteredNci on YourTable(<Key Columns Here>) where DeletedDate is not null; go
我沒有在此處顯式放置關鍵列(以及通過使用
INCLUDE
子句的非關鍵列),因為您沒有發布表的 DDL。正如我在上面對您的問題的評論中一樣,關鍵列(不僅是列,還包括列的順序)的選擇在很大程度上取決於您的工作量和將使用該索引的典型查詢。
如果您希望覆蓋您的查詢,那麼您需要確保索引滿足查詢所需的所有數據。更不用說,如果您有其他
WHERE
子句(除了您的NULL
檢查DeletedDate
)或連接要考慮,那麼您的關鍵列的順序可能是掃描或搜尋之間的決定因素。即使它被過濾,並且取決於您在索引中有多少數據,懲罰也可能是相當大的。