SQL Server 創(chuàng)建索引

索引的簡介

索引分為聚集索引和非聚集索引,數(shù)據(jù)庫中的索引類似于一本書的目錄,在一本書中通過目錄可以快速找到你想要的信息,而不需要讀完全書。

索引主要目的是提高了SQL Server系統(tǒng)的性能,加快數(shù)據(jù)的查詢速度與減少系統(tǒng)的響應(yīng)時(shí)間 。

但是索引對(duì)于提高查詢性能也不是萬能的,也不是建立越多的索引就越好。索引建少了,用 WHERE 子句找數(shù)據(jù)效率低,不利于查找數(shù)據(jù)。索引建多了,不利于新增、修改和刪除等操作,因?yàn)樽鲞@些操作時(shí),SQL SERVER 除了要更新數(shù)據(jù)表本身,還要連帶立即更新所有的相關(guān)索引,而且過多的索引也會(huì)浪費(fèi)硬盤空間。

索引的分類

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

唯一索引(UNIQUE):每一行的索引值都是唯一的(創(chuàng)建了唯一約束,系統(tǒng)將自動(dòng)創(chuàng)建唯一索引)

主鍵索引:當(dāng)創(chuàng)建表時(shí)指定的主鍵列,會(huì)自動(dòng)創(chuàng)建主鍵索引,并且擁有唯一的特性。

聚集索引(CLUSTERED):聚集索引就相當(dāng)于使用字典的拼音查找,因?yàn)榫奂饕鎯?chǔ)記錄是物理上連續(xù)存在的,即拼音 a 過了后面肯定是 b 一樣。

非聚集索引(NONCLUSTERED):非聚集索引就相當(dāng)于使用字典的部首查找,非聚集索引是邏輯上的連續(xù),物理存儲(chǔ)并不連續(xù)。

PS:聚集索引一個(gè)表只能有一個(gè),而非聚集索引一個(gè)表可以存在多個(gè)。

什么情況下使用索引

索引通常需要添加到需要頻繁where,group by,order by以及between的列后.根據(jù)不同的數(shù)值分布與相關(guān)查詢需求可以分為以下幾種常見的情況


在這里插入圖片描述

添加索引語法

添加全部語法參數(shù)如下:

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   
}  

其中參數(shù):

UNIQUE:為表或視圖創(chuàng)建唯一索引。 唯一索引不允許兩行具有相同的索引鍵值。 視圖的聚集索引必須唯一。如果要建唯一索引的列有重復(fù)值,必須先刪除重復(fù)值。

CLUSTERED:表示指定創(chuàng)建的索引為聚集索引。創(chuàng)建索引時(shí),鍵值的邏輯順序決定表中對(duì)應(yīng)行的物理順序。 聚集索引的底層(或稱葉級(jí)別)包含該表的實(shí)際數(shù)據(jù)行。

NONCLUSTERED:表示指定創(chuàng)建的索引為非聚集索引。創(chuàng)建一個(gè)指定表的邏輯排序的索引。 對(duì)于非聚集索引,數(shù)據(jù)行的物理排序獨(dú)立于索引排序。

index_name:表示指定所創(chuàng)建的索引的名稱。

database_name:表示指定的數(shù)據(jù)庫的名稱。

owner_name:表示指定所有者。

table:表示指定創(chuàng)建索引的表的名稱。

view:表示指定創(chuàng)建索引的視圖的名稱。

column:索引所基于的一列或多列。 指定兩個(gè)或多個(gè)列名,可為指定列的組合值創(chuàng)建組合索引。

[ ASC | DESC]:表示指定特定索引列的升序或降序排序方向。 默認(rèn)值為 ASC。

on filegroup_name:為指定文件組創(chuàng)建指定索引。 如果未指定位置且表或視圖尚未分區(qū),則索引將與基礎(chǔ)表或視圖使用相同的文件組。 該文件組必須已存在。

on default:為默認(rèn)文件組創(chuàng)建指定索引。

PAD_INDEX = {ON |OFF }:指定是否索引填充。默認(rèn)為 OFF。

  ON 通過指定的可用空間的百分比fillfactor應(yīng)用于索引中間級(jí)別頁。

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

  PAD_INDEX 選項(xiàng)只有在指定了 FILLFACTOR 時(shí)才有用,因?yàn)?PAD_INDEX 使用由 FILLFACTOR 指定的百分比。

FILLFACTOR = fillfactor:用于指定在創(chuàng)建索引時(shí),每個(gè)索引頁的數(shù)據(jù)占索引頁大小的百分比,fillfactor 的值為1到100。

SORT_IN_TEMPDB = {ON |OFF }:用于指定創(chuàng)建索引時(shí)的中間排序結(jié)果將存儲(chǔ)在 tempdb 數(shù)據(jù)庫中。 默認(rèn)為 OFF。

  ON 用于生成索引的中間排序結(jié)果存儲(chǔ)在tempdb。 這可能會(huì)降低僅當(dāng)創(chuàng)建索引所需的時(shí)間tempdb位于不同的與用戶數(shù)據(jù)庫的磁盤集。 

  OFF 中間排序結(jié)果與索引存儲(chǔ)在同一數(shù)據(jù)庫中。

IGNORE_DUP_KEY = {ON |OFF }:指定在插入操作嘗試向唯一索引插入重復(fù)鍵值時(shí)的錯(cuò)誤響應(yīng)。默認(rèn)為 OFF。

  ON 向唯一索引插入重復(fù)鍵值時(shí)將出現(xiàn)警告消息。 只有違反唯一性約束的行才會(huì)失敗。

  OFF 向唯一索引插入重復(fù)鍵值時(shí)將出現(xiàn)錯(cuò)誤消息。 整個(gè) INSERT 操作將被回滾。

STATISTICS_NORECOMPUTE = {ON |OFF}:用于指定過期的索引統(tǒng)計(jì)是否自動(dòng)重新計(jì)算。 默認(rèn)為 OFF。

  ON 不會(huì)自動(dòng)重新計(jì)算過時(shí)的統(tǒng)計(jì)信息。

  OFF 啟用統(tǒng)計(jì)信息自動(dòng)更新功能。

DROP_EXISTING = {ON |OFF }:表示如果這個(gè)索引還在表上就 drop 掉然后在 create 一個(gè)新的。 默認(rèn)為 OFF。

  ON 指定要?jiǎng)h除并重新生成現(xiàn)有索引,其必須具有相同名稱作為參數(shù) index_name。

  OFF 指定不刪除和重新生成現(xiàn)有的索引。 如果指定的索引名稱已經(jīng)存在,SQL Server 將顯示一個(gè)錯(cuò)誤。

ONLINE = {ON |OFF}:表示建立索引時(shí)是否允許正常訪問,即是否對(duì)表進(jìn)行鎖定。默認(rèn)為 OFF。

  ON 它將強(qiáng)制表對(duì)于一般的訪問保持有效,并且不創(chuàng)建任何阻止用戶使用索引和/表的鎖。

  OFF 對(duì)索引操作將對(duì)表進(jìn)行表鎖,以便對(duì)表進(jìn)行完全和有效的訪問。

添加索引舉例

創(chuàng)建聚集索引:

--創(chuàng)建聚集索引
create clustered index Clu_Index
on Student(S_StuNo)
with (drop_existing=on

創(chuàng)建非聚集索引

--創(chuàng)建非聚集索引
create nonclustered index NonClu_Index
on Student(S_StuNo)
with (drop_existing=on)   

創(chuàng)建唯一索引

--創(chuàng)建唯一索引
create unique index NonClu_Index
on Student(S_StuNo)
with (drop_existing=on)

PS:當(dāng) create index 時(shí),如果未指定 clustered 和 nonclustered,那么默認(rèn)為 nonclustered。

創(chuàng)建唯一聚集索引:

-- 創(chuàng)建唯一聚集索引
create unique clustered        --表示創(chuàng)建唯一聚集索引
index UQ_Clu_StuNo        --索引名稱
on Student(S_StuNo)        --數(shù)據(jù)表名稱(建立索引的列名)
with 
(
    pad_index=on,    --表示使用填充
    fillfactor=50,    --表示填充因子為50%
    ignore_dup_key=on,    --表示向唯一索引插入重復(fù)值會(huì)忽略重復(fù)值
    statistics_norecompute=off    --表示啟用統(tǒng)計(jì)信息自動(dòng)更新功能
)

創(chuàng)建唯一非聚集索引:

-- 創(chuàng)建唯一非聚集索引
create unique nonclustered        --表示創(chuàng)建唯一非聚集索引
index UQ_NonClu_StuNo        --索引名稱
on Student(S_StuNo)        --數(shù)據(jù)表名稱(建立索引的列名)
with 
(
    pad_index=on,    --表示使用填充
    fillfactor=50,    --表示填充因子為50%
    ignore_dup_key=on,    --表示向唯一索引插入重復(fù)值會(huì)忽略重復(fù)值
    statistics_norecompute=off    --表示啟用統(tǒng)計(jì)信息自動(dòng)更新功能
)

創(chuàng)建非聚集復(fù)合索引:

--創(chuàng)建非聚集復(fù)合索引
create nonclustered index Index_StuNo_SName
on Student(S_StuNo,S_Name)
with(drop_existing=on)

--創(chuàng)建非聚集復(fù)合索引,未指定默認(rèn)為非聚集索引
create index Index_StuNo_SName
on Student(S_StuNo,S_Name)
with(drop_existing=on)

在 CREATE INDEX 語句中使用 INCLUDE 子句,可以在創(chuàng)建索引時(shí)定義包含的非鍵列(即覆蓋索引),其語法結(jié)構(gòu)如下:

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

--創(chuàng)建非聚集覆蓋索引,未指定默認(rèn)為非聚集索引
create index NonClu_Index
on Student(S_StuNo)
include (S_Name,S_Height)
with(drop_existing=on)

PS:聚集索引不能創(chuàng)建包含非鍵列的索引。

創(chuàng)建篩選索引:

--創(chuàng)建非聚集篩選索引
create nonclustered index Index_StuNo_SName
on Student(S_StuNo)
where S_StuNo >= 001 and S_StuNo <= 020
with(drop_existing=on)

--創(chuàng)建非聚集篩選索引,未指定默認(rèn)為非聚集索引
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 }[ ; ]

其中的參數(shù)為:

REBUILD:表示指定重新生成索引。
DISABLE:表示指定將索引標(biāo)記為已禁用。
REORGANIZE:表示指定將重新組織的索引葉級(jí)。

--禁用名為 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 數(shù)據(jù)庫中表 Student 的索引 UQ_S_StuNo 的碎片
dbcc indexdefrag(Test,Student,UQ_S_StuNo)

--更新表 Student 中的全部索引的統(tǒng)計(jì)信息
update statistics Student

索引定義原則

避免對(duì)經(jīng)常更新的表進(jìn)行過多的索引,并且索引中的列盡可能少。而對(duì)經(jīng)常用于查詢的字段應(yīng)該創(chuàng)建索引,但要避免添加不必要的字段。

在條件表達(dá)式中經(jīng)常用到的、不同值較多的列上建立索引,在不同值少的列上不要建立索引。

在頻繁進(jìn)行排序或分組(即進(jìn)行 GROUP BY 或 ORDER BY 操作)的列上建立索引,如果待排序的列有多個(gè),可以在這些列上建立組合索引。

在選擇索引鍵時(shí),盡可能采用小數(shù)據(jù)類型的列作為鍵以使每個(gè)索引頁能容納盡可能多的索引鍵和指針,通過這種方式,可使一個(gè)查詢必需遍歷的索引頁面降低到最小,此外,盡可能的使用整數(shù)做為鍵值,因?yàn)檎麛?shù)的訪問速度最快。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 索引的簡介: 索引分為聚集索引和非聚集索引,數(shù)據(jù)庫中的索引類似于一本書的目錄,在一本書中通過目錄可以快速找到你想要...
    only_bad_boy閱讀 602評(píng)論 0 0
  • 語法 參考 UNIQUE:為表或視圖創(chuàng)建唯一索引。 唯一索引不允許兩行具有相同的索引鍵值。 視圖的聚集索引必須唯一...
    sttone閱讀 574評(píng)論 0 1
  • 目錄:一、MYSQL二、Sqlserver三、ORACLE四、索引作用 前言:如果你閱讀這篇文章只想找創(chuàng)建索引的語...
    夜希辰閱讀 1,691評(píng)論 1 5
  • SQL SERVER提供了多種索引。如果以存儲(chǔ)結(jié)構(gòu)結(jié)構(gòu)來區(qū)分,有聚集索引和非聚集索引;如果以數(shù)據(jù)的唯一性來區(qū)分,則...
    不知名的蛋撻閱讀 6,164評(píng)論 0 5
  • 久違的晴天,家長會(huì)。 家長大會(huì)開好到教室時(shí),離放學(xué)已經(jīng)沒多少時(shí)間了。班主任說已經(jīng)安排了三個(gè)家長分享經(jīng)驗(yàn)。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,837評(píng)論 16 22

友情鏈接更多精彩內(nèi)容