說明叢集和非叢集索引

適用于:SQL Server (所有支援的版本) Azure SQL Database Azure SQL 受控執行個體

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

注意

SQL Server檔使用 B 型樹狀結構一般參考索引一詞。 在資料列存放區索引中,SQL Server實作 B+ 樹狀結構。 這不適用於資料行存放區索引或記憶體內部資料存放區。 如需詳細資訊,請檢閱SQL Server索引架構和設計指南

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

  • 叢集

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

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

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

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

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

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

如需其他類型的特殊用途索引,請參閱 索引

索引與條件約束

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

如需詳細資訊,請參閱 建立主鍵建立唯一條件約束

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

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

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

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

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

重要事項

如需索引設計指導方針和本質的詳細資訊,請參閱 SQL Server 索引設計指南

下一步