?????? 上一篇:
SQL2005性能分析一些細(xì)節(jié)功能你是否有用到?
我簡(jiǎn)單的提到了些關(guān)于SQL性能分析最基本的一些方法,下面的文章我會(huì)陸續(xù)補(bǔ)充。前面提到了根據(jù)SQL的執(zhí)行IO和執(zhí)行計(jì)劃來(lái)分析,還有一個(gè)特別重要的參數(shù),就是SET STATISTICS TIME。
?????? 第一: SET STATISTICS TIME
?????????????? 定義: SET STATISTICS TIME (Transact-SQL)? 顯示分析、編譯和執(zhí)行各語(yǔ)句所需的毫秒數(shù)。
?????????????? 語(yǔ)法: SET STATISTICS TIME { ON | OFF }?????????????? 備注: 當(dāng) SET STATISTICS TIME 為 ON 時(shí),會(huì)顯示語(yǔ)句的時(shí)間統(tǒng)計(jì)信息。為 OFF 時(shí),不顯示時(shí)間統(tǒng)計(jì)信息。SET STATISTICS TIME 的設(shè)置是在執(zhí)行或運(yùn)行時(shí)設(shè)置,而不是在分析時(shí)設(shè)置。
?????????????? 權(quán)限 : 若要使用 SET STATISTICS TIME,用戶必須具有執(zhí)行 Transact-SQL 語(yǔ)句的相應(yīng)權(quán)限。但不需要 SHOWPLAN 權(quán)限。
?????????????? 作用: 我們可以利用這個(gè)參數(shù)來(lái)查看SQL的CPU開(kāi)銷情況,進(jìn)而做出優(yōu)化方案。
? ? ? ? ? ? ??
效果圖:
? ? ? ? ? ? ??
??????
第二:sp_help
?????????????
定義:
報(bào)告有關(guān)數(shù)據(jù)庫(kù)對(duì)象(sysobjects 表中列出的任何對(duì)象)、用戶定義數(shù)據(jù)類型或 Microsoft? SQL Server? 所提供的數(shù)據(jù)類型的信息。
??????? 參數(shù) : [@objname =] name 是 sysobjects 中的任意對(duì)象的名稱,或者是在 systypes 表中任何用戶定義數(shù)據(jù)類型的名稱。不能使用數(shù)據(jù)庫(kù)名稱。????????????
? ? ? ? ? ? ? 效果圖:
?? ? ? ? ??
?????????????? 內(nèi)容:
???????????????? 1:表結(jié)構(gòu) ,它會(huì)列出目標(biāo)表中所有的字段信息:名稱,數(shù)據(jù)類型等。???????????????? 2:索引情況 ,包含聚集索引和非聚集索引.索引所對(duì)應(yīng)的字段等。
???????????????? 3:表字段的約束情況 。
???????????????? 4:表的基本信息,表類型,創(chuàng)建時(shí)間,表名等。
????????????? ?? 5:主鍵詳細(xì)信息。
????????????? 用途一 : 一般對(duì)于性能分析關(guān)系有直接關(guān)系的有 1,2,5 。開(kāi)發(fā)員可以非常快捷清晰的查看表的設(shè)計(jì)情況.對(duì)于查詢來(lái)說(shuō)最重要的就是表的索引情況和表結(jié)構(gòu).對(duì)于其它的用途本人暫不胡說(shuō)了。
? ? ? ? ? ???
案例:
一次實(shí)際開(kāi)發(fā)中,運(yùn)行一個(gè)單表查詢,發(fā)面頁(yè)面報(bào)出SQL05 timeout的錯(cuò)誤,后來(lái)在數(shù)據(jù)庫(kù)中直接運(yùn)行語(yǔ)句發(fā)現(xiàn)時(shí)間特別長(zhǎng),達(dá)到58m,查看記錄,一個(gè)長(zhǎng)達(dá)9位數(shù)的字樣把我嚇到了,沒(méi)辦法只能是優(yōu)化了,sp_help下,發(fā)現(xiàn)條件中的字段沒(méi)有創(chuàng)建索引, 創(chuàng)建后再試,基本控制在1m左右。
? ? ? ?
第三:SET NOCOUNT
??????????????
定義:
阻止在結(jié)果集中返回可顯示受 Transact-SQL 語(yǔ)句或存儲(chǔ)過(guò)程影響的行計(jì)數(shù)的消息。?
?????????????? 語(yǔ)法: SET NOCOUNT { ON | OFF } ??????????
??????????????
備注:
當(dāng) SET NOCOUNT 為 ON 時(shí),不返回計(jì)數(shù)。當(dāng) SET NOCOUNT 為 OFF 時(shí),返回計(jì)數(shù)。即使當(dāng) SET NOCOUNT 為 ON 時(shí),也更新 @@ROWCOUNT 函數(shù)。當(dāng) SET NOCOUNT 為 ON 時(shí),將不向客戶端發(fā)送存儲(chǔ)過(guò)程中每個(gè)語(yǔ)句的 DONE_IN_PROC 消息。如果存儲(chǔ)過(guò)程中包含一些并不返回許多實(shí)際數(shù)據(jù)的語(yǔ)句,網(wǎng)絡(luò)通信流量便會(huì)大量減少,因此,將 SET NOCOUNT 設(shè)置為 ON 可顯著提高性能。SET NOCOUNT 指定的設(shè)置是在執(zhí)行或運(yùn)行時(shí)生效,而不是在分析時(shí)生效。??????????
??????????????
權(quán)限:
要求具有 public 角色的成員身份。
??????????????
注意點(diǎn):
ExecuteNonQuery();將得不到返回值,此時(shí)可以利用存儲(chǔ)過(guò)程的返回參數(shù)來(lái)獲得.
??????????????
缺點(diǎn)
:當(dāng)我們執(zhí)行一條更新或者是刪除語(yǔ)句時(shí),一般判斷是否成功都是根據(jù)這個(gè)返回的受影響的行來(lái)判斷,現(xiàn)在當(dāng)SET NOCOUNT 為 ON 時(shí),不返回計(jì)數(shù),只能利用輸出參數(shù)來(lái)判斷了.
?????????????? 優(yōu)點(diǎn): 如果存儲(chǔ)過(guò)程中包含一些并不返回許多實(shí)際數(shù)據(jù)的語(yǔ)句,網(wǎng)絡(luò)通信流量便會(huì)大量減少,因此,將 SET NOCOUNT 設(shè)置為 ON 可顯著提高性能。
? ?????
總結(jié):
可能有的朋友會(huì)認(rèn)為本人只是在這一味的copy MSDN,其實(shí)從本質(zhì)上說(shuō)是這樣,但
copy
并不代表一無(wú)是處,經(jīng)過(guò)我的工作經(jīng)驗(yàn)來(lái)看,我們開(kāi)發(fā)中遇到的很多問(wèn)題其實(shí)在MSDN上都有說(shuō)明,但
為什么我們總是在MSDN上找不到答案呢?
這就是因?yàn)槲覀儾欢阉飨嚓P(guān)的關(guān)鍵字,為此我將我的一些學(xué)習(xí)所得寫(xiě)出來(lái),希望和我一樣不太會(huì)用MSDN的朋友共進(jìn)步.
?注:本文引用MSDN
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
