SQL Server之旅(11):簡單說說sqlserver的執行計劃

發表於2015-03-20

我們知道sql在底層的執行給我們上層人員開了一個視窗,那就是執行計劃,有了執行計劃之後,我們就清楚了那些爛sql是怎麼執行的,這樣就可以方便的找到sql的缺陷和優化點。

一:執行計劃生成過程

說到執行計劃,首先要知道的是執行計劃大概生成的過程,這樣就可以做到就心中有數了,下面我畫下簡圖:

1. 分析過程

這三個比較容易理解,首先我們要保證sql的語法不能錯誤,select和join的表是必須存在的,以及你是有執行這個sql的許可權,對不對。。。這樣我們就走完了執行計劃生命週期的第一個流程。

2. 編譯過程

保證了上面sql這三點的話,引擎就必須硬著頭皮看你這麼一大坨爛sql,該刪的刪,該改的改,該轉換的轉換,比如說你的“子查詢”會轉化為“表連線”等等。。。其實也挺難為引擎的,舉個例子吧。

<1>子查詢生成的sql:

<2>join生成的sql:

從上面的兩個結果中,你可以看到,大家都是玩join的,如果你仔細看的話,會發現一個是“雜湊匹配”,一個是“巢狀迴圈”,為什麼不一樣,這當然是引擎根據很多情況綜合評選出來的,比如說:磁碟IO,邏輯讀,資源佔用,硬體環境等等。。。這也是所謂的“計劃選優”操作。

3.執行過程

既然執行計劃都選出來了,理所當然就要執行了,執行完後會把sql和執行計劃放入快取,這樣下次有同樣的sql過來的時候就可以直接從Cache中提取了,不需要再次生成計劃了,你也看到,生成執行計劃還是比較消耗CPU時間的。

二:看看sql和執行的計劃的快取

剛才也說了,sql和plan都已經放入快取了,那我的好奇心比較強,我就想看看sql和plan到底在哪,並且長的是個什麼醜樣子,剛好sqlserver還是比較能夠滿足我們G點的。

1. 為了方便檢視快取,我需要先將所有的快取清空,比如下面的語句。

2. 通過sys.dm_exec_cached_plans拿到sql和plan的指標(plan_handle),如下圖

從圖中你看到了兩個adhoc(即時查詢),分別是我在第一步執行的join查詢和我在第二步執行的這個select。

3. 現在我們已經拿到了2個adhoc的plan_handle,然後通過dm_exec_sql_text檢視他們的sql分別是怎樣?

4. 看完text快取,接下來我們繼續看看sql的plan快取在哪?可以通過dm_exec_query_plan來檢視。

上面的query_plan欄位就是所謂的執行計劃,以xml的形式儲存在欄位中。。。所以說解析這個xml還是很費時間的。。。

好了,到現在你應該認識到重新生成執行計劃是不容易的。。。下一篇我們討論討論重用,重編譯,重新生成等相關情況。

相關文章