共用方式為


叢集與非叢集索引

適用於:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric 中的 SQL 資料庫

索引是一種與資料表或檢視有關的磁碟內存結構,它會加快從該資料表或檢視中擷取資料列的速度。 索引中包含從資料表或檢視中一或多個資料行建出的索引鍵。 這些索引鍵儲存在結構 (B 型樹狀結構) 中,讓 SQL Server 可以快速有效地尋找與索引鍵值相關的一個或多個資料列。

Note

文件通常會使用「B 型樹狀結構」一詞來指稱索引。 在資料列存放區索引中,資料庫引擎會實作 B+ 樹狀結構。 這不適用於資料行存放區索引或經記憶體最佳化的資料表。 如需詳細資訊,請參閱《SQL Server 和 Azure SQL 索引架構和設計指南》。

資料表或檢視可包含下列類型的索引:

  • Clustered

    • 叢集索引將資料表或檢視中的資料列依其索引鍵值排序與儲存。 這些索引鍵值是包含在索引定義中的資料行。 因為資料列本身只能以一種順序排序,所以每個資料表只能有一個叢集索引。
    • 只有當資料表包含叢集索引時,資料表中的資料列才會以排序順序儲存。 當資料表有叢集索引時,資料表又稱為叢集資料表。 如果資料表沒有任何叢集索引,它的資料列就儲存在未排序的結構中,這個結構稱為堆積。
  • Nonclustered

    • 非叢集索引有一個與資料列完全分開的結構。 非叢集索引包含非叢集索引鍵值,而每個索引鍵值項目都有一個指標,指向包含索引鍵值的資料列。

    • 從非叢集索引中的索引列指向資料列的指標被稱為資料列定位器。 資料列定位器的結構須視資料頁儲存在堆積或叢集資料表而定。 若是堆積,資料列定位器是指向資料列的指標。 若是叢集資料表,資料列定位器就是叢集索引鍵。

    • 您可以將非索引鍵之資料行新增至非叢集索引的分葉層級中,以規避現有索引鍵的限制,並執行完全涵蓋的索引子查詢。 如需詳細資訊,請參閱建立內含資料行的索引。 如需索引鍵限制的詳細資料,請參閱 SQL Server 的最大容量規格

叢集與非叢集索引都可以是唯一的。 使用唯一索引時,任何兩個資料列的索引鍵都不能擁有相同的值。 否則,索引就不是唯一的,那麼多個資料列就可以共用同一個索引鍵值。 如需詳細資訊,請參閱 建立唯一索引

每當修改資料表的資料時,就會自動維護資料表或檢視的索引。

如需更多類型的特殊用途索引,請參閱索引

索引與條件約束

SQL Server 會在資料表的欄位上定義PRIMARY KEYUNIQUE約束時,自動建立索引。 例如,當您建立具有條件約束的資料 UNIQUE 表時,資料庫引擎會自動建立非叢集索引。 如果您設定 PRIMARY KEY,資料庫引擎會自動建立叢集索引,除非叢集索引已經存在。 當您嘗試對現有資料表強制執行 PRIMARY KEY 條件約束,且該資料表上已存在叢集索引時,SQL Server 會使用非叢集索引強制執行主索引鍵。

如需相關資訊,請參閱建立主索引鍵建立唯一的條件約束

查詢最佳化工具如何使用索引

設計精良的索引可以降低磁碟 I/O 操作並耗用較少的系統資源。 因此,這些索引可改善查詢效能。 索引對於包含 SELECTUPDATEDELETEMERGE 陳述式的各種查詢很有幫助。 請考慮在 SELECT JobTitle, HireDate FROM HumanResources.Employee WHERE BusinessEntityID = 250 資料庫中的 AdventureWorks2025 查詢。 當執行此查詢時,查詢最佳化工具會評估每個擷取資料的可用方法,並選取最有效的方法。 該方法可以是資料表掃描,或是掃描一或多個索引 (如果存在的話)。

在資料表掃描期間,查詢最佳化工具可以讀取資料表中的所有資料列,並擷取符合查詢條件的資料列。 資料表掃描將產生許多磁碟 I/O 作業,而且可能需要大量資源。 不過例如,如果查詢的結果集有很高的百分比是源自於資料表的資料列,則資料表掃描可能是最有效率的方法。

當查詢最佳化工具使用索引時,它會搜尋索引鍵資料行、尋找查詢所需的資料列之儲存位置,並從該位置擷取符合的資料列。 一般而言,搜尋索引的速度比搜尋資料表快得多。 與資料表不同,索引經常包含每個資料列的很少資料行,而且資料列會依排列順序顯示。

查詢最佳化工具在執行查詢時通常會選取最有效率的方法。 不過,如果沒有可用的索引,則查詢最佳化工具就必須使用資料表掃描。 您的工作是設計和建立最符合您環境的索引,因此查詢最佳化工具將會從要選取的索引中選取最有效率的索引。 SQL Server 提供了 Database Engine Tuning Advisor 來協助您分析資料庫環境並選取適當的索引。

Important

如需有關索引設計指南和本質的詳細資訊,請參閱《SQL Server 和 Azure SQL 索引結構和設計指南》。