天天看點

查詢優化器核心剖析第五篇:進一步的了解執行計劃

查詢優化器核心剖析第五篇:進一步的了解執行計劃

系列文章索引:       

<a href="http://www.agilesharp.com/u/admin/Blog.aspx/t-195" target="_blank"> 查詢優化器核心剖析第五篇:進一步的了解執行計劃</a>

    在上一篇中,我們稍微的談了一些有關執行計劃的知識,本篇的目的主要是補充上一篇,因為執行計劃的東西很多很多,如果要講清楚,那就得用一本書的篇幅來講述,看以後的安排,如果有時間,可以進一步的嘗試寫寫。

    在上一篇中,我們說了,可以再圖形化執行計劃中檢視資料的流向等相關資訊,同時,也可以通過把滑鼠放在一些操作或者箭頭上檢視更多的資訊。另外,我們還可以在實體操作符和箭頭上,點選右鍵,選擇“屬性”,檢視更多的資訊,如下圖所示:

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

    其實在很多的時候,圖形化展示的資訊是很有限的,畢竟有很多的資訊不友善在圖形中顯示出來,是以為了檢視更加具體的資訊,我們可以檢視執行計劃的XML格式和普通文本格式(普通文本的格式以後會被微軟逐近的棄用,但是如果是對SQL Server2000進行調優,那麼還是隻能用普通文本格式的執行計劃來進行的)。

     如果在之前我們得到的圖形化的執行計劃的顯示視窗,點選右鍵,然後選擇“Show Execution Plan XML”,如下圖所示:

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

    這個時候,就顯示如下:

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

    我們這裡不會講述如何來解讀這個XML格式的執行計劃,以後可能會用一些專題來講述,并且在本系列的後文文章中,如果用到了,會做适當的必要性的講解。

    除此之外,我們還可以通過SQL語句來擷取執行計劃(隻能用SQL語句來擷取XML格式和普通文本格式的執行計劃)。

    我們先用一個表格來總結一下檢視執行計劃的幾種方式,如下:

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

    注意:很多的語句都是Set  Show_XXX On,有“On”就有對應的“Off“。

    下面,我們就來檢視之前的SQL語句的XML格式的執行計劃:

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

    運作之後,得到如下的結果顯示:

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

    點選藍色的連結,在SQL Server 2008中就看可以到這個XML格式的執行計劃以圖形化的形式展示出來。

    如果是在2005中,那麼就會直接顯示XML格式。這個時候,我們可以把這些XML格式的執行計劃儲存為.sqlplan為字尾的檔案,那麼輕按兩下就可以以圖形化的形式檢視了。

    如果運作下面的SQL語句:

    那麼就會顯示基于普通文本的格式的執行計劃,如下所示:

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

    普通文本格式的不好之處就是不要閱讀,但是它包含的資訊是最多的。

    除了采用上面的的方法來檢視之外,還可以利用DMV(動态管理視圖)來檢視和SQL Profiler或者SQL Trace來檢視,我個人比較喜歡這個格式,但是DMV的學習曲線更加的陡峭,但是一旦學會,可以做很多的事情,特别是在性能優化與故障排除方面。、

    在這裡,我介紹一下使用DMV來看。之前我們談到的,當一個查詢被優化之後,它的執行計劃就會被放在了計劃緩存中,也就是在記憶體中,是以我們可以采用sys.dm_exec_query_plan這個動态管理函數(DMF)來擷取這個查詢的執行計劃(DMF常常和DMV結合在一起使用,以後談到DMV,我們就指代:DMV和DMF)。

    我們運作下面的查詢:

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

    在上面的查詢中,涉及到了sys.dm_exec_requests這個動态管理視圖,這個DMV就是放映了目前正在執行查詢,而session_id就是目前運作的這個查詢的回話id,我們可以通過檢視一些系統表得到。這裡就稍微的提及一下,我們會面還有更多的講述!

    今天就到這裡!下一篇講述Join的一些知識,大家可以認為Join沒有什麼,但是“次Join非彼Join“,大家拭目以待 :)。

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