原文:
sql開發中容易忽視的一些小地方(五)
背景:
索引分類:眾所周知,索引分為聚集索引和非聚集索引。
索引優點:加速資料查詢。
問題:然而我們真的清楚索引的應用嗎?你寫的查詢語句是否能充分應用上索引,或者說你如何設計你的索引讓它更高效?
經歷:以前本人只知道索引的好處,但是是否能夠真正讓它發揮作用,並無太多理論,為些本人做了些demo,來簡單說明下什麼情況下才能充分利用索引。
案例:
這裡建立乙個學生表:有如下字段,此時表中沒有建立任何索引。
create table [dbo].[student](
[id] [int] identity(1,1) not null,--學生id
[susername] [nchar](10) collate chinese_prc_ci_as null,--學生姓名
[saddress] [varchar](200) collate chinese_prc_ci_as null,--學生位址
[classid] [int] null,--學生所屬班級id
[create_date] [datetime] null constraint [df_student_create_date] default (getdate()) --入校時間
) on [primary]
業務需求:
查詢班級id為9的所有學生的姓名和位址。
情況一:
--欄位沒有建立任何索引
select susername,saddress from student
where classid=9
執行計畫如下圖:
結論:在沒有任何索引的情況下,查詢會選擇全表掃瞄.
情況二:
給id自增列建立乙個聚集索引,我們很多情況下都是這樣預設的,主鍵上就是聚集索引。同樣的查詢,不同的查詢計畫,發現此時雖然在輸出列和條件中沒有id,但是查詢選擇了聚集查詢.
執行計畫圖同圖一。
情況三:在classid上建立非聚集索引。
結論:雖然條件列中出現了classid索引列,但是輸出列中並沒有建立任何索引,依然選用聚集掃瞄方式查詢.
情況四:在susername上建立非聚集索引
結論:同上
情況五:繼續在saddress上建立非聚集索引
結論:同上
情況六:建立susername與saddress的聯合非聚集索引
結論:同上
情況七:在classid與susername上建立索引
結論:同上
情況八:在classid,susername,saddress上建立聯合非聚集索引
執行計畫圖如下:
結論:當條件中出現的列加上輸出列和聯合索引列完全匹配時全用上索引掃瞄.
情況九:刪除所有索引,保留id的聚集索引。以聚集索引列做為條件之一來查詢.
select susername,saddress from student
where id=10021002
或者:select susername,saddress from student
where id=10021002 and classid=9
執行計畫圖:
所有情況總結:
1:當使用非聚集索引掃瞄時的io情況:表 'student'。掃瞄計數 1,邏輯讀取 70 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
2:當使用聚集索引掃瞄時的io情況(條件中未出現聚集索引列):表 'student'。掃瞄計數 3,邏輯讀取 8835 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
3:當使用聚集索引掃瞄時的io情況(條件中出現聚集索引列) :表 'student'。掃瞄計數 1,邏輯讀取 3 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
結論:1:在沒有正確的索引情況下,會增加表的掃瞄次數.
2:資料在查詢時會先找匹配的索引.
1):如果在條件列中出現聚集索引列,則無論輸出列是否建立索引都會按聚集索引查詢(有聚集索引 ).
2):如果在條件列中沒有出現聚集索引列,則查詢匹配的非聚集索引,如果有匹配的索引則按相應索引查詢,否則再掃瞄聚集索引(有聚集索引 ).
3):查詢匹配的非聚集索引(沒有聚集索引 ).
我只是簡單的寫了些關於索引使用的demo,在實際開發中要按實際情況來分析,有時並不能完全使用上索引,但是可以讓查詢產生最少的io讀取以及表掃瞄次數。
SQL開發中容易忽視的一些小地方 一
sql開發中容易忽視的一些小地方 一 寫此系列文章緣由 做開發三年來 b s 發現基於web 架構的專案技術主要分兩大方面 第一 c 它是程式的基礎,也可是其它開發語言,沒有開發語言也就不存在應用程式.第二 資料庫,現在是資訊化世界,大多數資訊都可以通過資料庫儲存來交換資訊.常與應用程式互相交流資訊...
SQL開發中容易忽視的一些小地方 一
原文 sql開發中容易忽視的一些小地方 一 寫此系列文章緣由 做開發三年來 b s 發現基於web 架構的專案技術主要分兩大方面 第一 c 它是程式的基礎,也可是其它開發語言,沒有開發語言也就不存在應用程式.第二 資料庫,現在是資訊化世界,大多數資訊都可以通過資料庫儲存來交換資訊.常與應用程式互相交...
SQL開發中容易忽視的一些小地方 一
原文 sql開發中容易忽視的一些小地方 一 寫此系列文章緣由 做開發三年來 b s 發現基於web 架構的專案技術主要分兩大方面 第一 c 它是程式的基礎,也可是其它開發語言,沒有開發語言也就不存在應用程式.第二 資料庫,現在是資訊化世界,大多數資訊都可以通過資料庫儲存來交換資訊.常與應用程式互相交...