建立索引 (Database Engine)

本主題描述主要的索引建立工作,並提供您在建立索引之前需考慮的實作與效能指導方針。

索引建立工作

下列工作是我們建議的建立索引策略:

  1. 設計索引。

    索引設計是重要的工作。索引設計包含決定要使用哪些資料行、選取索引類型 (例如,叢集或非叢集)、選取適當的索引選項以及決定檔案群組或資料分割配置位置。如需詳細資訊,請參閱<設計索引>。

  2. 決定最佳的建立方法。索引的建立方法如下:

    • 使用 CREATE TABLE 或 ALTER TABLE 在資料行上定義 PRIMARY KEY 或 UNIQUE 條件約束

      SQL Server Database Engine 會自動建立唯一的索引,以強制 PRIMARY KEY 或 UNIQUE 條件約束所需的唯一性。依預設,除非叢集索引已在於資料表內,或者您指定唯一的非叢集索引,否則會建立一個唯一的叢集索引來強制 PRIMARY KEY 條件約束。依預設,除非已明確指定唯一的叢集索引,且在資料表上沒有叢集索引,否則會建立唯一的非叢集索引來強制 UNIQUE 條件約束。

      也可以指定索引選項及索引位置、檔案群組或資料分割配置。

      以 PRIMARY KEY 或 UNIQUE 條件約束的一部份所建立的索引,將會自動指定與條件約束名稱相同的名稱。如需詳細資訊,請參閱<PRIMARY KEY 條件約束>與<UNIQUE 條件約束>。

    • 透過使用 CREATE INDEX 陳述式或 SQL Server Management Studio [物件總管] 中的 [新增索引] 對話方塊,來建立不依賴條件約束的索引。

      您必須指定索引所套用的索引、資料表及資料行的名稱。也可以指定索引選項及索引位置、檔案群組或資料分割配置。依預設,若是未指定叢集或唯一選項,則會建立非叢集、非唯一索引。若要建立篩選的索引,請使用選擇性 WHERE 子句。如需詳細資訊,請參閱<篩選索引設計指導方針>。

  3. 建立索引。

    不論是在空白資料表或是在包含資料的資料表上建立索引,都是必須考慮的重要因素。在空白資料表上建立索引,將使建立索引時不會有效能的隱含問題;不過,當資料加入資料表時,效能就會受到影響。

    在大型資料表上建立索引應謹慎計畫,以免資料庫效能降低。在大型資料表上建立索引的較佳方式是以叢集索引開始,然後建立非叢集索引。在現有資料表上建立索引時,請考慮將 ONLINE 選項設定為 ON。當設定為 ON 時,就不會持有長期資料表鎖定,可讓基礎資料表的查詢或更新能繼續。如需詳細資訊,請參閱<線上執行索引作業>。

實作考量

下表列出適用於叢集索引、非叢集索引、空間索引、篩選的索引及 XML 索引的最大值。除非有指定,否則限制將適用於所有的索引類型。

最大索引限制

其他資訊

每份資料表的叢集索引數

1

 

每份資料表的非叢集索引數

999

包含 PRIMARY KEY 或 UNIQUE 條件約束所建立的非索集索引和篩選的索引,但不包含 XML 索引。

每個資料表的 XML 索引

249

包含 xml 資料類型資料行上的主要及次要 XML 索引。

XML 資料類型資料行中的索引

每個資料表的空間索引

249

使用空間索引 (Database Engine)

每個索引的索引鍵資料行數目

16*

如果資料表也包含主要 XML 索引或是任何空間索引,就會將叢集索引限制為 15 個資料行。

索引鍵的大小上限.

索引鍵記錄大小

900 位元組*

不適用於 XML 索引或空間索引。

如果資料表要支援空間索引,索引鍵記錄大小的最大值為 895 個位元組。

索引鍵的大小上限.

*您可以包含索引中的非索引鍵之索引資料行,以避免非叢集索引的索引鍵資料行和記錄的大小限制。如需詳細資訊,請參閱<具有內含資料行的索引>。

資料類型

一般而言,資料表或檢視中的任何資料行都可以索引。下列資料表列出限制索引參與的資料類型。

資料類型

索引參與

其他資訊

CLR (使用者定義型別)

如果該類型支援二進位排序,就可以索引。

