共用方式為


叢集索引和非叢集索引的介紹

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

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

  • 聚集

    • 叢集索引會根據其索引鍵值,排序並儲存數據表或檢視中的數據列。 這些是索引定義中包含的數據行。 每個數據表只能有一個叢集索引,因為數據列本身只能以一個順序排序。

    • 數據表中的數據列唯一以排序順序儲存的時間是當數據表包含叢集索引時。 當數據表具有叢集索引時,數據表稱為叢集數據表。 如果數據表沒有叢集索引,其數據列會儲存在稱為堆積的未排序結構中。

  • 非叢集

    • 非叢集索引的結構與數據列不同。 非叢集索引包含非叢集索引鍵值以及每個鍵值項目都有一個指針指向包含該鍵值的資料列。

    • 從非叢集索引中索引數據列到數據列的指標稱為數據列定位器。 數據列定位器的結構取決於數據頁是儲存在堆積還是叢集數據表中。 對於堆,列定位器是指向該列的指標。 針對叢集數據表,數據列定位器是叢集索引鍵。

    • 您可以將非索引鍵欄位新增至非叢集索引的分葉層級,來繞過現有的900個字節和16個索引鍵欄位的限制,並執行具有完整覆蓋的索引查詢。 如需詳細資訊,請參閱 建立內含資料行的索引

叢集與非叢集索引都可以是唯一的。 這表示索引鍵不能有兩個數據列相同的值。 否則,索引不是唯一的,而且多個數據列可以共用相同的索引鍵值。 如需詳細資訊,請參閱 建立唯一索引

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

如需了解其他種類的特殊用途索引,請參閱索引。

索引和條件約束

在數據表數據行上定義 PRIMARY KEY 和 UNIQUE 條件約束時,會自動建立索引。 例如,當您建立數據表並識別要成為主鍵的特定數據行時,Database Engine 會自動在該數據行上建立 PRIMARY KEY 條件約束和索引。 如需詳細資訊,請參閱 建立主鍵建立唯一條件約束

查詢優化器如何使用索引

設計良好的索引可以減少磁碟 I/O 作業,並耗用較少的系統資源,因此可改善查詢效能。 索引對於包含 SELECT、UPDATE、DELETE 或 MERGE 語句的各種查詢很有幫助。 請考慮資料庫AdventureWorks2012 中的查詢SELECT Title, HireDate FROM HumanResources.Employee WHERE EmployeeID = 250。 執行此查詢時,查詢優化器會評估每個可用的方法來擷取數據,並選取最有效率的方法。 方法可能是數據表掃描,或如果索引存在,則可能會掃描一或多個索引。

執行數據表掃描時,查詢優化器會讀取數據表中的所有數據列,並擷取符合查詢準則的數據列。 數據表掃描會產生許多磁碟 I/O 作業,而且可能需要大量資源。 不過,例如,如果查詢的結果集是數據表中高百分比的數據列,則數據表掃描可能是最有效率的方法。

當查詢優化器使用索引時,它會搜尋索引鍵數據行、尋找查詢所需的數據列儲存位置,並從該位置擷取相符的數據列。 一般而言,搜尋索引的速度比搜尋數據表快得多,因為與數據表不同,索引經常包含每個數據列的數據行很少,而且數據列依排序順序。

查詢優化器通常會在執行查詢時選取最有效率的方法。 不過,如果沒有可用的索引,查詢優化器必須使用數據表掃描。 您的工作是設計和建立最適合您環境的索引,讓查詢優化器有一系列有效率的索引可供選取。 SQL Server 提供 Database Engine Tuning Advisor ,協助您分析資料庫環境,以及選取適當的索引。

建立叢集索引

建立非叢集索引