在性能調(diào)優(yōu):理解Set Statistics IO輸出我們討論了Set Statistics IO,還有如何幫助我們進(jìn)行性能調(diào)優(yōu)。這篇文章會討論下Set Statistics Time,它會告訴我們執(zhí)行一個(gè)查詢需要的時(shí)間。
我們用一個(gè)例子來開始。
1 USE AdventureWorks2008r2 2 GO 3 DBCC dropcleanbuffers 4 DBCC freePRoccache 5 6 GO 7 SET STATISTICS TIME ON 8 GO 9 SELECT * 10 FROM Sales.SalesOrderHeader SOH INNER JOIN Sales.SalesOrderDetail SOD ON11 SOH.SalesOrderID=SOD.SalesOrderID 12 WHERE ProductID BETWEEN 700 13 AND 80014 GO15 SELECT * 16 FROM Sales.SalesOrderHeader SOH INNER JOIN Sales.SalesOrderDetail SOD ON17 SOH.SalesOrderID=SOD.SalesOrderID 18 WHERE ProductID BETWEEN 700 19 AND 800
在例子里有2個(gè)SELECT語句。第1個(gè)在清空緩存后執(zhí)行。我們來看看輸出。
SQL Server 分析和編譯時(shí)間:當(dāng)我們提交了一個(gè)查詢給SQL Server去執(zhí)行時(shí),它需要為任何語法錯(cuò)誤進(jìn)行分析并編譯,然后優(yōu)化器生成最優(yōu)計(jì)劃去執(zhí)行。SQL Server分析和編譯時(shí)間指的是完成進(jìn)行這些預(yù)執(zhí)行步驟所花的時(shí)間。我們來看第2個(gè)執(zhí)行的輸出,在SQL Server分析和編譯時(shí)間環(huán)節(jié),CPU時(shí)間是0毫秒,占用時(shí)間是21毫秒。這表示SQL Server沒有花任何時(shí)間在分析和編譯上,因?yàn)閳?zhí)行計(jì)劃已經(jīng)在緩存里。CPU時(shí)間值的花在CPU上的時(shí)間,占用時(shí)間指的是完成分析和編譯所占用的總時(shí)間。CPU時(shí)間和占用時(shí)間兩者之間的區(qū)別可能是在CPU周期隊(duì)列里的等待,或者在等待IO操作完成。這些時(shí)間在性能調(diào)優(yōu)里并不重要,因?yàn)槊看螆?zhí)行都會不一樣。如果你在這個(gè)環(huán)節(jié)看到的時(shí)間基本是一致的,很可能你在使用重編譯選項(xiàng)運(yùn)行存儲過程。
SQL Server 執(zhí)行時(shí)間:這個(gè)指的是SQL Server完成執(zhí)行編譯好計(jì)劃的時(shí)間。CPU時(shí)間指的是花在CPU上的實(shí)際時(shí)間,占用時(shí)間指的是包括信號等待時(shí)間(signal wait time)在內(nèi)的完成執(zhí)行的總時(shí)間,等待時(shí)間是完成IO操作和輸出結(jié)果傳送給客戶端的時(shí)間。CPU時(shí)間可以作為性能調(diào)優(yōu)的基線。這個(gè)值多次執(zhí)行后不會有太大改變,除非你修改查詢或數(shù)據(jù)有變動(dòng)。在服務(wù)器上的負(fù)載不會影響這個(gè)值。請注意這里顯示的時(shí)間單位都是毫秒。對于同個(gè)數(shù)據(jù)的同個(gè)查詢CPU時(shí)間值在反復(fù)執(zhí)行后可能會不同,但也是1/100秒內(nèi)。占用時(shí)間就取決于很多因素了,例如服務(wù)器工作量,IO加載,服務(wù)器與客戶端之間的網(wǎng)絡(luò)帶寬。因此在性能調(diào)優(yōu)時(shí),我們可以把CPU時(shí)間作為基線。
新聞熱點(diǎn)
疑難解答
圖片精選