使用 CLR 使用者定義型別

大型物件 (LOB) 資料類型:image、ntext、text、varchar(max)、nvarchar(max)、varbinary(max) 以及 xml

無法做為索引鍵資料行。不過,XML 資料行可做為資料表上主要或次要 XML 索引的索引鍵資料行。

除了 image、ntext 以及 text 之外,可在非叢集索引中以無索引鍵 (內含) 資料行參與。

如果屬於計算資料行運算式的一部份,就可以參與。

具有內含資料行的索引

XML 資料類型資料行中的索引

計算資料行

可以索引。所包含的計算資料行還有那些定義為 CLR 使用者定義型別資料行的方法引動過程,只要方法標示為具有決定性即可。

從 LOB 資料類型所衍生的計算資料行可使用索引鍵或非索引鍵之索引資料行來編製索引,只要計算資料行的資料類型允許索引鍵資料行或非索引鍵之索引資料行即可。

在計算資料行上建立索引

Varchar 資料行發送非資料列

叢集索引的索引鍵無法包含 varchar 資料行,這些資料行在 ROW_OVERFLOW_DATA 配置單位中含有現有資料。如果在 varchar 資料行上建立叢集索引,而現有的資料是在 IN_ROW_DATA 配置單位中,則後續在資料行上進行插入或更新動作以發出非資料列將會失敗。

資料表與索引組織

超過 8 KB 的資料列溢位資料

geometry

可以使用多個空間索引來建立索引。

空間資料的類型

其他考慮

下列是建立索引的一些其他考量:

  • 如果您對該表格擁有 CONTROL 或 ALTER 權限,就可以建立索引。

  • 在建立時,會自動啟用索引以便於使用。您可以停用它,以移除索引的存取。如需詳細資訊,請參閱<停用索引>。

磁碟空間需求

儲存索引所需的磁碟空間量取決於下列因素:

  • 資料表中每個資料列的大小與每個頁面的資料列數。這會決定為建立索引而從磁碟讀取的資料頁個數。

  • 索引中的資料行和所用的資料類型。這會決定必須寫到磁碟的索引分頁個數。如需詳細資訊,請參閱<估計叢集索引的大小>與<估計非叢集索引的大小>。

  • 在索引建立過程中所需的暫存磁碟空間。如需詳細資訊,請參閱<決定索引的磁碟空間需求>。

效能考量因素

實際用來建立索引的時間大部份會因磁碟子系統而異。應考慮的重要因素如下:

  • 資料庫的復原模型。相較於完整復原,大量記錄復原模式在索引建立作業期間,提供較高的效能並可減少記錄檔空間的耗用。不過,大量記錄復原會降低時間點復原的彈性。如需詳細資訊,請參閱<選擇索引作業的復原模式>。

  • 用來儲存資料庫與交易記錄檔的 RAID (獨立磁碟容錯陣列) 層級。一般而言,使用等量配置的 RAID 層級將會有更好的 I/O 頻寬。

  • 磁碟陣列中的磁碟個數 (如果使用 RAID 的話)。陣列中的磁碟愈多就會依比例提高資料的傳送率。

  • 資料將儲存在執行中繼排序的地方。當 tempdb 是在使用者資料庫以外的磁碟組上時,使用 SORT_IN_TEMPDB 選項可減少建立索引所需的時間。如需詳細資訊,請參閱<建立 tempdb 與索引>。

  • 離線或線上建立索引。

    當離線建立索引時 (預設值),在基礎資料表上將持有獨佔鎖定,直到完成建立索引的交易為止。在建立索引時,使用者將無法存取資料表。

    除了 XML 和空間索引以外,您可以指定線上建立索引。當線上選項設定為 ON 時,就不會持有長期資料表鎖定,這將使建立索引時,讓基礎資料表的查詢或更新繼續。雖然我們建議在線上進行索引作業,不過您應該評估自己的環境和特定需求。離線執行索引作業可能會比較好。當您這麼做時,使用者在作業期間的存取將受到限制,但是作業會比較快完成且使用比較少的資源。如需詳細資訊,請參閱<線上執行索引作業>。

若要在建立資料表時建立 PRIMARY KEY 或 UNIQUE 條件約束

若要在現有的資料表上建立 PRIMARY KEY 或 UNIQUE 條件約束

若要建立索引