SQL Server性能調(diào)優(yōu)之執(zhí)行計(jì)劃第一次實(shí)踐
自從上一篇文章發(fā)出之后,收到了很朋友的關(guān)注。很多朋友要求多多實(shí)踐,而不是純粹的理論。確實(shí),從打算出這個(gè)系列開始,我就本著實(shí)踐的思想來進(jìn)行的!同時(shí),為了使得大家更好的理解、消化這些知識(shí),我會(huì)定期的就所寫內(nèi)容進(jìn)行在線的視頻講座,朋友們可以去參與這個(gè)小組:http://www.agilesharp.com/c/sqlprofiler.aspx,報(bào)名活動(dòng)開始啦:http://www.agilesharp.com/Event.aspx/T-2
議程如下:
- 實(shí)踐概述
- 圖形化執(zhí)行計(jì)劃實(shí)戰(zhàn)
- 執(zhí)行計(jì)劃信息解讀
實(shí)踐概述
執(zhí)行計(jì)劃可以輔助我們寫出高效率的T-SQL代碼,同時(shí)也可以找出現(xiàn)有T-SQL代碼的問題,還可以監(jiān)控?cái)?shù)據(jù)庫(kù)!當(dāng)然,***如何使用執(zhí)行計(jì)劃還是取決于我們自己了,但是不管怎么樣,我們首先學(xué)會(huì)解析執(zhí)行計(jì)劃中所包含的信息,最快的學(xué)習(xí)方法就是實(shí)踐。下面,我們就從一個(gè)實(shí)踐開始。
為了使得大家易于理解,這里的例子不會(huì)太復(fù)雜,隨著課程的不斷深入,后續(xù)的示例也會(huì)越來越復(fù)雜。同時(shí),如果大家也想跟著一起動(dòng)手實(shí)踐,那么希望朋友們安裝SQL2005或更高版本,同時(shí)記得安裝AdventureWorks數(shù)據(jù)庫(kù)。下載地址為:http://msftdbprodsamples.codeplex.com
另外,有一個(gè)需要注意的是,由于數(shù)據(jù)庫(kù)中數(shù)據(jù),操作和時(shí)間的關(guān)系,可能大家在運(yùn)行腳本產(chǎn)生的執(zhí)行計(jì)劃和我這里不完全一樣,這是沒有任何問題的!
圖形化執(zhí)行計(jì)劃實(shí)戰(zhàn)
下面我們正式進(jìn)入要討論的話題。
首先,為了使得我們可以查看執(zhí)行計(jì)劃,最起碼要確保我們?cè)诘卿洈?shù)據(jù)庫(kù)的時(shí)候,要被授予權(quán)限,如下語句所示:
- GRANT SHOWPLAN TO [username]
為了將討論集中在執(zhí)行計(jì)劃(估計(jì)執(zhí)行計(jì)劃和實(shí)際執(zhí)行計(jì)劃)上,我們這里這是運(yùn)行一個(gè)比較簡(jiǎn)單的查詢,如下代碼所示:
- SELECT * FROM [dbo].[DatabaseLog];
下面,我們就來看看這個(gè)語句的估計(jì)執(zhí)行計(jì)劃,正如之前文章講述的:估計(jì)執(zhí)行計(jì)劃是優(yōu)化器使用了的元數(shù)據(jù),成本分析算法等而產(chǎn)生的計(jì)劃,這個(gè)計(jì)劃是查詢語句執(zhí)前的一個(gè)分析!
顯示估計(jì)執(zhí)行計(jì)劃
我們可以采用以下幾種方式顯示估計(jì)執(zhí)行計(jì)劃:
- 點(diǎn)擊Sql Server Studio工具欄上的按鈕:
- 在查詢窗口右擊鼠標(biāo),如下所示:
- 使用快捷鍵“CTRL + L”.
對(duì)以上面的查詢語句,顯示的圖形化的估計(jì)查詢計(jì)劃如下:
顯示執(zhí)行查詢計(jì)劃
與估計(jì)執(zhí)行計(jì)劃不同,實(shí)際的執(zhí)行計(jì)劃不是優(yōu)化器產(chǎn)生的,實(shí)際的執(zhí)行計(jì)劃是底層的存儲(chǔ)引擎在執(zhí)行時(shí)候產(chǎn)生的,這個(gè)計(jì)劃中包含了大量的實(shí)際的底層數(shù)據(jù)和相關(guān)的信息。
我們可以采用以下方式獲得實(shí)際的執(zhí)行計(jì)劃,如下所示:
- 點(diǎn)擊工具欄上面的按鈕:
- 在查詢窗口右擊鼠標(biāo),如下:
- 快捷鍵“CTRL + M”
上述查詢的實(shí)際執(zhí)行計(jì)劃如下所示:
大家初一看,以為兩者沒有區(qū)別,但是它們包含的數(shù)據(jù)信息很多是不一樣的。
下面,我們就開始對(duì)圖形化的執(zhí)行計(jì)劃進(jìn)行解讀。
#p#
執(zhí)行計(jì)劃信息解讀
剛剛大家已經(jīng)看了圖形化的執(zhí)行計(jì)劃了,相關(guān)大家比較關(guān)心的問題有兩個(gè):如何解讀執(zhí)行計(jì)劃中提供的各種信息;如何采用執(zhí)行計(jì)劃來進(jìn)行性能調(diào)優(yōu)。
我們首先來看看***個(gè)問題。
一般而言,我們?cè)陂喿x圖形化的執(zhí)行計(jì)劃的時(shí)候順序是這樣的:從右向左,從下往上。也就說:sql執(zhí)行的***步就顯示在執(zhí)行計(jì)劃的右下角。
在圖形化執(zhí)行計(jì)劃中的每一個(gè)圖標(biāo),都表示一個(gè)操作,在之前的執(zhí)行計(jì)劃中就有兩個(gè)操作。并且每個(gè)操作之前采用箭頭連接起來,表明了數(shù)據(jù)流動(dòng)的方向,其中箭頭的粗細(xì)就反應(yīng)了數(shù)據(jù)量的大小。
另外,在每個(gè)操作下面都顯示了一個(gè)百分比。
對(duì)于估計(jì)執(zhí)行計(jì)劃而言,這個(gè)數(shù)字就是優(yōu)化器對(duì)執(zhí)行計(jì)劃中每一個(gè)操作步驟進(jìn)行成本分析后的結(jié)果。例外,在我們的例子中,整個(gè)查詢***會(huì)有兩個(gè)操作會(huì)進(jìn)行,Select和Table Scan,其中整個(gè)查詢的成本將會(huì)落在Table Scan(整表掃描)上。
操作提示信息
當(dāng)我們把鼠標(biāo)放在每個(gè)操作或箭頭上面的時(shí)候,就會(huì)彈出更多的相關(guān)信息,我們下面就來具體的看一看。
例如,當(dāng)我們把鼠標(biāo)放在執(zhí)行計(jì)劃的Select操作上面,顯示如圖:
上面圖中給出的信息非常清楚了,我這里只是解釋一下“估計(jì)子樹大小”。因?yàn)閳?zhí)行計(jì)劃可以看出是sql語句的邏輯執(zhí)行步驟,這個(gè)選項(xiàng)就告訴我們:在我們現(xiàn)在所看的這個(gè)操作步驟以及后面的所有步驟的開銷是多少,是一個(gè)總計(jì)數(shù)字。
如何朋友們還有有什么不清楚的,我們?cè)诤罄m(xù)將要展開的在線講座中講述!
下面我們看看Table Scan的提示信息,如下圖所示:
雖然這個(gè)操作中包含的信息就非常的多了,但是卻都很容易理解。
這里要稍微重點(diǎn)提一下就是“已排序”。很明顯,這個(gè)值告訴我們:Table Scan這個(gè)操作是建立在對(duì)數(shù)據(jù)排序的基礎(chǔ)上的。例如,在查詢語句中,有時(shí)候,我們寫上order by語句,那么后續(xù)的很多的操作都是在已經(jīng)排序的數(shù)據(jù)基礎(chǔ)上進(jìn)行,通過查看“已排序”是true還是false,我們就可以知道,查詢語句內(nèi)部是否自己進(jìn)行了額外的排序操作(有時(shí)候,我們明明沒有寫order by,但是優(yōu)化器卻認(rèn)為進(jìn)行order by之后成本更小,這個(gè)時(shí)候我們就要注意了)。
***稍微的提一下“節(jié)點(diǎn)ID”,這個(gè)值就反應(yīng)了操作在整個(gè)執(zhí)行計(jì)劃中的執(zhí)行順序,數(shù)字越小,說明越早被執(zhí)行。在上圖中,表明table scan操作時(shí)整個(gè)執(zhí)行計(jì)劃的***步。
為了使得大家更加的清楚,下面我們把之前的查詢語句稍微的改下:
- SELECT * FROM [dbo].[DatabaseLog] order by PostTime
估計(jì)執(zhí)行計(jì)劃如下:
我們查看提示信息,發(fā)現(xiàn)排序***進(jìn)行,然后再整表掃描。
今天就暫時(shí)到這里,下一篇,我們講述相關(guān)的操作以及以文本和xml的形式查看執(zhí)行計(jì)劃。
原文鏈接:http://www.cnblogs.com/yanyangtian/archive/2011/09/05/2167093.html
【編輯推薦】