查看表扫描次数,并对比索引对表查询的作用
1、什么是表掃描
當執行SQL 語句時,可通過“”評估執行計劃”,查看語句的執行計劃。尤其是語句設計查詢,會出現“表掃描”部分;
表掃描是嚴重影響查詢時間的因素!
2、驗證
(1)新建數據表BasicMsg20161204,主鍵為自增列,但是將聚集索引建立在(RecvTime,AA,MsgTypecode)上;
(2)新建數據表BasicMsg20161104,主鍵為自增列,且該列為聚集索引;在RecvTime上有非聚集索引;
(3)新建數據表BasicMsg20161004,主鍵為自增列,且該列為聚集索引;沒有任何其他索引。
? ? ? ? 表中共有347758行數據,?查看三表的IO讀寫情況:
--//----------------------------------------------
--1、查看該表的IO讀寫情況
DBCC DROPCLEANBUFFERS --清空所有的緩存區內容 SET STATISTICS IO ON SELECT * FROM BasicMsg20161204 --WHERE IDFlag=347758 SET STATISTICS IO OFF--2、結果:
--BasicMsg20161204 --(347758 row(s) affected) --Table 'BasicMsg20161204'. Scan count 1, logical reads 6594, physical reads 2, read-ahead reads 6596, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. --掃描計數1次,邏輯讀取6594次!物理讀取2次,預讀6594次,lob邏輯讀取0次...--BasicMsg20161104 --(347758 row(s) affected)
--Table 'BasicMsg20161104'. Scan count 1, logical reads 6575, physical reads 3, read-ahead reads 6596,?
--掃描計數1次,邏輯讀取6575次!物理讀取3次,預讀6575次,lob邏輯讀取0次...
--3、分析
? 發現,當未用WHERE 語句對索引列進行條件篩選時,前兩表的邏輯讀取都比較大,索引沒有明顯作用;未加任何索引的1004表的預讀次數反而少;
(1)當在查詢語句后加?WHERE RecvTime<=17999995限制條件,掃描次數一樣
(2)當在查詢語句后加?WHERE RecvTime=17999995限制條件,BasicMsg20161204表的結果為:Scan count 1, logical reads 3, physical reads 3;建立非聚集索引的BasicMsg20161104表為:Scan count 1, logical reads 3, physical reads 3;
? 未在RecvTime上加索引,1004表的Table 'BasicMsg20161004'. Scan count 9, logical reads 7215, physical reads 2, read-ahead reads 4352,與其他2表的3次和6次,有天壤之別!!
這說明,索引建立在需要具體判定條件的列上才有效。
?--4、DBCC命令協助理解
dbcc ind 命令查看下數據表記錄在哪個數據頁中
DBCC IND(DF17DataPro,BasicMsg20161104 ,-1) -- (數據庫名,表名,參數值)
然后導出該數據頁
dbcc traceon(3604) dbcc page(Ctrip,1,148,1)轉載于:https://www.cnblogs.com/Miss-Bueno/p/7400268.html
總結
以上是生活随笔為你收集整理的查看表扫描次数,并对比索引对表查询的作用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《影响力》承诺和一致原理深入剖析,人们对
- 下一篇: js无限轮播的写法