Sql-Server

聚集索引與非聚集索引

  • April 19, 2013

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)或連接要考慮,那麼您的關鍵列的順序可能是掃描或搜尋之間的決定因素。即使它被過濾,並且取決於您在索引中有多少數據,懲罰也可能是相當大的。

引用自:https://dba.stackexchange.com/questions/40467