Microsoft SQL Server 中的聚簇索引和非聚簇索引有何區別?

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 中索引的重要性

聚集和非聚集索引導致更高的查詢性能。運行查詢時,查詢優化器會掃描索引以查找行的存儲位置,然後從該位置檢索信息。這比掃描表中的所有行要快得多。

您還可以使用非聚集索引來解決書籤查找死鎖,方法是為查詢涉及訪問的列創建非聚集索引。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *