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

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