首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server Profiler (事件探查器) 完整實戰指南:從開啟到效能調優、死鎖分析、審計追蹤

     編輯:關於SqlServer

前言

SQL Server Profiler (事件探查器) 是**圖形化追蹤工具**,捕獲執行個體內部事件 (SQL 批次、RPC、死鎖、錯誤、登入/登出...),支援**即時監控、篩選、重播、匯出**、為效能調優、問題診斷、安全審計提供核心可見性。

核心能力

  • **效能監控**:識別高耗時查詢、高 CPU/讀寫/持續時間事件
  • **T-SQL 偵錯**:逐步執行、檢視參數值、臨時表內容
  • **慢查詢識別**:依 Duration/Reads/CPU/Writes 排序
  • **開發階段驗證**:單步執行驗證邏輯、參數傳遞
  • **生產問題複現**:生產環境追蹤 → 儲存追蹤檔/表 → 測試環境**重播** → 不影響生產負載
  • **安全審計**:登入成功/失敗、權限檢查失敗、物件存取審計

系統需求與限制

  • **最小可用磁碟空間**:10 MB (低於此值所有功能停止)
  • **追蹤開銷**:事件越多、欄位越多、持續越久 → 開銷指數級增長。**生產環境必須篩選**
  • **重播要求**:追蹤必須包含 Event Class (如 RPC:Starting, SQL:BatchStarting)、TextData、BinaryData、SPID、StartTime、EndTime 等關鍵欄位

三種開啟方式

  1. 企業管理器 / SSMS:工具列 → **SQL Server Profiler** 圖示 (紅色十字架/放大鏡)
  2. 開始功能表:Microsoft SQL Server 2005/2008/2012/2014/2016/2017/2019 → Performance Tools → SQL Server Profiler
  3. 命令列:profiler.exe (安裝目錄 Shared 資料夾)

建立追蹤標準流程

  1. **檔案 → 新增追蹤** → 連線對話框:伺服器名稱、驗證模式 (Windows/SQL)
  2. **追蹤屬性 → 一般頁面**:
    • 追蹤名稱
    • **使用範本** (見下表) 或自訂
    • 儲存至:檔案 (.trc) / 資料表 — **生產環境建議檔案,避免寫入負載**
    • 啟用追蹤停止時間 (防止忘記關閉佔用資源)
  3. **事件選取頁面**:
    • 勾選所需事件類別 (見推薦組合)
    • **設定欄位篩選** (關鍵!) — 如 Duration > 1000000 (微秒)、DatabaseID = 5、LoginName = 'AppUser'
    • 欄位選擇:僅保留分析所需欄位 (減少記錄體積)
  4. **執行** → 即時顯示事件流

推薦追蹤範本與自訂組合

場景範本核心事件類別關鍵篩選
一般效能基線TSQL_DurationSQL:BatchCompleted, RPC:CompletedDuration > 100ms
慢查詢深度分析TSQL_ReplaySQL:BatchStarting/Completed, RPC:Starting/Completed, Showplan XMLDuration > 1s, Reads > 10000
死鎖分析TSQL_LocksDeadlock Graph, Lock:Deadlock, Lock:Deadlock Chain無 (需捕獲所有)
審計追蹤Security_AuditAudit Login/Logout, Audit Schema Object Access, Audit Database Object AccessFailed = 1
預存程序偵錯TSP_DebugSP:StmtStarting/Completed, SP:Starting/CompletedObjectName = 'usp_XXX'

進階技巧

1. 伺服器端追蹤 (零 GUI 開銷,適合長時間生產採集)


-- 建立追蹤定義
DECLARE @TraceID INT, @MaxFileSize BIGINT = 50; -- 50 MB per file
EXEC sp_trace_create @TraceID OUTPUT, 0, N'D:\Traces\PerfBaseline', @MaxFileSize, NULL;

-- 設定事件 (10=RPC:Completed, 12=SQL:BatchCompleted)
EXEC sp_trace_setevent @TraceID, 10, 1, 1;  -- TextData
EXEC sp_trace_setevent @TraceID, 10, 13, 1; -- Duration
EXEC sp_trace_setevent @TraceID, 10, 16, 1; -- Reads
EXEC sp_trace_setevent @TraceID, 10, 17, 1; -- Writes
EXEC sp_trace_setevent @TraceID, 10, 18, 1; -- CPU
EXEC sp_trace_setevent @TraceID, 12, 1, 1;
EXEC sp_trace_setevent @TraceID, 12, 13, 1;
EXEC sp_trace_setevent @TraceID, 12, 16, 1;
EXEC sp_trace_setevent @TraceID, 12, 17, 1;
EXEC sp_trace_setevent @TraceID, 12, 18, 1;

-- 設定篩選: Duration > 1 秒 (微秒)
EXEC sp_trace_setfilter @TraceID, 13, 0, 4, 1000000;

-- 啟動
EXEC sp_trace_setstatus @TraceID, 1;

-- 停止並關閉 (排程作業中執行)
EXEC sp_trace_setstatus @TraceID, 0;
EXEC sp_trace_setstatus @TraceID, 2;

2. 追蹤檔分析:匯入資料表 + SQL 查詢


SELECT * INTO TraceTable
FROM fn_trace_gettable('D:\Traces\PerfBaseline.trc', DEFAULT);

-- Top 10 耗時查詢
SELECT TOP 10 TextData, Duration, Reads, Writes, CPU, StartTime
FROM TraceTable
WHERE EventClass IN (10, 12)  -- RPC:Completed, SQL:BatchCompleted
ORDER BY Duration DESC;

3. 重播測試:生產追蹤 → 測試環境重播

  • 檔案 → 開啟 → 選擇追蹤檔 → **重播** → 連線測試伺服器
  • 選擇重播執行緒數、順序/平行模式
  • **注意**:重播不會重現確切的鎖定/封鎖時序,僅重現 SQL 陳述式執行順序與參數

常見誤區與避坑

誤區事實正確做法
「預設範本足夠用」預設範本事件過多、無篩選,生產環境會拖垮效能**必須自訂事件 + 嚴格篩選 + 限制欄位**
「追蹤不影響效能」每個事件觸發需複製資料到緩衝區、寫入檔案/表**僅追蹤必要事件、設定 Duration 閾值、限制時間**
「重播能完全複現死鎖」重播僅執行 SQL 文本,無法重現精確的併發時序與鎖定順序死鎖分析請用 Deadlock Graph 事件 或 Trace Flag 1222/1204
「追蹤表比檔案快」寫入資料表需交易記錄、鎖定、索引維護,**檔案通常更快**生產採集用檔案,分析時再匯入表

Extended Events (XEvents) — 現代替代者 (SQL 2008+)

  • 架構:非同步、低開銷、核心整合、支援環狀緩衝區/事件檔案/Event Tracing for Windows (ETW)
  • SSMS 物件總管 → 管理 → Extended Events → 新增工作階段
  • **建議**:新專案直接採用 XEvents,Profiler 維護模式 (Microsoft 已宣布不再新增功能)

總結

SQL Server Profiler 是 DBA/開發者的「聽診器」。核心心法:**明確目標 → 選對範本 → 嚴格篩選 → 限制欄位 → 設定停止條件 → 離開時必須停止**。配合伺服器端追蹤、追蹤檔匯入分析、Extended Events 現代化遷移,構建全生命週期可見性體系。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved