建立非叢集索引

您可以在資料表或索引檢視上建立多個非叢集索引。一般而言,建立非叢集索引是為了改善那些未包含在叢集索引中,但經常使用的查詢之效能。

一般實作

非叢集索引的實作方法如下:

  • PRIMARY KEY 和 UNIQUE 條件約束

    當您建立 PRIMARY KEY 條件約束時,如果資料表上的叢集索引尚未存在,而且您未並指定唯一的非叢集索引,則會在資料行上自動建立唯一的叢集索引。主索引鍵資料行不允許 NULL 值。

    當您建立 UNIQUE 條件約束時,依預設會建立唯一的非叢集索引,以強制 UNIQUE 條件約束。若資料表上還沒有叢集索引,您可以指定唯一叢集索引。如需詳細資訊,請參閱<PRIMARY KEY 條件約束>與<UNIQUE 條件約束>。

  • 獨立於條件限制之外的索引

    依預設,若是未指定叢集索引,則會建立非叢集索引。每個資料表可建立的最大非叢集索引數目是 999 個。這包含 PRIMARY KEY 或 UNIQUE 條件約束所建立的任何索引,但不包含 XML 索引。

  • 索引檢視上的非叢集索引

    在檢視上建立唯一的叢集索引後,就可以建立非叢集索引。如需詳細資訊,請參閱<建立索引檢視>。

內含資料行的索引

當您建立非叢集索引以涵蓋查詢時,您可以在索引定義中包含無索鍵資料行,以涵蓋查詢中未被做為主要搜尋資料行的資料行。由於查詢最佳化工具可以尋找索引中所有需要的資料行資料,且不會存取資料表或叢集索引,因此可以提升效能。如需詳細資訊,請參閱<具有內含資料行的索引>。

以篩選述詞建立索引

篩選索引是最佳化的非叢集索引,特別適合涵蓋從妥善定義的資料子集選取而來的查詢。篩選索引會使用篩選述詞對資料表中的部分資料列進行索引。與完整資料表索引相較,設計良好的篩選索引可以提升查詢效能、降低索引維護成本,並降低索引儲存成本。

如需詳細資訊,請參閱<篩選索引設計指導方針>。

磁碟空間需求

如需非叢集索引之磁碟空間需求的詳細資訊,請參閱<決定索引的磁碟空間需求>。

效能考量因素

雖然索引必須包含查詢所使用的所有資料行,但是請避免加入不必要的資料行。加入太多的索引資料行,不論是有索引鍵或無索引鍵,都可能造成下列效能的改變:

  • 由於磁碟 I/O 增加且快取效率降低,一頁上所能容納的索引資料列較少。

  • 必須有更多磁碟空間才能儲存索引。

  • 對基礎資料表或索引檢視表執行修改、插入、更新、刪除或合併時,可能會增加索引維護的時間。

您應該判斷查詢效能的提升,是否超越了資料修改期間對效能的影響以及額外磁碟空間需求的增加。如需評估查詢效能的詳細資訊,請參閱<查詢微調>。

當資料表資料具有定義良好之資料列子集的資料行 (如疏鬆資料行)、大多是 NULL 值的資料行、具有值類別的資料行以及有不同值範圍的資料行時,請考慮使用篩選索引來提高效能。如需詳細資訊,請參閱<篩選索引設計指導方針>。

若要在建立資料表時建立 PRIMARY KEY 或 UNIQUE 條件約束

CREATE TABLE (Transact-SQL)

若要在現有的資料表上建立 PRIMARY KEY 或 UNIQUE 條件約束

ALTER TABLE (Transact-SQL)

若要建立索引

CREATE INDEX (Transact-SQL)