SQL Server 建立索引(index)

索引的簡介:html

索引分爲彙集索引和非彙集索引,數據庫中的索引相似於一本書的目錄,在一本書中經過目錄能夠快速找到你想要的信息,而不須要讀徹底書。數據庫

索引主要目的是提升了SQL Server系統的性能,加快數據的查詢速度與減小系統的響應時間 。性能

可是索引對於提升查詢性能也不是萬能的,也不是創建越多的索引就越好。索引建少了,用 WHERE 子句找數據效率低,不利於查找數據。索引建多了,不利於新增、修改和刪除等操做,由於作這些操做時,SQL SERVER 除了要更新數據表自己,還要連帶當即更新全部的相關索引,並且過多的索引也會浪費硬盤空間。spa

 

索引的分類:指針

索引就相似於中文字典前面的目錄,按照拼音或部首均可以很快的定位到所要查找的字。code

惟一索引(UNIQUE):每一行的索引值都是惟一的(建立了惟一約束,系統將自動建立惟一索引)htm

主鍵索引:當建立表時指定的主鍵列,會自動建立主鍵索引,而且擁有惟一的特性。blog

彙集索引(CLUSTERED):彙集索引就至關於使用字典的拼音查找,由於彙集索引存儲記錄是物理上連續存在的,即拼音 a 過了後面確定是 b 同樣。排序

非彙集索引(NONCLUSTERED):非彙集索引就至關於使用字典的部首查找,非彙集索引是邏輯上的連續,物理存儲並不連續。索引

PS:彙集索引一個表只能有一個,而非彙集索引一個表能夠存在多個。

 

什麼狀況下使用索引:

 

語法:

複製代碼
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name   
    ON <object> ( column_name [ ASC | DESC ] [ ,...n ] )   
    [ WITH <backward_compatible_index_option> [ ,...n ] ]  
    [ ON { filegroup_name | "default" } ]  
  
<object> ::=  
{  
    [ database_name. [ owner_name ] . | owner_name. ]   
    table_or_view_name  
}  
  
<backward_compatible_index_option> ::=  
{   
    PAD_INDEX  
  | FILLFACTOR = fillfactor  
  | SORT_IN_TEMPDB  
  | IGNORE_DUP_KEY  
  | STATISTICS_NORECOMPUTE   
  | DROP_EXISTING   
}  
複製代碼

參數:

UNIQUE:爲表或視圖建立惟一索引。 惟一索引不容許兩行具備相同的索引鍵值。 視圖的彙集索引必須惟一。若是要建惟一索引的列有重複值,必須先刪除重複值。

CLUSTERED:表示指定建立的索引爲彙集索引。建立索引時,鍵值的邏輯順序決定表中對應行的物理順序。 彙集索引的底層(或稱葉級別)包含該表的實際數據行。

NONCLUSTERED:表示指定建立的索引爲非彙集索引。建立一個指定表的邏輯排序的索引。 對於非彙集索引,數據行的物理排序獨立於索引排序。

index_name:表示指定所建立的索引的名稱。

database_name:表示指定的數據庫的名稱。

owner_name:表示指定全部者。

table:表示指定建立索引的表的名稱。

view:表示指定建立索引的視圖的名稱。

column:索引所基於的一列或多列。 指定兩個或多個列名,可爲指定列的組合值建立組合索引。

[ ASC | DESC]:表示指定特定索引列的升序或降序排序方向。 默認值爲 ASC。

on filegroup_name:爲指定文件組建立指定索引。 若是未指定位置且表或視圖還沒有分區,則索引將與基礎表或視圖使用相同的文件組。 該文件組必須已存在。

on default:爲默認文件組建立指定索引。

PAD_INDEX = {ON |OFF }:指定是否索引填充。默認爲 OFF。

  ON 經過指定的可用空間的百分比fillfactor應用於索引中間級別頁。

  OFF 或 fillfactor 未指定,考慮到中間級頁上的鍵集,將中間級頁填充到接近其容量的程度,以留出足夠的空間,使之至少可以容納索引的最大的一行。

  PAD_INDEX 選項只有在指定了 FILLFACTOR 時纔有用,由於 PAD_INDEX 使用由 FILLFACTOR 指定的百分比。

FILLFACTOR = fillfactor:用於指定在建立索引時,每一個索引頁的數據佔索引頁大小的百分比,fillfactor 的值爲1到100。

SORT_IN_TEMPDB = {ON |OFF }:用於指定建立索引時的中間排序結果將存儲在 tempdb 數據庫中。 默認爲 OFF。

  ON 用於生成索引的中間排序結果存儲在tempdb。 這可能會下降僅當建立索引所需的時間tempdb位於不一樣的與用戶數據庫的磁盤集。 

  OFF 中間排序結果與索引存儲在同一數據庫中。

IGNORE_DUP_KEY = {ON |OFF }:指定在插入操做嘗試向惟一索引插入重複鍵值時的錯誤響應。默認爲 OFF。

  ON 向惟一索引插入重複鍵值時將出現警告消息。 只有違反惟一性約束的行纔會失敗。

  OFF 向惟一索引插入重複鍵值時將出現錯誤消息。 整個 INSERT 操做將被回滾。

STATISTICS_NORECOMPUTE = {ON |OFF}:用於指定過時的索引統計是否自動從新計算。 默認爲 OFF。

  ON 不會自動從新計算過期的統計信息。

  OFF 啓用統計信息自動更新功能。

DROP_EXISTING = {ON |OFF }:表示若是這個索引還在表上就 drop 掉而後在 create 一個新的。 默認爲 OFF。

  ON 指定要刪除並從新生成現有索引,其必須具備相同名稱做爲參數 index_name。

  OFF 指定不刪除和從新生成現有的索引。 若是指定的索引名稱已經存在,SQL Server 將顯示一個錯誤。

