--DROP TABLE T_UserInfo----------------------------------------------------
CREATE TABLE T_UserInfo
(
Userid varchar(20), UserName varchar(20),
Tel varchar(20),
)
DECLARE @I INT
DECLARE @ENDID INT
SELECT @I = 1
在此處更改要插入的數據,重新插入之前要刪掉所有數據
WHILE @I <= @ENDID
BEGIN
INSERT INTO T_UserInfo
@I VARCHAR(20)),
@I AS VARCHAR(20))
SELECT @I = @I + 1
END
---------------------------------------------------------------------------
T_UserInfo (Userid)
T_UserInfo (Userid)
DROP INDEX T_UserInfo.INDEX_Userid
---------------------------------------------------------------------------
---------------------------------------------------------------------------
SET STATISTICS IO ON
SET STATISTICS IO OFF
---------------------------------------------------------------------------
IO 是互斥的。
OK,現在開始:
首先,我們插入100條數據
然后我寫了一個查詢語句:
這就是MSSQL的執行計劃:表掃描:掃描表中的行
然后我們來看該語句對IO的讀寫:
執行:SET STATISTICS IO ON
* FROM T_UserInfo WHERE USERID='ABCDE6EF'
切換到消失欄顯示如下:
解釋下其意思:
四個值分別為:
從數據緩存讀取的頁數;
重要:如果對于一個SQL查詢有多種寫法,那么這四個值中的邏輯讀(logical reads)決定了哪個是最優化的。
接下來我們為其建一個聚集索引
INDEX INDEX_Userid ON T_UserInfo (Userid)
FROM T_UserInfo WHERE USERID='ABCDE6EF'
切換到消息欄如下顯示:
聚集索引查找:掃描聚集索引中特定范圍的行
說明,此時用了索引。
OK,到這里你應該已經知道初步知道MSSQL查詢計劃和如何查看對IO的讀取消耗了吧!
接下來我們繼續:
IO
在不加聚集索引的情況下:
如此,在數據量稍大時,索引的查詢優勢就顯示出來了。
先小總結下:
當你構建SQL語句時,按Ctrl+L就可以看到語句是如何執行,是用索引掃描還是表掃描?
通過SET STATISTICS IO ON 來查看邏輯讀,完成同一功能的不同SQL語句,邏輯讀
越小查詢速度越快(當然不要找那個只有幾百條記錄的例子來反我)。
我們再繼續深入:
T_UserInfo.INDEX_Userid
FROM T_UserInfo WHERE USERID LIKE 'ABCDE8%'
在這里我們只看StmtText:
SELECT * FROM T_UserInfo WHERE USERID LIKE 'ABCDE8%'
我再加上索引:
INDEX INDEX_Userid ON T_UserInfo (Userid)
FROM T_UserInfo WHERE USERID LIKE 'ABCDE8%'
查看StmtText:
SELECT * FROM T_UserInfo WHERE USERID LIKE 'ABCDE8%'
WHERE:(like([T_UserInfo].[Userid], 'ABCDE8%', NULL)) ORDERED FORWARD)Ctrl+L看下此時的圖行執行計劃:
SET SHOWPLAN_ALL ON
查看StmtText:
分別如下:
這說明:
第一次是表掃描,掃了7頁,也就是全表掃描
第二次是索引掃描,掃了1頁索引,2頁數據頁
第三次是索引掃描+表掃描,掃了1頁索引,7頁數據頁
[圖形界面也有對CPU和IO的消耗,也可以看出來哪個最優!]
大總結:
新聞熱點
疑難解答