一、SQL Profiler工具簡介
SQL Profiler是一個圖形界面和一組系統存儲過程,其作用如下:
1.圖形化監視SQL Server查詢;
2.在後台收集查詢信息;
3.分析性能;
4.診斷像死鎖之類的問題;
5.調試T-SQL語句;
6.模擬重放SQL Server活動;
也可以使用SQL Profiler捕捉在SQL Server實例上執行的活動。這樣的活動被稱為Profiler跟蹤。
1、Profiler跟蹤
從開始=》所有程序=》Microsoft SQL Server 2008=》性能工具打開Profiler工具,也可以打開SQL Server Management Studio=》工具=》SQL Server Profiler。
然後選擇文件=》新建=》跟蹤打開一個連接窗口,選擇將要跟蹤的服務器實例然後連接。打開如下“跟蹤屬性”對話框。
如果有許多跟蹤,可以提供一個跟蹤名稱來幫助在以後進行分類。不同的跟蹤模板可幫助建立用於不同目的的跟蹤。
打開跟蹤屬性窗口後,單擊“事件選擇”選項卡,為跟蹤提供更詳細的定義。
2、事件
一個事件表現SQL Server中執行的各種活動。這些活動可以簡單地分類為事件類,游標事件,鎖事件,存儲過程事件和T-SQL事件是常見的事件類。
對於性能分析,主要對SQL Server上執行的各種活動的資源壓力水平的事件感興趣。資源壓力主要包含如下內容:
SQL活動涉及哪一類的CPU使用?使用了多少內存?涉及多少I/0操作?SQL活動執行了多長時間?特定的查詢執行的頻率有多高?查詢面對哪類錯誤和警告?
下面給出跟蹤查詢結束的事件:
事件類 事件 說明 Stored Procedures RPC:Completed RPC完成事件 SP:Completed 存儲過程完成事件 SP:StmtCompleted 在存儲過程中一條SQL語句完成事件 T-SQL SQL:BatchCompleted T-SQL批完成事件 SQL:StmtCompleted 一條T-SQL語句完成事件RPC事件表示存儲過程使用遠程過程調用(RPC)機制通過OLEDB命令執行。如果一個數據庫應用程序使用T-SQL EXECUTE語句執行一個存儲過程,那麼存儲過程將被轉化為一個SQL批而不是一個RPC。RPC請求通常比EXECUTE請求快,因為它繞過了SQL Server中的許多語句解析和參數處理。
T-SQL由一條或多條T-SQL語句組成。語句或T-SQL語句在存儲過程中也是單獨和離散的。用SP:StmtCompleted或SQL:StmtCompleted事件捕捉單獨的語句可能是代價很高的操作,這取決於單獨語句的數量。假設系統中的每個存儲過程包含且只有一條T-SQL語句。在這種情況下,完成的語句集合相當小。現在假定過程中有多條語句,而且這些過程中有些使用其他語句調用其他過程。收集所有這些額外的數據現在變成系統上非常厲害的負載。在生產機上一定要慎用。
現在回到那個事件選擇面板,只有已經被選擇的事件才會被顯示。如果想顯示所有可供選擇的事件,則只需選中“顯示所有事件”單選框,要添加一個跟蹤事件,在Event列中查找一個事件類下的事件,並單擊其左邊的檢查框;要刪除不需要的事件,取消選中的事件選擇框。
光分類就有好多的說:
下面給出其他一些與性能診斷有關的事件:
事件類 事件 說明 Security Audit(安全審計) Audit Login(登錄審計) 記錄用戶連接到SQL Server或斷開連接時數據庫的連接 Audit Logout(注銷審計) Sessions(會話) ExistingConnection(現有連接) 表示所有在跟蹤開始之間連接到SQL Server的用戶 Cursors(游標) CursorImplicitConversion(游標隱含轉換) 表明創建的游標類型與所請求的類型個不同 Errors and Warnings(錯誤和警告) Attention(注意) 表示由於客戶端撤銷查詢或者數據庫連接破壞引起請求中斷 Exception(異常) 表明SQL Server發生了異常 Execution Warning(執行警告) 表明在查詢或存儲過程執行期間出現了警告 Hash Warning(哈希警告) 表明hash操作發生了錯誤 Missing Column Statistics(列統計丟失) 表明優化器要求的確定處理策略用的類統計丟失 Missing Join Predicate(連接斷言丟失) 表明查詢在兩個表沒有連接斷言情況下執行 Sort Warning(排序警告) 表明像SELECT這樣的查詢中執行排序操作沒有合適的內存 Locks(鎖) Lock:Deadlock(死鎖) 標志著死鎖的出現 Lock:Deadlock Chain(死鎖鏈) 顯示產生死鎖的查詢鏈條 lock:Timeout(鎖超時) 表示鎖已經超過其超時參數,該參數由SETLOCK_TIMEOUT timeout_perious(ms)命令設置 Stored Procedures(存儲過程) SP:Recompile(重編譯) 表明用於一個存儲過程的執行計劃必須重編譯,原因是執行計劃不存在,強制的重編譯,或者現有的執行計劃不能重用SP:Starting(開始)
SP:StmtStarting(語句開始)
分別表示一個SP:StmtStarting存儲過程和存儲過程中的一條SQL語句的開始。他們對於識別開始單因為一個操作導致Attention事件未能結束的查詢很有用 Transactions(事物) SQLTransaction(SQL事務) 提供數據庫事務的信息,包括事務開始/結束的時間、事務持續事件等信息3、事件列
事件以不同的特性(被稱為數據列)來表現。數據列表現一個事件的不通特性,如事件的類、用於該事件的SQL語句、事件的資源開銷以及事件來源。
數據列 說明 EventClass(事件類) 事件類型,如SQL:StatementCompleted TextData 事件所用的SQL語句,如SELECT * FROM Person CPU 事件的CPU開銷(以ms表示),如對一個SELECT語句,CPU=100表示該語句執行100ms Reads 為一個事件所執行的邏輯讀操作數量。例如對一個SELECT語句,Reads=800表示該語句需要800次邏輯讀操作 Writes 為一個事件所執行的邏輯寫操作數量 Duration 事件的執行時間(ms) SPID 用於該事件的SQL Server進程標識符 StartTime 事件開始的時間以上是常用的數據列,另外還有一些不太常用的數據列:
BinaryData(二進制數據) IntegerData(整數數據) EventSubClass(事件子類) DatabaseID(數據庫標識符) ObjectID(對象標識符) IndexID(索引標識符) TransactionID(事務標識符) Error(錯誤) EndTime(結束時間)
列數據可以重新安排以符合你自己所喜歡的風格,要控制列數據的安放,單擊組織列按鈕,將打開如下對話框。可以單擊Up和Down按鈕修改列的位置,將列移入Groups意味著它將成為一個合計列。
4、列篩選器
除了為一個Profiler跟蹤定義事件和數據列之外,還可以定義各種過濾條件。這些條件幫助縮小跟蹤的輸出,這往往是一個好主意。下面給出常用過濾條件列表。
事件 過濾條件實例 用處 ApplicationName(應用程序名稱) Not like:SQL Profiler 過濾Profiler生成的事件。這是默認的行為 DatabaseID(數據庫標識符) Equals:<ID of the database to monitor> 過濾特定數據庫生成的事件。數據庫ID:SELECT DB_IC('Northwind') Duration(持續時間) Greater than or equal:2 對於性能分析,經常會為一個大的工作負載捕捉跟蹤,在大的跟蹤中,許多事件日志具有比所感興趣更小的持續周期(Duration)。過濾這個事件日志,因為幾乎沒有可用於優化這些SQL活動的余地 Reads(讀操作數) Greater than or equal"2 過濾讀操作較小的事件 SPIDEquals:<Database users to monitor>
定位由特定的數據庫用戶發送的查詢下面給出設置過濾列的方式:
5、跟蹤模板
SQL Server Profiler可以用自定義事件、數據列和過濾器創建一個跟蹤模板,然後定義一個新的跟蹤,然後重用跟蹤個模板來捕捉一個跟蹤。定義新跟蹤模板的過程類似於定義新跟蹤,步驟如下:
創建一個新的跟蹤。和前面一樣定義事件,數據列和過濾器。從文件=》另存為菜單將跟蹤定義保存為跟蹤模板。
SQL Server Profiler將自動將新的模板加入到其模板列表中。
新建模板:
保存模板:
查看:
6、跟蹤數據
定義了跟蹤以後,單擊運行按鈕將開始捕捉事件並將其顯示在屏幕上,可以看到一系列滾動事件,可以在我們稱之為SQL TV的屏幕上看到系統的運行,可以像DVD播放機一樣或多或少地控制跟蹤,可以使用工具欄上的按鈕暫停、開始和停止跟蹤,甚至可以在工作室暫停跟蹤並修改它。
一旦完成了SQL Server活動的捕捉,就可以將跟蹤輸出保存為一個跟蹤文件或一個跟蹤表。保存到跟蹤文件的跟蹤輸出是一個原生的格式,可以由Profiler打開以分析SQL查詢。將跟蹤的輸出保存為一個表,也可以使Profiler在跟蹤表上用SELECT語句來分析其中的SQL查詢。
具體的操作為 文件 =》 另存為 =》 跟蹤表。選擇你希望存入的的數據庫和表,然後你就可以像普通表一樣執行各種SQL查詢。
二、跟蹤的自動化
Profiler GUI簡化了Profiler跟蹤的收集。不幸的是,這種簡易性有其代價。Profiler工具捕捉的事件進入內存中的緩沖以便通過網絡反饋給GUI。GUI依賴網絡,網絡流量可能降低系統的速度並導致緩沖被填滿。這將在較小的程度上影響服務器的性能。進一步地,當緩沖被填滿,服務器將開始丟棄事件以避免嚴重地影響服務器性能。
1、使用GUI捕捉跟蹤
可以以兩種方法兩創建一個腳本化跟蹤-手工或者使用GUI。在輕松地滿足腳本的所有要求之間,最簡易的方法就是使用Profiler工具的GUI,需要如下步驟:
定義一個跟蹤;單擊文件=》導出=》腳本跟蹤定義;必須選擇目標服務器類型, SQL Server2005/2008;未文件命名,並保存它;
這些不走將生成所有步驟跟蹤並將其輸出到一個文件所需的所有腳本命令。
使用Management Studio手工啟動新的跟蹤:
打開文件;使用系統的相關名稱和路徑替換InsertFileNameHere;執行腳本,它將返回帶有TraceId的單列結果集;
可以通過SQL Agent自動化這個腳本的執行,甚至可以使用sqlcmd.exe使用程序從命令行運行這個腳本。不管使用哪種方法,這個腳本將啟動跟蹤。如果沒有定義跟蹤停止時間,就必須使用TraceId手工停止跟蹤。
2、使用存儲過程捕捉跟蹤
查看上一節中定義的腳本,會看到以特定順序條用的一系列命令:
sp_trace_create:創建一個跟蹤定義;sp_trace_setevent:添加事件和事件列到跟蹤中;sp_trace_setfilter:將過濾器應用到跟蹤;
一旦定義了SQL跟蹤持續到跟蹤被停止。因為SQL跟蹤作為一個後端進程持續運行,Managerment Studio會話不需要保持打開。可以使用SQL Server內建函數fn_trace_getinfo確定正在運行的跟蹤,查詢如下:
代碼如下:
SELECT * FROM ::fn_trace_getinfo(default);
輸出圖:
fn_trace_getinfo函數的輸出中,不同的traceid的數量表示SQL Server上活動跟蹤的數量。
第三列(value)表示跟蹤是否正在運行(value=1)或者停止(value=0)。可以通過執行存儲過程sp_trace_setstatus停止特定的跟蹤,如traceid=1,如下所示:
代碼如下:
EXEC sp_trace_setstatus 1,0;
在跟蹤停止之後,它的定義必須執行sp_trace_setstatus關閉並且從服務器中刪除,如下所示:
代碼如下:
EXEC sp_trace_setstatus 1,2;
為了驗證跟蹤成功地停止,重新執行fn_trace_getinfo函數,並確定該函數的輸出不包含該traceid。
這種技術所創建的跟蹤文件的格式與Profiler創建的跟蹤文件相同。因此,這種跟蹤文件可以與Profiler創建的文件以相同的方式進行分析。
使用前一小節所概述的存儲過程捕捉SQL跟蹤,避免了與Profiler GUI相關的開銷。而且還比Profiler工具提供了管理SQL跟蹤計劃的更大靈活性。
三、結合跟蹤和性能監視器輸出
如果自動化了性能監視器捕捉到文件,又自動化了Profiler數據捕捉到一個文件。它們覆蓋相同的時間段,那麼就可以在SQL Profiler GUI中一起使用它們。確定跟蹤有StartTime和EndTime數據字段,按照以下步驟進行:
打開跟蹤文件(當然前提是你曾經 另存為=》跟蹤文件);單擊 文件=》 導入性能數據;選擇導入的性能監視器文件;
執行上面的操作將打開如下所示對話框,這裡允許選擇包含性能監視器計數器。
選擇了想要包含的計數器之後,單擊OK按鈕將一起打開Profiler和性能監視器數據。現在,可以開始一起使用跟蹤數據和性能監視器數據。如果在頂部窗口選擇一個時間,它將在性能 監視器中放置一條紅線,顯示數據中事件發生的時間。相反,可以單擊性能監視器數據,表示那段 時間的事件將被選中。這些性能工作得很好,將可以在調整過程中定時使用它們以確認瓶頸和壓力 點,並確定導致這些壓力的特定查詢。
四、SQL Profiler使用要點
SQL Profiler使用建議如下:
限制事件和數據列的數量;拋棄用於性能分析的啟動事件;限制跟蹤的輸出大小;避免聯機數據列排序;遠程運行Proflier;
1、限制事件和數據列
在跟蹤SQL查詢時,可以通過過濾事件和數據列來決定哪些SQL活動應該被捕捉。選擇更多的事件造成了大量的跟蹤開銷。數據列不會增加太多的開銷,因為它們只是一個事件類的特性。因此,知道每個所希望跟蹤事件的原因,並根據必要性來選擇事件是很重要的。
最小化捕捉的事件數量避免SQL Server浪費寶貴的資源帶寬去生成所有的事件。捕捉像鎖和執行計劃這樣的事件時應該小心進行,因為這些事件會使跟蹤輸出變得非常大並降低SQL Server的性能。
過濾分兩個階段:預過濾由SQL Server執行,後過濾由用戶執行。預過濾是捕捉SQL Server活動的聯機階段,預過濾提供多種溢出:
降低了SQL Server的性能影響,因為生成有限數量的時間;降低跟蹤輸出大小;簡化後過濾操作,首先因為要捕捉的事件更少了;
預過濾的唯一缺點是,可能丟失一些徹底分析中需要的重要信息。
2、丟棄性能分析所用的啟動事件
所用於性能分析的信息圍繞一個查詢的資源開銷。想SP:StmtStarting這樣的啟動事件不提供這種信息,因為只有在事件完成之後,才能計算I/O量、CPU負載和查詢的持續時間。所以,在跟蹤運行緩慢的查詢以進行性能分析時,不需要捕捉啟動事件。這種信息由對應的完成事件來提供。
什麼情況下適合捕捉啟動事件呢?應該在預期某些SQL查詢因為錯誤而不能結束執行,或者頻繁發現Attention事件的時候捕捉啟動事件。Attention事件一般表示用戶中途撤銷了查詢或者查詢超時,可能因為查詢運行了太長時間。
3、限制跟蹤輸出大小
除了預過濾事件和數據列,其他過濾條件也會限制跟蹤輸出的大小。同樣,限制大小可能丟失所關注的總體系統狀態中感興趣的事件。但是,如果關注於開銷較大的查詢,過濾器是有幫助的。
通過過濾器,能夠篩選執行事件》=2或邏輯讀數量》=100的查詢,因為消耗太低的查詢基本上不需要優化。
4、避免在線數據列排序
在性能分析期間,一般在不同的數據列(如Duration、CPU、Reads)上排序以確定相應數字最大的查詢。如果脫機排序,就能降低在與SQL Server交互時必須進行的Profiler活動。排序捕捉到的SQL跟蹤輸出的方法如下:
捕捉跟蹤,不做任何排序或分組;另存為跟蹤輸出到一個跟蹤文件;打開跟蹤文件並按照需要在特定的數據列上排序或分組跟蹤文件輸出;
5、遠程運行Profiler
直接在生產服務器上運行測試工具一般不是一個好辦法。Profiler有一個大型的用戶界面,因此,在其他機器上運行它更好。與系統監視器相似,Profiler不應該通過終端服務會話來運行,因為這樣工具的主要部分仍然在服務器上運行。在直接將跟蹤輸出收集到一個文件時,保存在Profiler運行的本地文件上。這仍然是比通過系統存儲過程將Profiler作為服務器端跟蹤來運行更加資源密集的操作。使用系統存儲過程仍然是最好的選擇。
6、限制使用某些事件
某些事件的開銷比其他的事件大。由於生成的查詢的特性,語句完成事件的開銷可能非常大。需要謹慎地使用,特別是在已經遇到壓力的系統上,必須謹慎使用的事件有:Showplan XML事件,Performance:Showplan XML、Performance:Showplan XML for Query Compile和Performance:Showplan XML sTATISTICS Prifile。雖然這些事件可能有用,但是不要在生產機器上使用它們。
五、沒有Profiler的情況下查詢性能度量
建立一個跟蹤能收集許多數據供以後使用,但是這種收集可能代價很大,必須等待結果。
如果要立即捕捉系統的性能度量,特別是關於查詢性能的度量,那麼動態管理視圖sys.dm_exec_query_stats正式所需要的。如果還需要查詢運行及其單獨開銷的歷史記錄,那麼跟蹤仍然是更好的工具。但是,如果只需要知道這時候運行時間最長的查詢或者最多的物理讀操作,則可以從sys.dm_exec_query_stats得到這些信息。
因為sys.dm_exec_query_stats只是一個視圖,可以簡單地對其進行查詢並獲得服務器上查詢計劃統計的信息。
列 描述 Plan_handle 引用執行計劃的指針 Creation_time 計劃創建的時間 Last_execution time 查詢最後一次使用的計劃時間 Execution_count 計劃已經使用的次數 Total_worker_time 從創建起計劃使用的CPU時間 Total_logical_reads 從創建器計劃使用的讀操作數量 Total_logical_writes 從創建器計劃使用的寫操作數量 Query_hash 可用於識別有相似邏輯的查詢的一個二進制hash Query_plan_hash 可用於識別有相似邏輯的計劃的一個二jinzhihash為了過濾從sys.dm_exec_query_stats返回的信息,需要將其連接到其他動態管理函數上,如sys.dm_exec_sql_text可以顯示與計劃相關的查詢文本,sys.dm_query_plan顯示用於查詢的執行計劃。一旦連接到其他DMF,可以限制希望過濾得數據庫或過程。