本主題說明了主要索引創(chuàng)建任務,并提供了創(chuàng)建索引之前要了解的實現(xiàn)和執(zhí)行指南。
索引創(chuàng)建任務
下列任務組成了創(chuàng)建索引的建議策略:
- 設計索引。
索引設計是一項關鍵任務。索引設計包括確定要使用的列,選擇索引類型(例如聚集或非聚集),選擇適當?shù)乃饕x項,以及確定文件組或分區(qū)方案布置。有關詳細信息,請參閱設計索引。
- 確定最佳的創(chuàng)建方法。按照以下方法創(chuàng)建索引:
- 使用 CREATE TABLE 或 ALTER TABLE 對列定義 PRIMARY KEY 或 UNIQUE 約束
SQL Server 2005 數(shù)據(jù)庫引擎?自動創(chuàng)建唯一索引來強制 PRIMARY KEY 或 UNIQUE 約束的唯一性要求。默認情況下,創(chuàng)建的唯一聚集索引可以強制 PRIMARY KEY 約束,除非表中已存在聚集索引或指定了唯一的非聚集索引。默認情況下,創(chuàng)建的唯一非聚集索引可以強制 UNIQUE 約束,除非已明確指定唯一的聚集索引且表中不存在聚集索引。
還可以指定索引選項和索引位置、文件組或分區(qū)方案。
創(chuàng)建為 PRIMARY KEY 或 UNIQUE 約束的一部分的索引將自動給定與約束名稱相同的名稱。有關詳細信息,請參閱PRIMARY KEY 約束和UNIQUE 約束。
- 使用 CREATE INDEX 語句或 SQL Server Management Studio 對象資源管理器中的“新建索引”對話框創(chuàng)建獨立于約束的索引
必須指定索引的名稱、表以及應用該索引的列。還可以指定索引選項和索引位置、文件組或分區(qū)方案。默認情況下,如果未指定聚集或唯一選項,將創(chuàng)建非聚集的非唯一索引。
- 創(chuàng)建索引。
要考慮的一個重要因素是對空表還是對包含數(shù)據(jù)的表創(chuàng)建索引。對空表創(chuàng)建索引在創(chuàng)建索引時不會對性能產(chǎn)生任何影響,而向表中添加數(shù)據(jù)時,會對性能產(chǎn)生影響。
對大型表創(chuàng)建索引時應仔細計劃,這樣才不會影響數(shù)據(jù)庫性能。對大型表創(chuàng)建索引的首選方法是先創(chuàng)建聚集索引,然后創(chuàng)建任何非聚集索引。在對現(xiàn)有表創(chuàng)建索引時,請考慮將 ONLINE 選項設置為 ON。該選項設置為 ON 時,將不持有長期表鎖以繼續(xù)對基礎表的查詢或更新。有關詳細信息,請參閱聯(lián)機執(zhí)行索引操作。
實現(xiàn)注意事項
下表列出了應用于聚集索引、非聚集索引和 XML 索引的最大值。除非另有指定,否則下列限制應用于所有索引類型。
最大索引限制 |
值 |
其他信息 |
每個表的聚集索引數(shù)
|
1
|
?
|
每個表的非聚集索引數(shù)
|
249
|
包括使用 PRIMARY KEY 或 UNIQUE 約束創(chuàng)建的非聚集索引,但不包括 XML 索引。
|
每個表的 XML 索引數(shù)
|
249
|
包括 XML 數(shù)據(jù)類型列的主 XML 索引和輔助 XML 索引。
xml 數(shù)據(jù)類型列的索引
|
每個索引的鍵列數(shù)
|
16*
|
索引鍵的最大大小.
如果表中還包含主 XML 索引,則聚集索引限制為 15 列。
|
最大索引鍵記錄大小
|
900 字節(jié)*
|
與 XML 索引無關。
索引鍵的最大大小.
|
* 通過在索引中包含非鍵列可以避免受非聚集索引的索引鍵列和記錄大小的限制。有關詳細信息,請參閱具有包含性列的索引。
數(shù)據(jù)類型
通常,可以對表或視圖中的任何列創(chuàng)建索引。下表列出了限制索引參與的數(shù)據(jù)類型。
數(shù)據(jù)類型 |
索引參與 |
其他信息 |
CLR 用戶定義類型
|
如果類型支持二進制順序,則可以進行索引。
|
使用 CLR 用戶定義類型
|
大型對象 (LOB) 數(shù)據(jù)類型:image、ntext、text、varchar(max)、nvarchar(max)、varbinary(max) 和 xml
|
不能作為索引鍵列。但是,xml 列可以作為表中的主 XML 索引或輔助 XML 索引的鍵列。
可以作為非鍵(包含性)列參與非聚集索引,image、ntext 和 text 除外。
如果是計算列表達式的一部分,則可以參與。
|
具有包含性列的索引
xml 數(shù)據(jù)類型列的索引
|
計算列
|
可以進行索引。這包括定義為 CLR 用戶定義類型列的方法調用的計算列,條件是方法被標記為確定性。
只要允許計算列數(shù)據(jù)類型作為索引鍵列或索引非鍵列,就可以將從 LOB 數(shù)據(jù)類型派生的計算列索引為鍵列或非鍵列。
|
為計算列創(chuàng)建索引
|
推送到行外的 Varchar 列
|
聚集索引的索引鍵不能包含在ROW_OVERFLOW_DATA 分配單元中具有現(xiàn)有數(shù)據(jù)的 varchar 列。如果對 varchar 列創(chuàng)建了聚集索引,并且在 IN_ROW_DATA 分配單元中存在現(xiàn)有數(shù)據(jù),則對該列執(zhí)行的將數(shù)據(jù)推送到行外的后續(xù)插入或更新操作將會失敗。
|
表組織和索引組織
行溢出數(shù)據(jù)超過 8 KB
|
其他注意事項
下面是創(chuàng)建索引時需要注意的一些其他事項:
- 如果對表具有 CONTROL 或 ALTER 權限,則可以創(chuàng)建索引。
- 創(chuàng)建索引后,索引將自動啟用并可以使用。可以通過禁用索引來刪除對該索引的訪問。有關詳細信息,請參閱禁用索引。
磁盤空間要求
存儲索引所需的磁盤空間量取決于下列因素:
- 表中每個數(shù)據(jù)行的大小和每頁的行數(shù)。這將決定為創(chuàng)建索引而必須從磁盤讀取的數(shù)據(jù)頁數(shù)。
- 索引中的列數(shù)和使用的數(shù)據(jù)類型。這將決定必須寫入磁盤的索引頁數(shù)。有關詳細信息,請參閱估計聚集索引的大小和估計非聚集索引的大小。
- 索引創(chuàng)建過程中所需的臨時磁盤空間。有關詳細信息,請參閱確定索引的磁盤空間要求。
性能注意事項
實際創(chuàng)建索引所需的時間在很大程度上取決于磁盤子系統(tǒng)。下面是需要考慮的重要因素:
- 數(shù)據(jù)庫的恢復模式。與完整恢復模式相比,大容量日志恢復模式的性能更高,并且減少了索引創(chuàng)建操作過程中占用的日志空間。但是,大容量日志恢復會降低時點恢復的靈活性。有關詳細信息,請參閱為索引操作選擇恢復模式。
- 用于存儲數(shù)據(jù)庫和事務日志文件的 RAID(獨立磁盤冗余陣列)級別。通常,使用條帶化的 RAID 級別將具有更好的 I/O 帶寬。
- 磁盤陣列中的磁盤數(shù)(如果使用了 RAID)。陣列中的驅動器越多就會按比例增加數(shù)據(jù)傳輸速率。
- 存儲數(shù)據(jù)中間排序進程的位置。tempdb 與用戶數(shù)據(jù)庫位于一組不同的磁盤上時,使用 SORT_IN_TEMPDB 選項可以減少創(chuàng)建索引所需的時間。有關詳細信息,請參閱 tempdb 和索引創(chuàng)建。
- 脫機或聯(lián)機創(chuàng)建索引。
脫機(默認設置)創(chuàng)建索引時,直到創(chuàng)建索引事務完成后,才釋放基礎表的排他鎖。在創(chuàng)建索引時,用戶不可以訪問表。
在 SQL Server 2005 中,可以指定聯(lián)機創(chuàng)建索引。聯(lián)機選項設置為 ON 時,在創(chuàng)建索引的過程中,將不持有長期表鎖以繼續(xù)對基礎表的查詢或更新。雖然建議聯(lián)機執(zhí)行索引操作,但您應該對環(huán)境和特定要求進行評估。脫機運行索引操作可能比較好。這樣做,用戶在操作過程中對數(shù)據(jù)具有有限的訪問權限,但操作會完成得更快且使用的資源更少。有關詳細信息,請參閱聯(lián)機執(zhí)行索引操作。
在創(chuàng)建表時創(chuàng)建 PRIMARY KEY 或 UNIQUE 約束
對現(xiàn)有表創(chuàng)建 PRIMARY KEY 或 UNIQUE 約束
創(chuàng)建索引