使用聚集索引和非聚集索引的區別

kitesky發表於2009-12-25

使用聚集索引和非聚集索引的區別

  • 使用情景
  • 注意事項
  • 效能對比
[@more@]

使用聚集索引

聚集索引確定表中資料的物理順序。聚集索引類似於電話簿。由於聚集索引規定資料在表中的物理儲存順序,因此一個表只能包含一個聚集索引。但該索引可以包含多個列(組合索引),就像電話簿按姓氏和名字進行組織一樣。

聚集索引對於那些經常要搜尋範圍值的列特別有效。使用聚集索引找到包含第一個值的行後,便可以確保包含後續索引值的行在物理相鄰。避免每次查詢該列時都進行排序,從而節省成本。

注意事項
定義聚集索引鍵時使用的列越少越好。
• 包含大量非重複值的列。
• 使用下列運算子返回一個範圍值的查詢:BETWEEN、>、>=、< 和 <=。
• 被連續訪問的列。
• 返回大型結果集的查詢。
• 經常被使用聯接或 GROUP BY 子句的查詢訪問的列;一般來說,這些是外來鍵列。對 ORDER BY 或 GROUP BY 子句中指定的列進行索引,可以使
Server 不必對資料進行排序,因為這些行已經排序。這樣可以提高查詢效能。
• OLTP 型別的應用程式,這些程式要求進行非常快速的單行查詢(一般透過主鍵)。應在主鍵上建立聚集索引。


聚集索引不適用於:

• 頻繁更改的列 。這將導致整行移動(因為 SQL Server 必須按物理順序保留行中的資料值)。這一點要特別注意,因為在大資料量事務處理系統中資料是易失的。

• 寬鍵 。寬鍵是若干列或若干大型列的組合。所有非聚集索引將聚集索引中的鍵值用作查詢鍵。為同一表定義的任何非聚集索引都將增大許多,這是因為非聚集索引項包含聚集鍵,同時也包含為此非聚集索引定義的鍵列。

使用非聚集索引

非聚集索引與課本中的目錄類似。資料儲存在一個地方,索引儲存在另一個地方,索引帶有指標指向資料的儲存位置。索引中的專案按索引鍵值的順序儲存,而表中的資訊按另一種順序儲存(這可以由聚集索引規定)。如果在表中未建立聚集索引,則無法保證這些行具有任何特定的順序。

多個非聚集索引
有些書籍包含多個索引。例如,一本介紹園藝的書可能會包含一個植物通俗名稱索引,和一個植物學名索引,因為這是讀者查詢資訊的兩種最常用的方法。對於非聚集索引也是如此。可以為在表中查詢資料時常用的每個列建立一個非聚集索引。


注意事項

在建立非聚集索引之前,應先了解您的資料是如何被訪問的。可考慮將非聚集索引用於:
• 包含大量非重複值的列,如姓氏和名字的組合(如果聚集索引用於
列)。如果只有很少的非重複值,如只有 1 和 0,則大多數查詢將不使用索引,因為此時表掃描通常更有效。
• 不返回大型結果集的查詢。
• 返回精確匹配的查詢的搜尋條件(WHERE 子句)中經常使用的列。
• 經常需要聯接和分組的決策支援系統應用程式。應在聯接和分組操作中使用的列上建立多個非聚集索引,在任何外來鍵列上建立一個聚集索引。
• 在特定的查詢中覆蓋一個表中的所有列。這將完全消除對錶或聚集索引的訪問。

索引都是一種排序,只是聚集索引的排序和物理表中的資料排序相同,一致的;而非聚集索引的排序和物理表資料的排序不同。

當我們在更新統計資訊的時候,對於那些聚集索引列不但要更新索引頁還要同時對資料物理表資料重新排序;而對非聚集索引列則只需要更新索引頁。

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

相關文章