本主題說明了主要索引創建任務,并提供了創建索引之前要了解的實現和執行指南。

下列任務組成了創建索引的建議策略:
- 設計索引。
索引設計是一項關鍵任務。索引設計包括確定要使用的列,選擇索引類型(例如聚集或非聚集),選擇適當的索引選項,以及確定文件組或分區方案布置。有關詳細信息,請參閱設計索引。 - 確定最佳的創建方法。按照以下方法創建索引:
- 使用 CREATE TABLE 或 ALTER TABLE 對列定義 PRIMARY KEY 或 UNIQUE 約束
SQL Server 2005 數據庫引擎?自動創建唯一索引來強制 PRIMARY KEY 或 UNIQUE 約束的唯一性要求。默認情況下,創建的唯一聚集索引可以強制 PRIMARY KEY 約束,除非表中已存在聚集索引或指定了唯一的非聚集索引。默認情況下,創建的唯一非聚集索引可以強制 UNIQUE 約束,除非已明確指定唯一的聚集索引且表中不存在聚集索引。
還可以指定索引選項和索引位置、文件組或分區方案。
創建為 PRIMARY KEY 或 UNIQUE 約束的一部分的索引將自動給定與約束名稱相同的名稱。有關詳細信息,請參閱PRIMARY KEY 約束和UNIQUE 約束。 - 使用 CREATE INDEX 語句或 SQL Server Management Studio 對象資源管理器中的“新建索引”對話框創建獨立于約束的索引
必須指定索引的名稱、表以及應用該索引的列。還可以指定索引選項和索引位置、文件組或分區方案。默認情況下,如果未指定聚集或唯一選項,將創建非聚集的非唯一索引。
- 使用 CREATE TABLE 或 ALTER TABLE 對列定義 PRIMARY KEY 或 UNIQUE 約束
- 創建索引。
要考慮的一個重要因素是對空表還是對包含數據的表創建索引。對空表創建索引在創建索引時不會對性能產生任何影響,而向表中添加數據時,會對性能產生影響。
對大型表創建索引時應仔細計劃,這樣才不會影響數據庫性能。對大型表創建索引的首選方法是先創建聚集索引,然后創建任何非聚集索引。在對現有表創建索引時,請考慮將 ONLINE 選項設置為 ON。該選項設置為 ON 時,將不持有長期表鎖以繼續對基礎表的查詢或更新。有關詳細信息,請參閱聯機執行索引操作。

下表列出了應用于聚集索引、非聚集索引和 XML 索引的最大值。除非另有指定,否則下列限制應用于所有索引類型。
最大索引限制 | 值 | 其他信息 |
---|---|---|
每個表的聚集索引數 |
1 |
? |
每個表的非聚集索引數 |
249 |
包括使用 PRIMARY KEY 或 UNIQUE 約束創建的非聚集索引,但不包括 XML 索引。 |
每個表的 XML 索引數 |
249 |
包括 XML 數據類型列的主 XML 索引和輔助 XML 索引。 |
每個索引的鍵列數 |
16* |
如果表中還包含主 XML 索引,則聚集索引限制為 15 列。 |
最大索引鍵記錄大小 |
900 字節* |
與 XML 索引無關。 |
* 通過在索引中包含非鍵列可以避免受非聚集索引的索引鍵列和記錄大小的限制。有關詳細信息,請參閱具有包含性列的索引。

通常,可以對表或視圖中的任何列創建索引。下表列出了限制索引參與的數據類型。
數據類型 | 索引參與 | 其他信息 |
---|---|---|
CLR 用戶定義類型 |
如果類型支持二進制順序,則可以進行索引。 |
|
大型對象 (LOB) 數據類型:image、ntext、text、varchar(max)、nvarchar(max)、varbinary(max) 和 xml |
不能作為索引鍵列。但是,xml 列可以作為表中的主 XML 索引或輔助 XML 索引的鍵列。 可以作為非鍵(包含性)列參與非聚集索引,image、ntext 和 text 除外。 如果是計算列表達式的一部分,則可以參與。 |
|
計算列 |
可以進行索引。這包括定義為 CLR 用戶定義類型列的方法調用的計算列,條件是方法被標記為確定性。 只要允許計算列數據類型作為索引鍵列或索引非鍵列,就可以將從 LOB 數據類型派生的計算列索引為鍵列或非鍵列。 |
|
推送到行外的 Varchar 列 |
聚集索引的索引鍵不能包含在ROW_OVERFLOW_DATA 分配單元中具有現有數據的 varchar 列。如果對 varchar 列創建了聚集索引,并且在 IN_ROW_DATA 分配單元中存在現有數據,則對該列執行的將數據推送到行外的后續插入或更新操作將會失敗。 |
|

下面是創建索引時需要注意的一些其他事項:
- 如果對表具有 CONTROL 或 ALTER 權限,則可以創建索引。
- 創建索引后,索引將自動啟用并可以使用。可以通過禁用索引來刪除對該索引的訪問。有關詳細信息,請參閱禁用索引。

存儲索引所需的磁盤空間量取決于下列因素:
- 表中每個數據行的大小和每頁的行數。這將決定為創建索引而必須從磁盤讀取的數據頁數。
- 索引中的列數和使用的數據類型。這將決定必須寫入磁盤的索引頁數。有關詳細信息,請參閱估計聚集索引的大小和估計非聚集索引的大小。
- 索引創建過程中所需的臨時磁盤空間。有關詳細信息,請參閱確定索引的磁盤空間要求。

實際創建索引所需的時間在很大程度上取決于磁盤子系統。下面是需要考慮的重要因素:
- 數據庫的恢復模式。與完整恢復模式相比,大容量日志恢復模式的性能更高,并且減少了索引創建操作過程中占用的日志空間。但是,大容量日志恢復會降低時點恢復的靈活性。有關詳細信息,請參閱為索引操作選擇恢復模式。
- 用于存儲數據庫和事務日志文件的 RAID(獨立磁盤冗余陣列)級別。通常,使用條帶化的 RAID 級別將具有更好的 I/O 帶寬。
- 磁盤陣列中的磁盤數(如果使用了 RAID)。陣列中的驅動器越多就會按比例增加數據傳輸速率。
- 存儲數據中間排序進程的位置。tempdb 與用戶數據庫位于一組不同的磁盤上時,使用 SORT_IN_TEMPDB 選項可以減少創建索引所需的時間。有關詳細信息,請參閱 tempdb 和索引創建。
- 脫機或聯機創建索引。
脫機(默認設置)創建索引時,直到創建索引事務完成后,才釋放基礎表的排他鎖。在創建索引時,用戶不可以訪問表。
在 SQL Server 2005 中,可以指定聯機創建索引。聯機選項設置為 ON 時,在創建索引的過程中,將不持有長期表鎖以繼續對基礎表的查詢或更新。雖然建議聯機執行索引操作,但您應該對環境和特定要求進行評估。脫機運行索引操作可能比較好。這樣做,用戶在操作過程中對數據具有有限的訪問權限,但操作會完成得更快且使用的資源更少。有關詳細信息,請參閱聯機執行索引操作。