SQL Server 2008 非聚集索引設計

iSQlServer發表於2008-12-18

非聚集索引包含索引鍵值和指向表資料儲存位置的行定位器。有關非聚集索引體系結構的詳細資訊,請參閱非聚集索引結構。

可以對錶或索引檢視建立多個非聚集索引。通常,設計非聚集索引是為改善經常使用的、沒有建立聚集索引的查詢的效能。

與使用書中索引的方式相似,查詢優化器在搜尋資料值時,先搜尋非聚集索引以找到資料值在表中的位置,然後直接從該位置檢索資料。這使非聚集索引成為完全匹配查詢的最佳選擇,因為索引包含說明查詢所搜尋的資料值在表中的精確位置的項。例如,為了從 HumanResources.Employee 表中查詢向特定經理負責的所有僱員,查詢優化器可能使用非聚集索引 IX_Employee_ManagerID;它以 ManagerID 作為其鍵列。查詢優化器能快速找出索引中與指定 ManagerID 匹配的所有項。每個索引項都指向表或聚集索引中準確的頁和行,其中可以找到相應的資料。在查詢優化器在索引中找到所有項之後,它可以直接轉到準確的頁和行進行資料檢索。

 資料庫注意事項
設計非聚集索引時需要注意資料庫的特徵。

更新要求較低但包含大量資料的資料庫或表可以從許多非聚集索引中獲益從而改善查詢效能。與全表非聚集索引相比,考慮為定義完善的資料子集建立篩選索引可以提高查詢效能、降低索引儲存開銷並減少索引維護開銷。
決策支援系統應用程式和主要包含只讀資料的資料庫可以從許多非聚集索引中獲益。查詢優化器具有更多可供選擇的索引用來確定最快的訪問方法,並且資料庫的低更新特徵意味著索引維護不會降低效能。

聯機事務處理應用程式和包含大量更新表的資料庫應避免使用過多的索引。此外,索引應該是窄的,即列越少越好。
對錶編制大量索引會影響 INSERT、UPDATE、DELETE 和 MERGE 語句的效能,因為當表中的資料更改時,所有索引都須進行適當的調整。

 查詢注意事項
在建立非聚集索引之前,應先了解訪問資料的方式。考慮對具有以下屬性的查詢使用非聚集索引:

使用 JOIN 或 GROUP BY 子句。
應為聯接和分組操作中所涉及的列建立多個非聚集索引,為任何外來鍵列建立一個聚集索引。

不返回大型結果集的查詢。
建立篩選索引以覆蓋從大型表中返回定義完善的行子集的查詢。

包含經常包含在查詢的搜尋條件(例如返回完全匹配的 WHERE 子句)中的列。

 列注意事項
考慮具有以下一個或多個屬性的列:

覆蓋查詢。
當索引包含查詢中的所有列時,效能可以提升。查詢優化器可以找到索引內的所有列值;不會訪問表或聚集索引資料,這樣就減少了磁碟 I/O 操作。使用具有包含列的索引來新增覆蓋列,而不是建立寬索引鍵。有關詳細資訊,請參閱具有包含列的索引。
如果表有聚集索引,則該聚集索引中定義的列將自動追加到表上每個非聚集索引的末端。這可以生成覆蓋查詢,而不用在非聚集索引定義中指定聚集索引列。例如,如果一個表在 C 列上有聚集索引,則 B 和 A 列的非聚集索引將具有其自己的鍵值列 B、A 和 C。

大量非重複值,如姓氏和名字的組合(前提是聚集索引被用於其他列)。
如果只有很少的非重複值,例如僅有 1 和 0,則大多數查詢將不使用索引,因為此時表掃描通常更有效。對於這種型別的資料,應考慮對僅出現在少數行中的非重複值建立篩選索引。例如,如果大部分值都是 0,則查詢優化器可以對包含 1 的資料行使用篩選查詢。

 索引選項
在建立非聚集索引時,可以指定若干索引選項。要尤其注意以下選項:

FILLFACTOR

ONLINE

有關詳細資訊,請參閱設定索引選項。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-515886/,如需轉載,請註明出處,否則將追究法律責任。

相關文章