天天看點

SQL Server性能調優之執行計劃深度剖析 第二節 執行計劃第一次實踐

SQL Server性能調優之執行計劃深度剖析 第二節 執行計劃第一次實踐

報名活動開始啦:http://www.agilesharp.com/Event.aspx/T-2

         議程如下:

         實踐概述

         圖形化執行計劃實戰

         執行計劃資訊解讀

實踐概述

         執行計劃可以輔助我們寫出高效率的T-SQL代碼,同時也可以找出現有T-SQL代碼的問題,還可以監控資料庫!當然,最後如何使用執行計劃還是取決于我們自己了,但是不管怎麼樣,我們首先學會解析執行計劃中所包含的資訊,最快的學習方法就是實踐。下面,我們就從一個實踐開始。

        另外,有一個需要注意的是,由于資料庫中資料,操作和時間的關系,可能大家在運作腳本産生的執行計劃和我這裡不完全一樣,這是沒有任何問題的!

圖形化執行計劃實戰

      下面我們正式進入要讨論的話題。

       首先,為了使得我們可以檢視執行計劃,最起碼要確定我們在登入資料庫的時候,要被授予權限,如下語句所示:

<code>1.</code><code>GRANT</code> <code>SHOWPLAN </code><code>TO</code> <code>[username]</code>

      為了将讨論集中在執行計劃(估計執行計劃和實際執行計劃)上,我們這裡這是運作一個比較簡單的查詢,如下代碼所示:

<code>1.</code><code>SELECT</code> <code>* </code><code>FROM</code> <code>[dbo].[DatabaseLog];</code>

       下面,我們就來看看這個語句的估計執行計劃,正如之前文章講述的:估計執行計劃是優化器使用了的中繼資料,成本分析算法等而産生的計劃,這個計劃是查詢語句執前的一個分析!

顯示估計執行計劃

         我們可以采用以下幾種方式顯示估計執行計劃:

               1.  點選Sql Server Studio工具欄上的按鈕:  

<a href="http://www.cnblogs.com/Services/BlogAttachment.ashx?AttachmentID=7" target="_blank"></a>

              2.  在查詢視窗右擊滑鼠,如下所示:

<a href="http://www.cnblogs.com/Services/BlogAttachment.ashx?AttachmentID=8" target="_blank"></a>

             3.  使用快捷鍵“CTRL + L”.

      對以上面的查詢語句,顯示的圖形化的估計查詢計劃如下:

<a href="http://www.cnblogs.com/Services/BlogAttachment.ashx?AttachmentID=9" target="_blank"></a>

顯示執行查詢計劃

       與估計執行計劃不同,實際的執行計劃不是優化器産生的,實際的執行計劃是底層的存儲引擎在執行時候産生的,這個計劃中包含了大量的實際的底層資料和相關的資訊。

       我們可以采用以下方式獲得實際的執行計劃,如下所示:

            1.  點選工具欄上面的按鈕:

<a href="http://www.cnblogs.com/Services/BlogAttachment.ashx?AttachmentID=10" target="_blank"></a>

            2.  在查詢視窗右擊滑鼠,如下:

<a href="http://www.cnblogs.com/Services/BlogAttachment.ashx?AttachmentID=11" target="_blank"></a>

            3.  快捷鍵“CTRL + M”

      上述查詢的實際執行計劃如下所示:

<a href="http://www.cnblogs.com/Services/BlogAttachment.ashx?AttachmentID=12" target="_blank"></a>

         大家初一看,以為兩者沒有差別,但是它們包含的資料資訊很多是不一樣的。

        下面,我們就開始對圖形化的執行計劃進行解讀。

執行計劃資訊解讀

         剛剛大家已經看了圖形化的執行計劃了,相關大家比較關心的問題有兩個:如何解讀執行計劃中提供的各種資訊;如何采用執行計劃來進行性能調優。

         我們首先來看看第一個問題。

         一般而言,我們在閱讀圖形化的執行計劃的時候順序是這樣的:從右向左,從下往上。也就說:sql執行的第一步就顯示在執行計劃的右下角。

         在圖形化執行計劃中的每一個圖示,都表示一個操作,在之前的執行計劃中就有兩個操作。并且每個操作之前采用箭頭連接配接起來,表明了資料流動的方向,其中箭頭的粗細就反應了資料量的大小。

         另外,在每個操作下面都顯示了一個百分比。

        對于估計執行計劃而言,這個數字就是優化器對執行計劃中每一個操作步驟進行成本分析後的結果。例外,在我們的例子中,整個查詢最後會有兩個操作會進行,Select和Table Scan,其中整個查詢的成本将會落在Table Scan(整表掃描)上。

操作提示資訊

         當我們把滑鼠放在每個操作或箭頭上面的時候,就會彈出更多的相關資訊,我們下面就來具體的看一看。

         例如,當我們把滑鼠放在執行計劃的Select操作上面,顯示如圖:

        上面圖中給出的資訊非常清楚了,我這裡隻是解釋一下“估計子樹大小”。因為執行計劃可以看出是sql語句的邏輯執行步驟,這個選項就告訴我們:在我們現在所看的這個操作步驟以及後面的所有步驟的開銷是多少,是一個總計數字。

         如何朋友們還有有什麼不清楚的,我們在後續将要展開的線上講座中講述!

         下面我們看看Table Scan的提示資訊,如下圖所示:

<a href="http://www.cnblogs.com/Services/BlogAttachment.ashx?AttachmentID=14" target="_blank"></a>

        雖然這個操作中包含的資訊就非常的多了,但是卻都很容易了解。

        這裡要稍微重點提一下就是“已排序”。很明顯,這個值告訴我們:Table Scan這個操作是建立在對資料排序的基礎上的。例如,在查詢語句中,有時候,我們寫上order by語句,那麼後續的很多的操作都是在已經排序的資料基礎上進行,通過檢視“已排序”是true還是false,我們就可以知道,查詢語句内部是否自己進行了額外的排序操作(有時候,我們明明沒有寫order by,但是優化器卻認為進行order by之後成本更小,這個時候我們就要注意了)。

       最後稍微的提一下“節點ID”,這個值就反應了操作在整個執行計劃中的執行順序,數字越小,說明越早被執行。在上圖中,表明table scan操作時整個執行計劃的第一步。

      為了使得大家更加的清楚,下面我們把之前的查詢語句稍微的改下:

<code>1.</code><code>SELECT</code> <code>* </code><code>FROM</code> <code>[dbo].[DatabaseLog] </code><code>order</code> <code>by</code>  <code>PostTime</code>

      估計執行計劃如下:

<a href="http://www.cnblogs.com/Services/BlogAttachment.ashx?AttachmentID=15" target="_blank"></a>

      我們檢視提示資訊,發現排序最先進行,然後再整表掃描。

<a href="http://www.cnblogs.com/Services/BlogAttachment.ashx?AttachmentID=16" target="_blank"></a>

      今天就暫時到這裡,下一篇,我們講述相關的操作以及以文本和xml的形式檢視執行計劃。

本文轉自yanyangtian51CTO部落格,原文連結:http://blog.51cto.com/yanyangtian/657910 ,如需轉載請自行聯系原作者