非叢集索引設計指導方針
非叢集索引包含了索引鍵值和可指向資料表資料的儲存位置之資料列定位器。如需非叢集索引架構的詳細資訊,請參閱<非叢集索引結構>。
您可以在資料表或索引檢視上建立多個非叢集索引。一般而言,應該將非叢集索引設計成可增進常用查詢 (叢集索引未涵蓋的查詢) 的效能。
如同您使用書中索引的方式一樣,查詢最佳化工具會先搜尋非叢集索引以找出資料值在資料表中的位置,然後再直接從該位置擷取資料,即可搜尋資料值。這讓非叢集索引成為執行完全符合的查詢之最佳選擇,因為此種索引所包含的項目會描述查詢中所要搜尋的資料值在資料表中的確定位置。例如,若要針對直屬特定經理的所有員工查詢 HumanResources.Employee 資料表,查詢最佳化工具可使用非叢集索引 IX_Employee_ManagerID,該索引會使用 ManagerID 作為其索引鍵資料行。查詢最佳化工具可以在索引中快速地找到符合指定 ManagerID 的所有項目。每個索引項目會指向資料表中正確的頁面和資料列,或指向可以找到對應資料的叢集索引。查詢最佳化工具在索引中找到所有項目之後,即可直接跳至正確的頁面和資料列以擷取資料。
資料庫注意事項
設計非叢集索引時,請考慮資料庫的特性。
更新需求較低但資料容量較大的資料庫或資料表,可以從許多非叢集索引中得到好處以增進查詢效能。請考慮針對定義完善的資料子集建立篩選的索引來提升查詢效能、降低索引儲存成本,並降低與完整資料表非叢集索引比較的索引維護成本。
包含主要唯讀資料的決策支援系統 (DSS) 應用程式和資料庫,可以從許多非叢集索引中得到好處。查詢最佳化工具有較多可供選擇的索引,因此可判斷最快的存取方法,而資料庫的低更新特性則表示索引維護不會降低效能。
包含大量已更新資料表的線上交易處理應用程式和資料庫應避免重複進行索引作業。此外,應該縮小索引的範圍,這表示應盡可能包含較少的資料行。
資料表中的索引數量過多會影響到 INSERT、UPDATE、DELETE 和 MERGE 陳述式的效能,因為只要資料表中的資料一變更,所有的索引也都必須隨著調整。
查詢注意事項
建立非叢集索引之前,應該先瞭解資料的存取方式。請考慮針對具有下列屬性的查詢使用非叢集索引:
使用 JOIN 或 GROUP BY 子句。
依據聯結和群組操作中用到的資料行,建立多個非叢集索引,並依據外部索引鍵資料行建立一個叢集索引。
不會傳回大量結果集的查詢。
建立篩選的索引,以涵蓋從大型資料表傳回定義完善之資料列子集的查詢。
包含會傳回完全相符項目的查詢 (例如 WHERE 子句) 中,所設定的搜尋條件常會用到的資料行。
資料行注意事項
考慮具有一或多個下列屬性的資料行:
涵蓋查詢。
當索引包含查詢中的所有資料行時,將可改善效能。查詢最佳化工具可以在索引中尋找所有資料行值;未被存取的資料表或叢集索引資料會導致磁碟 I/O 作業減少。使用內含資料行索引來新增涵蓋的資料行,而非建立廣泛的索引鍵。如需詳細資訊,請參閱<具有內含資料行的索引>。
如果資料表中具有叢集索引,則在叢集索引中定義的資料行會自動附加到資料表上每個非叢集索引的結尾。這樣會產生涵蓋的查詢,而不需要在非叢集索引的定義中指定叢集索引資料行。例如,如果資料表在資料行 C 上具有叢集索引,而在資料行 B 和 A 上具有非叢集索引,則其索引鍵值資料行為 B、A 和 C。
許多不同值的資料行,例如姓氏與名字的組合 (如果其他資料行使用叢集索引的話)。
如果只有很少量的不同值 (例如只有 1 和 0),則大多數的查詢都不會使用索引,因為資料表掃描通常會更有效率。如果是這種資料類型,請考慮針對只發生於少量資料列的相異值建立篩選的索引。例如,如果大多數的值為 0,則查詢最佳化工具可能會將篩選的索引用於包含 1 的資料列。