為給定表或視圖創建索引
只有表或視圖的所有者才能為表創建索引
表或視圖的所有者可以隨時創建索引
無論表中是否有數據
可以通過指定限定的數據庫名稱
為另一個數據庫中的表或視圖創建索引
語法
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
ON { table | view } ( column [ ASC | DESC ] [
n ] )
[ WITH < index_option > [
n] ]
[ ON filegroup ]
< index_option > ::=
{ PAD_INDEX |
FILLFACTOR = fillfactor |
IGNORE_DUP_KEY |
DROP_EXISTING |
STATISTICS_NORECOMPUTE |
SORT_IN_TEMPDB
}
參數
UNIQUE
為表或視圖創建唯一索引(不允許存在索引值相同的兩行)
視圖上的聚集索引必須是 UNIQUE 索引
在創建索引時
如果數據已存在
Microsoft® SQL Server
; 會檢查是否有重復值
並在每次使用 INSERT 或 UPDATE 語句添加數據時進行這種檢查
如果存在重復的鍵值
將取消 CREATE INDEX 語句
並返回錯誤信息
給出第一個重復值
當創建 UNIQUE 索引時
有多個 NULL 值被看作副本
如果存在唯一索引
那麼會產生重復鍵值的 UPDATE 或 INSERT 語句將回滾
SQL Server 將顯示錯誤信息
即使 UPDATE 或 INSERT 語句更改了許多行但只產生了一個重復值
也會出現這種情況
如果在有唯一索引並且指定了 IGNORE_DUP_KEY 子句情況下輸入數據
則只有違反 UNIQUE 索引的行才會失敗
在處理 UPDATE 語句時
IGNORE_DUP_KEY 不起作用
SQL Server 不允許為已經包含重復值的列創建唯一索引
無論是否設置了 IGNORE_DUP_KEY
如果嘗試這樣做
SQL Server 會顯示錯誤信息
重復值必須先刪除
才能為這些列創建唯一索引
CLUSTERED
創建一個對象
其中行的物理排序與索引排序相同
並且聚集索引的最低一級(葉級)包含實際的數據行
一個表或視圖只允許同時有一個聚集索引
具有聚集索引的視圖稱為索引視圖
必須先為視圖創建唯一聚集索引
然後才能為該視圖定義其它索引
在創建任何非聚集索引之前創建聚集索引
創建聚集索引時重建表上現有的非聚集索引
如果沒有指定 CLUSTERED
則創建非聚集索引
說明 因為按照定義
聚集索引的葉級與其數據頁相同
所以創建聚集索引時使用 ON filegroup 子句實際上會將表從創建該表時所用的文件移到新的文件組中
在特定的文件組上創建表或索引之前
應確認哪些文件組可用並且有足夠的空間供索引使用
文件組的大小必須至少是整個表所需空間的
倍
這一點很重要
NONCLUSTERED
創建一個指定表的邏輯排序的對象
對於非聚集索引
行的物理排序獨立於索引排序
非聚集索引的葉級包含索引行
每個索引行均包含非聚集鍵值和一個或多個行定位器(指向包含該值的行)
如果表沒有聚集索引
行定位器就是行的磁盤地址
如果表有聚集索引
行定位器就是該行的聚集索引鍵
每個表最多可以有
個非聚集索引(無論這些非聚集索引的創建方式如何
是使用 PRIMARY KEY 和 UNIQUE 約束隱式創建
還是使用 CREATE INDEX 顯式創建)
每個索引均可以提供對數據的不同排序次序的訪問
對於索引視圖
只能為已經定義了聚集索引的視圖創建非聚集索引
因此
索引視圖中非聚集索引的行定位器一定是行的聚集鍵
index_name
是索引名
索引名在表或視圖中必須唯一
但在數據庫中不必唯一
索引名必須遵循標識符規則
table
包含要創建索引的列的表
可以選擇指定數據庫和表所有者
view
要建立索引的視圖的名稱
必須使用 SCHEMABINDING 定義視圖才能在視圖上創建索引
視圖定義也必須具有確定性
如果選擇列表中的所有表達式
WHERE 和 GROUP BY 子句都具有確定性
則視圖也具有確定性
而且
所有鍵列必須是精確的
只有視圖的非鍵列可能包含浮點表達式(使用 float 數據類型的表達式)
而且 float 表達式不能在視圖定義的其它任何位置使用
若要在確定性視圖中查找列
請使用 COLUMNPROPERTY 函數(IsDeterministic 屬性)
該函數的 IsPrecise 屬性可用來確定鍵列是否精確
必須先為視圖創建唯一的聚集索引
才能為該視圖創建非聚集索引
在 SQL Server 企業版或開發版中
查詢優化器可使用索引視圖加快查詢的執行速度
要使優化程序考慮將該視圖作為替換
並不需要在查詢中引用該視圖
在創建索引視圖或對參與索引視圖的表中的行進行操作時
有
個 SET 選項必須指派特定的值
SET 選項 ARITHABORT
CONCAT_NULL_YIELDS_NULL
QUOTED_IDENTIFIER
ANSI_NULLS
ANSI_PADDING 和 ANSI_WARNING 必須為 ON
SET 選項 NUMERIC_ROUNDABORT 必須為 OFF
如果與上述設置有所不同
對索引視圖所引用的任何表執行的數據修改語句 (INSERT
UPDATE
DELETE) 都將失敗
SQL Server 會顯示一條錯誤信息
列出所有違反設置要求的 SET 選項
此外
對於涉及索引視圖的 SELECT 語句
如果任何 SET 選項的值不是所需的值
則 SQL Server 在處理該 SELECT 語句時不考慮索引視圖替換
在受上述 SET 選項影響的情況中
這將確保查詢結果的正確性
如果應用程序使用 DB
Library 連接
則必須為服務器上的所有
個 SET 選項指派所需的值
(默認情況下
OLE DB 和 ODBC 連接已經正確設置了除 ARITHABORT 外所有需要的 SET 選項
)
如果並非所有上述 SET 選項均有所需的值
則某些操作(例如 BCP
復制或分布式查詢)可能無法對參與索引視圖的表執行更新
在大多數情況下
將 ARITHABORT 設置為 ON(通過服務器配置選項中的 user options)可以避免這一問題
強烈建議在服務器的任一數據庫中創建計算列上的第一個索引視圖或索引後
盡早在服務器范圍內將 ARITHABORT 用戶選項設置為 ON
有關索引視圖注意事項和限制的更多信息
請參見注釋部分
column
應用索引的列
指定兩個或多個列名
可為指定列的組合值創建組合索引
在 table 後的圓括號中列出組合索引中要包括的列(按排序優先級排列)
說明 由 ntext
text 或 image 數據類型組成的列不能指定為索引列
另外
視圖不能包括任何 text
ntext 或 image 列
即使在 CREATE INDEX 語句中沒有引用這些列
當兩列或多列作為一個單位搜索最好
或者許多查詢只引用索引中指定的列時
應使用組合索引
最多可以有
個列組合到一個組合索引中
組合索引中的所有列必須在同一個表中
組合索引值允許的最大大小為
字節
也就是說
組成組合索引的固定大小列的總長度不得超過
字節
有關組合索引中可變類型列的更多信息
請參見注釋部分
[ASC | DESC]
確定具體某個索引列的升序或降序排序方向
默認設置為 ASC
n
表示可以為特定索引指定多個 columns 的占位符
PAD_INDEX
指定索引中間級中每個頁(節點)上保持開放的空間
PAD_INDEX 選項只有在指定了 FILLFACTOR 時才有用
因為 PAD_INDEX 使用由 FILLFACTOR 所指定的百分比
默認情況下
給定中間級頁上的鍵集
SQL Server 將確保每個索引頁上的可用空間至少可以容納一個索引允許的最大行
如果為 FILLFACTOR 指定的百分比不夠大
無法容納一行
SQL Server 將在內部使用允許的最小值替代該百分比
說明 中間級索引頁上的行數永遠都不會小於兩行
無論 FILLFACTOR 的值有多小
FILLFACTOR = fillfactor
指定在 SQL Server 創建索引的過程中
各索引頁葉級的填滿程度
如果某個索引頁填滿
SQL Server 就必須花時間拆分該索引頁
以便為新行騰出空間
這需要很大的開銷
對於更新頻繁的表
選擇合適的 FILLFACTOR 值將比選擇不合適的 FILLFACTOR 值獲得更好的更新性能
FILLFACTOR 的原始值將在 sysindexes 中與索引一起存儲
如果指定了 FILLFACTOR
SQL Server 會向上捨入每頁要放置的行數
例如
發出 CREATE CLUSTERED INDEX
FILLFACTOR =
將創建一個 FILLFACTOR 為
% 的聚集索引
假設 SQL Server 計算出每頁空間的
% 為
行
SQL Server 將其向上捨入
這樣
每頁就放置
行
說明 顯式的 FILLFACTOR 設置只是在索引首次創建時應用
SQL Server 並不會動態保持頁上可用空間的指定百分比
用戶指定的 FILLFACTOR 值可以從
到
如果沒有指定值
默認值為
如果 FILLFACTOR 設置為
則只填滿葉級頁
可以通過執行 sp_configure 更改默認的 FILLFACTOR 設置
只有不會出現 INSERT 或 UPDATE 語句時(例如對只讀表)
才可以使用 FILLFACTOR
如果 FILLFACTOR 為
SQL Server 將創建葉級頁
% 填滿的索引
如果在創建 FILLFACTOR 為
% 的索引之後執行 INSERT 或 UPDATE
會對每次 INSERT 操作以及有可能每次 UPDATE 操作進行頁拆分
如果 FILLFACTOR 值較小(
除外)
就會使 SQL Server 創建葉級頁不完全填充的新索引
例如
如果已知某個表包含的數據只是該表最終要包含的數據的一小
From:http://tw.wingwit.com/Article/os/xtgl/201311/9018.html