ONLINE = {ON |OFF}:表示創建索引時是否容許正常訪問,便是否對錶進行鎖定。默認爲 OFF。

  ON 它將強制表對於通常的訪問保持有效,而且不建立任何阻止用戶使用索引和/表的鎖。

  OFF 對索引操做將對錶進行表鎖,以便對錶進行徹底和有效的訪問。

例子:

建立惟一彙集索引:

複製代碼
-- 建立惟一彙集索引
create unique clustered        --表示建立惟一彙集索引
index UQ_Clu_StuNo        --索引名稱
on Student(S_StuNo)        --數據表名稱(創建索引的列名)
with 
(
    pad_index=on,    --表示使用填充
    fillfactor=50,    --表示填充因子爲50%
    ignore_dup_key=on,    --表示向惟一索引插入重複值會忽略重複值
    statistics_norecompute=off    --表示啓用統計信息自動更新功能
)
複製代碼

建立惟一非彙集索引:

複製代碼
-- 建立惟一非彙集索引
create unique nonclustered        --表示建立惟一非彙集索引
index UQ_NonClu_StuNo        --索引名稱
on Student(S_StuNo)        --數據表名稱(創建索引的列名)
with 
(
    pad_index=on,    --表示使用填充
    fillfactor=50,    --表示填充因子爲50%
    ignore_dup_key=on,    --表示向惟一索引插入重複值會忽略重複值
    statistics_norecompute=off    --表示啓用統計信息自動更新功能
)
複製代碼
複製代碼
--建立彙集索引
create clustered index Clu_Index
on Student(S_StuNo)
with (drop_existing=on)    

--建立非彙集索引
create nonclustered index NonClu_Index
on Student(S_StuNo)
with (drop_existing=on)    

--建立惟一索引
create unique index NonClu_Index
on Student(S_StuNo)
with (drop_existing=on)    
複製代碼

PS:當 create index 時,若是未指定 clustered 和 nonclustered,那麼默認爲 nonclustered。

建立非彙集複合索引:

--建立非彙集複合索引
create nonclustered index Index_StuNo_SName
on Student(S_StuNo,S_Name)
with(drop_existing=on)
--建立非彙集複合索引,未指定默認爲非彙集索引
create index Index_StuNo_SName
on Student(S_StuNo,S_Name)
with(drop_existing=on)

在 CREATE INDEX 語句中使用 INCLUDE 子句,能夠在建立索引時定義包含的非鍵列(即覆蓋索引),其語法結構以下:

CREATE NONCLUSTERED INDEX 索引名
ON { 表名| 視圖名 } ( 列名 [ ASC | DESC ] [ ,...n ] )
INCLUDE (<列名1>, <列名2>, [,… n])
複製代碼
--建立非彙集覆蓋索引
create nonclustered index NonClu_Index
on Student(S_StuNo)
include (S_Name,S_Height)
with(drop_existing=on)

--建立非彙集覆蓋索引,未指定默認爲非彙集索引
create index NonClu_Index
on Student(S_StuNo)
include (S_Name,S_Height)
with(drop_existing=on)
複製代碼

PS:彙集索引不能建立包含非鍵列的索引。

建立篩選索引:

複製代碼
--建立非彙集篩選索引
create nonclustered index Index_StuNo_SName
on Student(S_StuNo)
where S_StuNo >= 001 and S_StuNo <= 020
with(drop_existing=on)

--建立非彙集篩選索引,未指定默認爲非彙集索引
create index Index_StuNo_SName
on Student(S_StuNo)
where S_StuNo >= 001 and S_StuNo <= 020
with(drop_existing=on)
複製代碼

修改索引:

--修改索引語法
ALTER INDEX { 索引名| ALL }
ON <表名|視圖名>
{ REBUILD  | DISABLE  | REORGANIZE }[ ; ]

REBUILD:表示指定從新生成索引。

DISABLE:表示指定將索引標記爲已禁用。

REORGANIZE:表示指定將從新組織的索引葉級。

--禁用名爲 NonClu_Index 的索引
alter index NonClu_Index on Student disable

刪除和查看索引:

複製代碼
--查看指定表 Student 中的索引
exec sp_helpindex Student    

--刪除指定表 Student 中名爲 Index_StuNo_SName 的索引
drop index Student.Index_StuNo_SName

--檢查表 Student 中索引 UQ_S_StuNo 的碎片信息
dbcc showcontig(Student,UQ_S_StuNo)

--整理 Test 數據庫中表 Student 的索引 UQ_S_StuNo 的碎片
dbcc indexdefrag(Test,Student,UQ_S_StuNo)

--更新表 Student 中的所有索引的統計信息
update statistics Student
複製代碼

 

索引定義原則:

避免對常常更新的表進行過多的索引,而且索引中的列儘量少。而對常常用於查詢的字段應該建立索引,但要避免添加沒必要要的字段。

在條件表達式中常常用到的、不一樣值較多的列上創建索引,在不一樣值少的列上不要創建索引。

在頻繁進行排序或分組(即進行 GROUP BY 或 ORDER BY 操做)的列上創建索引,若是待排序的列有多個,能夠在這些列上創建組合索引。

在選擇索引鍵時,儘量採用小數據類型的列做爲鍵以使每一個索引頁能容納儘量多的索引鍵和指針,經過這種方式,可以使一個查詢必需遍歷的索引頁面下降到最小,此外,儘量的使用整數作爲鍵值,由於整數的訪問速度最快。

 

參考:

http://www.cnblogs.com/knowledgesea/p/3672099.html

https://msdn.microsoft.com/zh-cn/library/ms188783.aspx

相關文章
相關標籤/搜索