SqlServer:創建索引


索引

索引的功能

當表中有大量記錄時,若要基於某些過濾條件對表進行查詢,就需要遍歷整張表和查詢條件進行對比,返回滿足條件的記錄。使用暴力搜索的時間復雜度是 O(n),同時頻繁訪問磁盤,當數據量達到一定的規模時(一般是 10 萬級別以上)效率很低。

索引是對數據表中一列或多列的值進行排序的一種結構,使用索引可快速訪問數據庫表中的特定信息,提高檢索速度。索引的作用相當於圖書的目錄,可以根據目錄中的頁碼快速找到所需的內容。如果 SELECT 的條件所在的列具有索引,則可以直接在索引中找到符合查詢條件的索引值,進而快速找到表中對應的記錄。索引是某個表中一列或若干列值的集合,和相應的指向表中物理標識這些值的數據頁的邏輯指針清單。索引提供指向存儲在表的指定列中的數據值的指針,然后根據指定的排序順序對這些指針排序。

索引的優點和缺點

創建索引有以下 4 個優點:

  1. 大大加快數據的檢索速度;
  2. 保證表中每一行數據的唯一性;
  3. 加速表和表之間的連接;
  4. 在使用分組和排序子句進行數據檢索時,顯著減少時間開銷。

創建索引有以下 2 個缺點:

  1. 創建索引需要占物理空間;
  2. 表中的數據產生變動的時候,索引也要動態地維護。

索引的分類

按照存儲結構,索引分為普通索引和非聚簇索引。聚集索引是按照數據存放的物理位置為順序的索引,在聚集索引上的查詢速度最快。每一個數據表只能有一個聚集索引,這是因為物理數據只能有一種排序規則。非聚集索引建立在專門的索引列和索引文件,按照設定的順序進行排列后的結果數據保存到數據表中,對於單行記錄的查詢效率很高。
如何理解這 2 種索引?例如查字典有 3 種方法,分別是拼音查字法、部首查字法和筆畫查字法。聚集索引可以類比為拼音查字法,因為字典中的所有的字都按照拼音來排列的,是唯一確定的排列方式。非聚集索引可以類比為部首查字法或筆畫查字法,這 2 種查字法分別對應了部首和筆畫,當我們使用筆畫或者部首進行檢索時使用這 2 種方法查詢效率高。

SQL 語法

創建索引

創建索引時,首先需要確定表的索引列。如果表沒有主鍵約束,則可以創建聚集索引,但如果有主鍵約束就只能創建非聚集索引。建立索引的命令格式是:

CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED]
INDEX 索引名
ON 表名 | 視圖名 (列 [ASC|DESC][,…n])
關鍵字 功能
UNIQUE 表示創建的索引具有唯一性
CLUSTERED 指明創建的索引為聚集索引
NONCLUSTERED 指明創建的索引為非聚集索引
ASC、DESC 指定特定的索引列的排序方式為升序(默認)或降序

刪除索引

刪除索引同樣是用 DROP 命令實現,格式是:

DROP INDEX 表名.索引名[,…]

樣例

假設 Student 表中有如下一些數據:

創建簡單索引

為 Student 表的 Sname 字段進行創建。

CREATE INDEX sname_ind ON student (Sname)

創建唯一索引

為 Student 表的 Sname 字段進行創建。

CREATE UNIQUE INDEX sname_UNI_ind ON student (Sname)

此時對表使用如下 UPDATE 語句時會插入失敗,因為創建索引時再 Sname 字段創建了唯一索引,也就是說 Sname 應該是要唯一的.然而插入的數據中重復插入了 Sname 數據“曾華慶”,產生了重復所以不行。

INSERT Student VALUES('110', '曾華慶', '男', '1999-09-01', '95033') 

創建唯一聚集索引

為 Student 表的 Sname 字段進行創建,注意如果表中已經存在了聚集索引,則不能創建多個聚集索引。

CREATE UNIQUE CLUSTERED INDEX sno_cl_ind ON student (sno)

創建組合索引

同時指定 class 和 sbirthday 作為索引列。

CREATE INDEX classs_bith_ind ON student (class, sbirthday)

創建視圖索引

創建索引視圖的時候需要指定表所屬的架構,需要在創建視圖語句中加上 WITH SCHEMABINDING。對視圖創建索引時,表的表達式必須使用兩段式 dbo.mytable 否則會報錯。

CREATE VIEW V WITH SCHEMABINDING 
AS
SELECT s.Sno, Sname, Class, Sbirthday FROM dbo.student s 

刪除索引

刪除上述建的全部索引。

DROP INDEX Student.sname_ind
DROP INDEX Student.sname_UNI_ind
DROP INDEX Student.classs_bith_ind

參考資料

《SqlServer 2014 數據庫技術實用教程》,胡伏湘、肖玉朝 主編,清華大學出版社


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM