天天看點

sql server索引索引:索引的分類:建立索引:删除索引:運用索引:

文章目錄

  • 索引:
  • 索引的分類:
    • 聚集索引:
    • 非聚集索引:
  • 建立索引:
    • 建立索引的格式:
    • 參數說明:
    • 示例:
  • 删除索引:
  • 運用索引:

索引:

資料庫中的索引類似于一本書的目錄,在一本書中使用目錄可以快速找到你想要的資訊,而不需要讀完全書。

好處:使用索引提高性能的一個主要目标是避免全表掃描,因為全表掃描需要從磁盤上讀取表的每一個資料頁,如果有索引指向資料值,則查詢隻需要讀少數次的磁盤就行。

弊端:但是索引并不總是提高系統的性能,帶索引的表需要在資料庫中占用更多的存儲空間,同樣用來增删資料的指令運作時間以及維護索引所需的處理時間會更長。是以我們要合理使用索引,及時更新去除次優索引。

索引的分類:

SQL SERVER中有多種索引類型。

按存儲結構區分:“聚集索引(又稱聚類索引,簇集索引)”,“分聚集索引(非聚類索引,非簇集索引)”

按資料唯一性區分:“唯一索引”,“非唯一索引”

按鍵列個數區分:“單列索引”,“多列索引”。

聚集索引:

聚集索引是一種對磁盤上實際資料重新組織以按指定的一列或多列值排序。像我們用到的漢語字典,就是一個聚集索引,比如要查“張”,我們自然而然就翻到字典的後面百十頁。然後根據字母順序跟查找出來。這裡用到微軟的平衡二叉樹算法,即首先把書翻到大概二分之一的位置,如果要找的頁碼比該頁的頁碼小,就把書向前翻到四分之一處,否則,就把書向後翻到四分之三的地方,依此類推,把書頁續分成更小的部分,直至正确的頁碼。

由于聚集索引是給資料排序,不可能有多種排法,是以一個表隻能建立一個聚集索引。科學統計建立這樣的索引需要至少相當與該表120%的附加空間,用來存放該表的副本和索引中間頁,但是他的性能幾乎總是比其它索引要快。

由于在聚集索引下,資料在實體上是按序排列在資料頁上的,重複值也排在一起,因而包含範圍檢查(bentween,<,><=,>=)或使用group by 或order by的查詢時,一旦找到第一個鍵值的行,後面都将是連在一起,不必在進一步的搜尋,避免啦大範圍的掃描,可以大大提高查詢速度

非聚集索引:

sqlserver預設情況下建立的索引是非聚集索引,他不重新組織表中的資料,而是對每一行存儲索引列值并用一個指針指向資料所在的頁面。他像漢語字典中的根據‘偏旁部首’查找要找的字,即便對資料不排序,然而他擁有的目錄更像是目錄,對查取資料的效率也是具有的提升空間,而不需要全表掃描。

一個表可以擁有多個非聚集索引,每個非聚集索引根據索引列的不同提供不同的排序順序。

建立索引:

建立索引的格式:

CREATE [UNIQUE] [CLUSTERED| NONCLUSTERED ]

INDEX index_name ON { table | view } ( column [ ASC | DESC ] [ ,…n ] )

[with[PAD_INDEX][[,]FILLFACTOR=fillfactor]

[[,]IGNORE_DUP_KEY]

[[,]DROP_EXISTING]

[[,]STATISTICS_NORECOMPUTE]

[[,]SORT_IN_TEMPDB]

]

[ ON filegroup ]

參數說明:

CREATE INDEX指令建立索引各參數說明如下:

UNIQUE:用于指定為表或視圖建立唯一索引,即不允許存在索引值相同的兩行。

CLUSTERED:用于指定建立的索引為聚集索引。

NONCLUSTERED:用于指定建立的索引為非聚集索引。

index_name:用于指定所建立的索引的名稱。

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

view:用于指定建立索引的視圖的名稱。

ASC|DESC:用于指定具體某個索引列的升序或降序排序方向。

Column:用于指定被索引的列。

           

索引可以建立在該表的一列或多列上,各列名之間用逗号分隔。每個<列名>後面還可以用<次序>制定索引值的排列次序,可選asc或desc,預設值是asc。

unique表明此索引的每一個索引值隻對應唯一的資料記錄。

cluster表明要建立的索引是聚簇索引。

示例:

student表建立索引,其中student表按學号升序建唯一索引,索引名為stusno。

删除索引:

格式:

DROP INDEX index_name ON talbe_name

例如:

删除student表的stusname索引。

drop index stusname on student
           

運用索引:

說了這麼多,有沒有手動調用索引的方法呢?如同select 一樣?

我們寫SQL語句的時候很多時候會用到filter篩選掉一些記錄,SQL對篩選條件簡稱:SARG(search argument/SARG)

1 where amount>4000 and amount<6000

上面這句就是篩選條件

當然這裡不是說SqlServer的where子句,在sql server中,我們建立好索引之後,每一次使用SARG的時候都會自動使用索引。

在SqlServer對于沒有SARG運算符的表達式,索引是沒有用的,SqlServer對它們很難使用比較優化的做法。

意思是說,如果你的SQL語句中沒有where子句包括非SARG運算符,那麼你的SQL語句是不會用到表格中的索引的

下面說一下哪些是非SARG運算符:

非SARG運算符包括

NOT、

<>、

NOT EXISTS、

NOT IN、

NOT LIKE

規律就是有“NOT” 關鍵字 或者 不等于的意思 基本上利用不了索引

還有一些内部函數,如果使用這些内部函數SQLSERVER也不會用到索引

内部函數,例如:CONVERT(),UPPER()等