SQL Server 創(chuàng)建索引(index)

索引的簡介:

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

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

但是索引對于提高查詢性能也不是萬能的御蒲,也不是建立越多的索引就越好。索引建少了诊赊,用 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è)绒北。


什么情況下使用索引:


語法:

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í),鍵值的邏輯順序決定表中對應(yīng)行的物理順序嘶是。 聚集索引的底層(或稱葉級別)包含該表的實(shí)際數(shù)據(jù)行钙勃。

NONCLUSTERED:表示指定創(chuàng)建的索引為非聚集索引。創(chuàng)建一個(gè)指定表的邏輯排序的索引聂喇。 對于非聚集索引辖源,數(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)用于索引中間級別頁。

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

  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í)是否允許正常訪問,即是否對表進(jìn)行鎖定洋幻。默認(rèn)為 OFF郁轻。

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

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

例子:

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

-- 創(chuàng)建唯一聚集索引createuniqueclustered--表示創(chuàng)建唯一聚集索引indexUQ_Clu_StuNo--索引名稱onStudent(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)建唯一非聚集索引createuniquenonclustered--表示創(chuàng)建唯一非聚集索引indexUQ_NonClu_StuNo--索引名稱onStudent(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)建聚集索引createclusteredindex Clu_Indexon Student(S_StuNo)with(drop_existing=on)? ? --創(chuàng)建非聚集索引createnonclusteredindex NonClu_Indexon Student(S_StuNo)with(drop_existing=on)? ? --創(chuàng)建唯一索引createuniqueindex NonClu_Indexon Student(S_StuNo)with(drop_existing=on)

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

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

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

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

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

CREATENONCLUSTEREDINDEX 索引名ON{ 表名|視圖名 } ( 列名[ ASC | DESC ][ ,...n ] )

INCLUDE (<列名1>,<列名2>,[,… n])

--創(chuàng)建非聚集覆蓋索引createnonclusteredindex NonClu_Indexon Student(S_StuNo)

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

include (S_Name,S_Height)with(drop_existing=on)

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

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

--創(chuàng)建非聚集篩選索引createnonclusteredindex Index_StuNo_SNameon Student(S_StuNo)whereS_StuNo>=001andS_StuNo<=020with(drop_existing=on)--創(chuàng)建非聚集篩選索引脏榆,未指定默認(rèn)為非聚集索引createindex Index_StuNo_SNameon Student(S_StuNo)whereS_StuNo>=001andS_StuNo<=020with(drop_existing=on)

修改索引:

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

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

DISABLE:表示指定將索引標(biāo)記為已禁用台谍。

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

--禁用名為 NonClu_Index 的索引alterindexNonClu_IndexonStudent disable

刪除和查看索引:

--查看指定表 Student 中的索引exec sp_helpindex Student? ? --刪除指定表 Student 中名為 Index_StuNo_SName 的索引dropindex 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ì)信息updatestatisticsStudent


索引定義原則:

避免對經(jīng)常更新的表進(jìn)行過多的索引,并且索引中的列盡可能少趁蕊。而對經(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ù)的訪問速度最快粹胯。


參考:

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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蓖柔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子风纠,更是在濱河造成了極大的恐慌况鸣,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竹观,死亡現(xiàn)場離奇詭異镐捧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)臭增,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門懂酱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人誊抛,你說我怎么就攤上這事列牺。” “怎么了拗窃?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵瞎领,是天一觀的道長泌辫。 經(jīng)常有香客問我,道長九默,這世上最難降的妖魔是什么震放? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮荤西,結(jié)果婚禮上澜搅,老公的妹妹穿的比我還像新娘伍俘。我一直安慰自己邪锌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布癌瘾。 她就那樣靜靜地躺著觅丰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪妨退。 梳的紋絲不亂的頭發(fā)上妇萄,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機(jī)與錄音咬荷,去河邊找鬼冠句。 笑死,一個(gè)胖子當(dāng)著我的面吹牛幸乒,可吹牛的內(nèi)容都是我干的懦底。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼罕扎,長吁一口氣:“原來是場噩夢啊……” “哼聚唐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起腔召,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后遣耍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體求晶,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年浊仆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了客峭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡氧卧,死狀恐怖桃笙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情沙绝,我是刑警寧澤搏明,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布鼠锈,位于F島的核電站,受9級特大地震影響星著,放射性物質(zhì)發(fā)生泄漏购笆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一虚循、第九天 我趴在偏房一處隱蔽的房頂上張望同欠。 院中可真熱鬧,春花似錦横缔、人聲如沸铺遂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽襟锐。三九已至,卻和暖如春膛锭,著一層夾襖步出監(jiān)牢的瞬間粮坞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工初狰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留莫杈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓奢入,卻偏偏與公主長得像筝闹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子俊马,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容

  • SQL SERVER提供了多種索引丁存。如果以存儲(chǔ)結(jié)構(gòu)結(jié)構(gòu)來區(qū)分,有聚集索引和非聚集索引柴我;如果以數(shù)據(jù)的唯一性來區(qū)分解寝,則...
    不知名的蛋撻閱讀 6,027評論 0 5
  • ORA-00001: 違反唯一約束條件 (.) 錯(cuò)誤說明:當(dāng)在唯一索引所對應(yīng)的列上鍵入重復(fù)值時(shí),會(huì)觸發(fā)此異常艘儒。 O...
    我想起個(gè)好名字閱讀 5,248評論 0 9
  • MYSQL 基礎(chǔ)知識 1 MySQL數(shù)據(jù)庫概要 2 簡單MySQL環(huán)境 3 數(shù)據(jù)的存儲(chǔ)和獲取 4 MySQL基本操...
    Kingtester閱讀 7,787評論 5 116
  • 索引是應(yīng)用程序設(shè)計(jì)和開發(fā)的一個(gè)重要方面聋伦。 若索引太多, 應(yīng)用程序的性能可能會(huì)受到影響界睁。 而索引太少觉增, 對查詢性能又...
    好好學(xué)習(xí)Sun閱讀 1,034評論 0 4
  • 50個(gè)常用的sql語句Student(S#,Sname,Sage,Ssex) 學(xué)生表Course(C#,Cname...
    哈哈海閱讀 1,225評論 0 7