盡管查詢的執(zhí)行計劃提供了詳細(xì)的處理策略的單獨步驟涉及的估計相對開銷,但是它沒有提供查詢實際的CPU使用、磁盤讀寫或持續(xù)時間等開銷。
還有其他比運行Profiler更直接手機性能數(shù)據(jù)的方法
一、客戶統(tǒng)計
客戶統(tǒng)計將計算機作為服務(wù)器的一個客戶端,從這個角度出發(fā)去捕捉執(zhí)行信息。這意味著任何記錄事件包括通過網(wǎng)絡(luò)傳送數(shù)據(jù)的時間,而不僅僅是SQL Server本身所花費的時間。
要使用客戶統(tǒng)計,只需要單擊=》查詢=》包含客戶統(tǒng)計。
現(xiàn)在,每當(dāng)運行一個查詢,就會收集一個限定的數(shù)據(jù)集,包括執(zhí)行事件,影響的行數(shù)、到服務(wù)器的往返次數(shù)等。進(jìn)一步,查詢的每次執(zhí)行在客戶統(tǒng)計選項卡上被分別顯示,有一列將多次的執(zhí)行進(jìn)行累加并顯示所收集數(shù)據(jù)的平均值。該統(tǒng)計也以箭頭方式顯示一次運行和下次運行之間事件或計數(shù)是否改變。
執(zhí)行查詢語句,顯示的客戶端信息如下:
雖然捕捉客戶統(tǒng)計可能收集數(shù)據(jù)的有用手段,但這是個有限的數(shù)據(jù)集,沒有辦法顯示一次執(zhí)行與另一次的差別。甚至可能運行完全不同的一個查詢,它的數(shù)據(jù)可能與其他的混合在一起,從而使平均值失去意義。如果需要這么做可以重置客戶統(tǒng)計=》查詢=》重置客戶端統(tǒng)計實現(xiàn)。
二、執(zhí)行時間
Duration和CPU都代表著查詢的時間因素。要獲得關(guān)于解析、編譯和執(zhí)行查詢的總時間詳細(xì)信息,可以通過SET STATISTICS TIME實現(xiàn):
執(zhí)行時間CPU 時間 = 125毫秒表示Profiler工具和服務(wù)器跟蹤選項所提供的CPU值。相似地對應(yīng)的占用時間 = 1065毫秒表示其他機制提供的Duration值。
分析和編譯時間意味著優(yōu)化器重用這個查詢現(xiàn)有的執(zhí)行計劃,因此不必花費任何時間來再次解析和編譯時間。如果查詢第一次執(zhí)行,那么優(yōu)化器必須首先解析查詢語法,然后編譯它以生成執(zhí)行計劃。這個可以調(diào)用DBCC FREEPROCCACHE清楚緩存,然后重新運行查詢:
不應(yīng)該在生產(chǎn)系統(tǒng)上運行DBCC FREEPROCCACHE,除非準(zhǔn)備胡斐無謂的開銷重新編譯系統(tǒng)上的每個查詢,某種程度上,這個系統(tǒng)重啟的開銷相同。
三、統(tǒng)計IO
為了減少讀操作總數(shù),發(fā)現(xiàn)查詢中訪問的所有表以及對應(yīng)的讀操作數(shù)量是有用的。
要獲得執(zhí)行查詢所化花費的IO可以通過操作GUI得到:
查詢=》查詢選項=》設(shè)置STATISTICS IO:
當(dāng)然也可以通過編程的方式開啟:
在解讀STATISTICS IO輸出時,多半會參考邏輯讀操作數(shù)量,有時候也會參考掃描計數(shù)。但即使每個掃描執(zhí)行很少的邏輯讀,STATISTICS IO所提供的邏輯讀總數(shù)仍然可能會很高。如果每個掃描的邏輯讀數(shù)量對于特定的表很小,那么可能無法進(jìn)一步地改進(jìn)該表的索引機制。物理讀操作和預(yù)讀數(shù)量在數(shù)據(jù)無法在內(nèi)存中找到時不為0,但是一旦數(shù)據(jù)填寫到內(nèi)存,物理讀和預(yù)讀將趨近于0。
知道查詢使用的所有表及其對應(yīng)的讀操作數(shù)量還有另一個好處。SQL Server機器上運行的重要服務(wù)和后臺應(yīng)用通常會影響所觀測的查詢處理時間,Duration和CPU值在表結(jié)構(gòu)或數(shù)據(jù)沒有變化的情況下重新執(zhí)行相同查詢,結(jié)果常常有很大的波動。
在優(yōu)化各步驟期間,需要一個沒有被動的開銷數(shù)字作為參考。讀操作數(shù)量在固定的表結(jié)構(gòu)和數(shù)據(jù)下的查詢多次執(zhí)行之間不會有變化。例如,如果執(zhí)行SELECT語句10次,可能得到10個不同的Duration和CPU數(shù)值,但Reads每次都保持一致。
下面還給出一些常用的計數(shù)及清除緩存的方法:
操作 | 說明 |
DBCC DROPCLEANBUFFERS | 清空數(shù)據(jù)緩存 |
DBCC FREEPROCCACHE | 清空編譯緩存 ? |
? 其他統(tǒng)計操作說明:
選項 | 說明? |
SET NOCOUNT | 當(dāng)?SET?NOCOUNT?為?ON?時,不返回計數(shù)(表示受?Transact-SQL?語句影響的行數(shù))。當(dāng)?SET?NOCOUNT?為?OFF?時,返回計數(shù)。 |
SET ARITHABORT | 在查詢執(zhí)行過程中發(fā)生溢出或被零除錯誤時終止查詢。 |
SET NOEXEC | 編譯但不執(zhí)行語句 |
SET SHOWPLAN_TEXT | 不執(zhí)行 Transact-SQL 語句。但由 SQL Server 返回有關(guān)如何執(zhí)行語句的詳細(xì)信息。 |
SET PARSEONLY | 解析但不編譯或執(zhí)行語句 |
SET STATISTICS TIME | 統(tǒng)計執(zhí)行語句所消耗時間 |
SET STATISTICS IO | 統(tǒng)計執(zhí)行語句所消耗IO |
SET CONCAT_NULL_YIELDS_NULL | 控制是將串聯(lián)結(jié)果視為 Null 還是空字符串值。 ON:SELECT 'abc' + NULL; 返回NULL;OFF:SELECT 'abc' + NULL; 返回abc |
SET TRANSACTION ISOLATION LEVEL | 控制到 SQL Server 的連接發(fā)出的 Transact-SQL 語句的鎖定行為和行版本控制行為。 |
SET DEADLOCK_PRIORITY | 指定當(dāng)前會話與其他會話發(fā)生死鎖時繼續(xù)處理的相對重要性。 |
SET LOCK TIMEOUT | 指定語句等待鎖釋放的毫秒數(shù)。 |
SET QUERY_GOVERNOR_COST_LIMIT | 數(shù)值或整數(shù)值,用于指定可以運行查詢的最長時間。查詢調(diào)控器不允許執(zhí)行估計開銷超過該值的任何查詢。如果指定此選項為 0(默認(rèn)),將關(guān)閉查詢調(diào)控器,并且允許所有查詢無限期運行。 |
更多的設(shè)置,可以查看MSDN: http://technet.microsoft.com/zh-cn/library/ms186736(v=sql.90).aspx
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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