Microsoft SQL Server 中的聚簇索引和非聚簇索引有何區別?
索引可幫助 SQL Server 快速從行中檢索數據。索引的作用類似於書籍開頭的目錄,使您可以快速查找主題所在的頁碼。如果沒有索引,SQL Server 必須掃描表中的所有行才能找到記錄。
SQL Server 中有兩種類型的索引:聚簇索引和非聚簇索引。了解聚簇索引和非聚簇索引之間的區別及其重要性。
SQL Server 中的聚簇索引
在聚集索引中,數據行基於鍵值以有序的方式物理存儲。由於索引包括表並且它只能按一種順序排列行,因此您只能為每個表創建一個聚簇索引。
雖然索引可以更快地檢索範圍內的行,但 INSERT 和 UPDATE 語句可能會很慢,因為查詢優化器會按順序掃描索引,直到找到目標索引。
SQL Server 中的非聚集索引
非聚集索引包含鍵值,其條目是稱為行定位器的指針。對於聚簇表(具有聚簇索引的表),指針指向聚簇索引中的鍵,而該鍵又指向表中的行。對於沒有聚簇索引的行,指針直接指向表行。
如何在 SQL Server 中創建聚簇索引
當您使用主鍵創建表時,SQL Server 會自動基於該主鍵創建聚簇索引鍵。如果沒有主鍵,可以執行如下語句創建聚簇索引鍵。
CREATE CLUSTERED INDEX <index name>
ON TABLE <table_name>(column_name)
在此語句中,您指定索引的名稱、創建它的表的名稱以及要在索引中使用的列名。
如果將主鍵添加到已經具有聚集索引的表中,SQL Server 將使用它創建一個非聚集索引。
要創建不包含主鍵列的聚集索引,您必須首先刪除主鍵約束。
USE database_name
ALTER TABLE table_name
DROP CONSTRAINT pk_name
GO
刪除主鍵約束也會刪除聚集索引,從而允許您創建自定義索引。
如何在 SQL Server 中創建非聚集索引
要創建非聚集索引,請使用以下語句。
CREATE INDEX <index name>
ON TABLE <table_name>(column_name)
您還可以像這樣使用 NONCLUSTERED 關鍵字:
CREATE [NONCLUSTERED] INDEX <index name>
ON TABLE <table_name>(column_name)
此語句在您指定的表中創建一個非聚集索引並包括您指定的列。
如果需要,您可以按升序 (ASC) 或降序 (DESC) 對列進行排序。
CREATE [NONCLUSTERED] INDEX <index name>
ON TABLE <table_name>(column_name ASC/DESC)
您應該選擇哪個指數?
聚簇索引和非聚簇索引都可以縮短查詢時間。如果您的大部分查詢是對錶中多個列的 SELECT 操作,則聚簇索引會更快。但是,對於 INSERT 或 UPDATE 操作,非聚集索引更快,因為查詢優化器可以直接從索引中定位列。
如您所見,這些索引最適用於不同的 SQL 查詢。因此,大多數 SQL 數據庫將受益於至少有一個聚集索引和定期更新的列的非聚集索引。
SQL Server 中索引的重要性
聚集和非聚集索引導致更高的查詢性能。運行查詢時,查詢優化器會掃描索引以查找行的存儲位置,然後從該位置檢索信息。這比掃描表中的所有行要快得多。
您還可以使用非聚集索引來解決書籤查找死鎖,方法是為查詢涉及訪問的列創建非聚集索引。
發佈留言