SQL Server 建立索引
阿新 • • 發佈:2020-11-19
1.索引的簡介:
索引分為聚集索引和非聚集索引,資料庫中的索引類似於一本書的目錄,在一本書中通過目錄可以快速找到你想要的資訊,而不需要讀完全書。
索引主要目的是提高了SQLServer系統的效能,加快資料的查詢速度與減少系統的響應時間。
但是索引對於提高查詢效能也不是萬能的,也不是建立越多的索引就越好。索引建少了,用 WHERE 子句找資料效率低,不利於查詢資料。索引建多了,不利於新增、修改和刪除等操作,因為做這些操作時,SQLSERVER 除了要更新資料表本身,還要連帶立即更新所有的相關索引,而且過多的索引也會浪費硬碟空間。
2.索引的分類:
索引就類似於中文字典前面的目錄,按照拼音或部首都可以很快的定位到所要查詢的字。
- 唯一索引(UNIQUE):每一行的索引值都是唯一的(建立了唯一約束,系統將自動建立唯一索引)
- 主鍵索引:當建立表時指定的主鍵列,會自動建立主鍵索引,並且擁有唯一的特性。
- 聚集索引(CLUSTERED):聚集索引就相當於使用字典的拼音查詢,因為聚集索引儲存記錄是物理上連續存在的,即拼音 a 過了後面肯定是 b 一樣,聚集索引一個表只能有一個。
- 非聚集索引(NONCLUSTERED):非聚集索引就相當於使用字典的部首查詢,非聚集索引是邏輯上的連續,物理儲存並不連續,非聚集索引一個表可以存在多個。
非聚集索引與聚集索引具有相同的 B 樹結構,它們之間的顯著差別在於以下兩點:
1. 基礎表的資料行不按非聚集鍵的順序排序和儲存。
2. 非聚集索引的葉層是由索引頁而不是由資料頁組成。
3.建立索引:
--建立聚集索引 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)
- 如果指定DROP_EXISTING選項,那麼如果之前已經存在同名索引將在構造新索引之前被刪除。
- 當 建立索引時,如果未指定 clustered 和 nonclustered,那麼預設為 nonclustered。
- 聚集索引不能建立包含非鍵列的索引。
4.修改索引:
--修改索引語法 ALTER INDEX { 索引名| ALL } ON <表名|檢視名> { REBUILD | DISABLE | REORGANIZE }[ ; ]
- REBUILD:表示指定重新生成索引。
- DISABLE:表示指定將索引標記為已禁用。
- REORGANIZE:表示指定將重新組織的索引葉級。
5.禁用索引:
--禁用名為 NonClu_Index 的索引 alter index NonClu_Index on Student disable
6.刪除、檢視和更新索引:
--檢視指定表 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
7.使用索引的代價:
- 索引需要佔用資料表以外的物理儲存空間
- 建立索引和維護索引要花費一定的時間
- 當對錶進行更新操作時,索引需要被重建,這樣降低了資料的維護速度。
8.建立索引的原則:
- 避免對經常更新的表進行過多的索引,並且索引中的列儘可能少。而對經常用於查詢的欄位應該建立索引,但要避免新增不必要的欄位。
- 在條件表示式中經常用到的、不同值較多的列上建立索引,在不同值少的列上不要建立索引。
- 在頻繁進行排序或分組(即進行 GROUP BY 或 ORDER BY 操作)的列上建立索引,如果待排序的列有多個,可以在這些列上建立組合索引。
- 在選擇索引鍵時,儘可能採用小資料型別的列作為鍵以使每個索引頁能容納儘可能多的索引鍵和指標,通過這種方式,可使一個查詢必需遍歷的索引頁面降低到最小,此外,儘可能的使用整數做為鍵值,因為整數的訪問速度最快。