T-SQL | 你需要了解的执行计划
【T-SQL】|?作者?/ Edison Zhou
這是EdisonTalk的第297篇學習分享
T-SQL是ANSI和ISO SQL標準的MS SQL擴展,其正式名稱為Transact-SQL,但一般程序員都稱其為T-SQL。本文是我學習《T-SQL查詢》一書的讀書筆記,為你講解執行計劃是個什么鬼。
1關于執行計劃
執行計劃是優化器生成的用于確定如何處理一個給定查詢的“工作計劃”。一個計劃包含一組運算符,通常按照特定的順序來應用這些運算符。
此外,一些運算符可以在它們之前的運算符還在處理時被應用(即不一定是完全串行),還有一些運算符也有可能被應用多次。
2圖形化執行計劃
SSMS中的圖形化執行計劃
在SSMS(SQL Server Management Studio)中,有兩種圖形化的執行計劃可供選擇。一種是估計執行計劃(Ctrl+L鍵),另一種是實際執行計劃(Ctrl+M鍵)。兩種計劃通常都是一樣的,只是執行時間點不同。估計查詢計劃是在查詢執行之前生成,而實際執行計劃則是在查詢輸出的同時得到的。
圖形化執行計劃實例講解
Step1.示例查詢介紹
(1)假設我們有一張Orders表,里面有100w行訂單數據,從2005年開始到2009年。
(2)待分析的查詢語句
-- 圖形化執行計劃查詢示例 SELECT custid, empid, shipperid, COUNT(*) AS numorders FROM dbo.Orders WHERE orderdate >= '20080201'AND orderdate < '20080301' GROUP BY CUBE(custid, empid, shipperid); GOStep2.估計的執行計劃查看(選中SQL語句按Ctrl+L)
當我們將光標移動到某個運算符上面時,可以得到該運算符返回的估計行數和開銷。箭頭的粗細與源運算符返回的行數是成正比的。所以,重點關注比較粗的箭頭,它們可能預示著性能問題。
Step3.實際的執行計劃(先選中“包括實際的執行計劃”,再執行該查詢,即可同時得到查詢的輸出和實際的計劃)
這時再把光標移到某個運算符,看到的會變為“實際行數”。
Step4.縮放到合適的大小
*.如果得到了一個無法適合屏幕顯示的計劃時,可以使用一個很酷的功能,叫做縮放到合適大小。(點擊鼠標右鍵出現菜單,選擇即可)
點擊后,執行計劃會變為如下圖所示:
Step5.執行計劃是由運算符組成的一個樹狀結構,在圖形化計劃中,是從右到左從上到下的順序來表示的。在這個例子中,聚集索引查找(Clustered Index Seek)是數據流的第一個運算符,生成的輸出傳到樹中的下一個運算符-表假脫機(Eager Spool),以此類推。
我們需要注意與每個運算符相關聯的開銷百分比,這個值是某個運算符的開銷占查詢全部開銷的百分比,由優化器估算。這里,我們需要多留意一下百分比值比較高的運算符,重點對這些運算符進行優化。
此外,當我們將光標放在一個運算符上面時,其中有一項叫做“估計子樹大小(Estimated Subtree Cost)”,這個值代表從當前運算符開始的子樹的累計估計大小。比如,這里我們通過將光標移動到最左邊的SELECT運算符,即根節點,可以看到整個查詢的估計開銷(因為其子樹代表了整個查詢)。
比較多個查詢的開銷
圖形化執行計劃的另一個有用的功能就是可以方便地比較多個查詢的開銷。
假設我們想比較以下幾個實現類似目標的查詢的開銷:
SELECT custid, orderid, orderdate, empid, filler FROM dbo.Orders AS O1 WHERE orderid =(SELECT TOP (1) O2.orderidFROM dbo.Orders AS O2WHERE O2.custid = O1.custidORDER BY O2.orderdate DESC, O2.orderid DESC);SELECT custid, orderid, orderdate, empid, filler FROM dbo.Orders WHERE orderid IN (SELECT(SELECT TOP (1) O.orderidFROM dbo.Orders AS OWHERE O.custid = C.custidORDER BY O.orderdate DESC, O.orderid DESC) AS oidFROM dbo.Customers AS C );SELECT A.* FROM dbo.Customers AS CCROSS APPLY(SELECT TOP (1) O.custid, O.orderid, O.orderdate, O.empid, O.fillerFROM dbo.Orders AS OWHERE O.custid = C.custidORDER BY O.orderdate DESC, O.orderid DESC) AS A;WITH C AS (SELECT custid, orderid, orderdate, empid, filler,ROW_NUMBER() OVER(PARTITION BY custidORDER BY orderdate DESC, orderid DESC) AS nFROM dbo.Orders ) SELECT custid, orderid, orderdate, empid, filler FROM C WHERE n = 1; GO在SSMS中選中他們,并請求圖形化執行計劃(估計的或實際的)。這里,我們將會得到如下圖所示的計劃。
建議點開看大圖
從圖中可以看到,在每個計劃頂部都會有一個百分比,表示該查詢的開銷占整個批處理總開銷的百分比,這里Query1=>34%,Query2=>19%,Query3=>28%,Query4=>20%,可以看出,Query1的查詢開銷最大,需要進一步檢查其性能。
關于黃色窗口的各個屬性項,具體可以參考:顯示圖形執行計劃 (SQL Server Management Studio)
https://technet.microsoft.com/zh-cn/library/ms178071(v=sql.105).aspx
Ref參考資料
[美] Itzik Ben-Gan 著,《SQL Server 2008技術內幕:T-SQL查詢》
????掃碼關注EdisonTalk
設為星標,不再失聯!
往期推文合集:2020年上半年推文合集
更多SQL文章:每天10分鐘T-SQL系列
總結
以上是生活随笔為你收集整理的T-SQL | 你需要了解的执行计划的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: CAP-微服务间通信实践
- 下一篇: 好的自我介绍,面试成功一大半
