基本介紹
聚集索引是一種索引,該索引中鍵值的邏輯順序決定了表中相應行的物理順序。
聚集索引也稱為聚簇索引(Clustered Index),聚類索引,簇集索引 。同樣,非聚集索引也稱為非聚簇索引,非聚類索引,非簇集索引。
聚集索引確定表中數據的物理順序。聚集索引類似於電話簿,按姓氏排列數據。由於聚集索引規定數據在表中的物理存儲順序,因此一個表只能包含一個聚集索引。但該索引可以包含多個列(組合索引),就像電話簿按姓氏和名字進行組織一樣。
聚集索引對於那些經常要搜尋範圍值的列特別有效。使用聚集索引找到包含第一個值的行後,便可以確保包含後續索引值的行在物理相鄰。例如,如果應用程式執行的一個查詢經常檢索某一日期範圍內的記錄,則使用聚集索引可以迅速找到包含開始日期的行,然後檢索表中所有相鄰的行,直到到達結束日期。這樣有助於提高此類查詢的性能。同樣,如果對從表中檢索的數據進行排序時經常要用到某一列,則可以將該表在該列上聚集(物理排序),避免每次查詢該列時都進行排序,從而節省成本。
當索引值唯一時,使用聚集索引查找特定的行也很有效率。例如,使用唯一雇員 ID 列 emp_id 查找特定雇員的最快速的方法,是在 emp_id 列上創建聚集索引或 PRIMARY KEY 約束。
適用情況
1、含有大量非重複值的列。
2、使用BETWEEN,>,>=,<或<=返回一個範圍值的列
3、被連續訪問的列
4、返回大型結果集的查詢
5、經常被使用連線或GROUP BY子句的查詢訪問的列
下面的表總結了何時使用聚集索引或非聚集索引:
動作描述 | 使用聚集索引 | 使用非聚集索引 |
列經常被分組排序 | 應 | 應 |
返回某範圍內的數據 | 應 | 不應 |
一個或極少不同值 | 不應 | 不應 |
小數目的不同值 | 應 | 不應 |
大數目的不同值 | 不應 | 應 |
頻繁更新的列 | 不應 | 應 |
外鍵列 | 應 | 應 |
主鍵列 | 應 | 應 |
頻繁修改索引列 | 不應 | 應 |
使用注意事項
注意事項 定義聚集索引鍵時使用的列越少越好,這一點很重要。如果定義了一個大型的聚集索引鍵,則同一個表上定義的任何非聚集索引都將增大許多,因為非聚集索引條目包含聚集鍵。當把 SQL 腳本保存到可用空間不足的磁碟上時,索引最佳化嚮導不返回錯誤。有關 Microsoft® SQL Server™ 2000 中如何實現非聚集索引的更多信息,請參見非聚集索引。
在分析過程中,索引最佳化嚮導會消耗相當多的 CPU 及記憶體資源。最好在生產伺服器的測試版上執行最佳化,而不要在生產伺服器上執行。此外,最好在另一台計算機上而非運行 SQL Server 的計算機上運行該嚮導。該嚮導不能用於在 SQL Server 6.5 版或更早版本的資料庫中選擇或創建索引及統計信息。
在創建聚集索引之前,應先了解您的數據是如何被訪問的。可考慮將聚集索引用於:
包含大量非重複值的列。使用下列運算符返回一個範圍值的查詢:BETWEEN、>、>=、< 和 <=。被連續訪問的列。返回大型結果集的查詢。經常被使用聯接或 GROUP BY 子句的查詢訪問的列;一般來說,這些是外鍵列。對 ORDER BY 或 GROUP BY 子句中指定的列進行索引,可以使 SQL Server 不必對數據進行排序,因為這些行已經排序。這樣可以提高查詢性能。OLTP類型的應用程式,這些程式要求進行非常快速的單行查找(一般通過主鍵)。應在主鍵上創建聚集索引。 聚集索引不適用於:
頻繁更改的列 這將導致整行移動,因為 SQL Server 必須按物理順序保留行中的數據值。這一點要特別注意,因為在大數據量事務處理系統中數據是易失的。寬鍵 來自聚集索引的鍵值由所有非聚集索引作為查找鍵使用,因此存儲在每個非聚集索引的葉條目內。