自從上一篇文章發出之後,收到了很朋友的關注。很多朋友要求多多實踐,而不是純粹的理論。確實,從打算出這個系列開始,我就本著實踐的思想來進行的!同時,為了使得大家更好的理解、消化這些知識,我會定期的就所寫內容進行在線的視頻講座,朋友們可以去參與這個小組:http://www.agilesharp.com/c/sqlprofiler.aspx,報名活動開始啦:http://www.agilesharp.com/Event.ASPx/T-2
執行計劃可以輔助我們寫出高效率的T-SQL代碼,同時也可以找出現有T-SQL代碼的問題,還可以監控數據庫!當然,最後如何使用執行計劃還是取決於我們自己了,但是不管怎麼樣,我們首先學會解析執行計劃中所包含的信息,最快的學習方法就是實踐。下面,我們就從一個實踐開始。
為了使得大家易於理解,這裡的例子不會太復雜,隨著課程的不斷深入,後續的示例也會越來越復雜。同時,如果大家也想跟著一起動手實踐,那麼希望朋友們安裝SQL2005或更高版本,同時記得安裝AdventureWorks數據庫。下載地址為:http://msftdbprodsamples.codeplex.com
另外,有一個需要注意的是,由於數據庫中數據,操作和時間的關系,可能大家在運行腳本產生的執行計劃和我這裡不完全一樣,這是沒有任何問題的!
下面我們正式進入要討論的話題。
首先,為了使得我們可以查看執行計劃,最起碼要確保我們在登錄數據庫的時候,要被授予權限,如下語句所示:
- GRANT SHOWPLAN TO [username]
為了將討論集中在執行計劃(估計執行計劃和實際執行計劃)上,我們這裡這是運行一個比較簡單的查詢,如下代碼所示:
- SELECT * FROM [dbo].[DatabaseLog];
下面,我們就來看看這個語句的估計執行計劃,正如之前文章講述的:估計執行計劃是優化器使用了的元數據,成本分析算法等而產生的計劃,這個計劃是查詢語句執前的一個分析!
我們可以采用以下幾種方式顯示估計執行計劃:
對以上面的查詢語句,顯示的圖形化的估計查詢計劃如下:
與估計執行計劃不同,實際的執行計劃不是優化器產生的,實際的執行計劃是底層的存儲引擎在執行時候產生的,這個計劃中包含了大量的實際的底層數據和相關的信息。
我們可以采用以下方式獲得實際的執行計劃,如下所示:
上述查詢的實際執行計劃如下所示:
大家初一看,以為兩者沒有區別,但是它們包含的數據信息很多是不一樣的。
下面,我們就開始對圖形化的執行計劃進行解讀。
剛剛大家已經看了圖形化的執行計劃了,相關大家比較關心的問題有兩個:如何解讀執行計劃中提供的各種信息;如何采用執行計劃來進行性能調優。
我們首先來看看第一個問題。
一般而言,我們在閱讀圖形化的執行計劃的時候順序是這樣的:從右向左,從下往上。也就說:sql執行的第一步就顯示在執行計劃的右下角。
在圖形化執行計劃中的每一個圖標,都表示一個操作,在之前的執行計劃中就有兩個操作。並且每個操作之前采用箭頭連接起來,表明了數據流動的方向,其中箭頭的粗細就反應了數據量的大小。
另外,在每個操作下面都顯示了一個百分比。
對於估計執行計劃而言,這個數字就是優化器對執行計劃中每一個操作步驟進行成本分析後的結果。例外,在我們的例子中,整個查詢最後會有兩個操作會進行,Select和Table Scan,其中整個查詢的成本將會落在Table Scan(整表掃描)上。
當我們把鼠標放在每個操作或箭頭上面的時候,就會彈出更多的相關信息,我們下面就來具體的看一看。
例如,當我們把鼠標放在執行計劃的Select操作上面,顯示如圖:
上面圖中給出的信息非常清楚了,我這裡只是解釋一下“估計子樹大小”。因為執行計劃可以看出是sql語句的邏輯執行步驟,這個選項就告訴我們:在我們現在所看的這個操作步驟以及後面的所有步驟的開銷是多少,是一個總計數字。
如何朋友們還有有什麼不清楚的,我們在後續將要展開的在線講座中講述!
下面我們看看Table Scan的提示信息,如下圖所示:
雖然這個操作中包含的信息就非常的多了,但是卻都很容易理解。
這裡要稍微重點提一下就是“已排序”。很明顯,這個值告訴我們:Table Scan這個操作是建立在對數據排序的基礎上的。例如,在查詢語句中,有時候,我們寫上order by語句,那麼後續的很多的操作都是在已經排序的數據基礎上進行,通過查看“已排序”是true還是false,我們就可以知道,查詢語句內部是否自己進行了額外的排序操作(有時候,我們明明沒有寫order by,但是優化器卻認為進行order by之後成本更小,這個時候我們就要注意了)。
最後稍微的提一下“節點ID”,這個值就反應了操作在整個執行計劃中的執行順序,數字越小,說明越早被執行。在上圖中,表明table scan操作時整個執行計劃的第一步。
為了使得大家更加的清楚,下面我們把之前的查詢語句稍微的改下:
- SELECT * FROM [dbo].[DatabaseLog] order by PostTime
估計執行計劃如下:
我們查看提示信息,發現排序最先進行,然後再整表掃描。
今天就暫時到這裡,下一篇,我們講述相關的操作以及以文本和XML的形式查看執行計劃。