本主題說明了主要索引創(chuàng)建任務(wù),并提供了創(chuàng)建索引之前要了解的實(shí)現(xiàn)和執(zhí)行指南。

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

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

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

下面是創(chuàng)建索引時(shí)需要注意的一些其他事項(xiàng):
- 如果對(duì)表具有 CONTROL 或 ALTER 權(quán)限,則可以創(chuàng)建索引。
- 創(chuàng)建索引后,索引將自動(dòng)啟用并可以使用??梢酝ㄟ^禁用索引來刪除對(duì)該索引的訪問。有關(guān)詳細(xì)信息,請(qǐng)參閱禁用索引。

存儲(chǔ)索引所需的磁盤空間量取決于下列因素:
- 表中每個(gè)數(shù)據(jù)行的大小和每頁的行數(shù)。這將決定為創(chuàng)建索引而必須從磁盤讀取的數(shù)據(jù)頁數(shù)。
- 索引中的列數(shù)和使用的數(shù)據(jù)類型。這將決定必須寫入磁盤的索引頁數(shù)。有關(guān)詳細(xì)信息,請(qǐng)參閱估計(jì)聚集索引的大小和估計(jì)非聚集索引的大小。
- 索引創(chuàng)建過程中所需的臨時(shí)磁盤空間。有關(guān)詳細(xì)信息,請(qǐng)參閱確定索引的磁盤空間要求。

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