聚集索引與非聚集索引的區別

使用聚集索引

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

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

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


聚集索引不適用於:

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

寬鍵 。來自聚集索引的鍵值由所有非聚集索引作爲查找鍵使用,因此存儲在每個非聚集索引的葉條目內。

使用非聚集索引

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

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


注意事項

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

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

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章