SQL Server Profiler (事件探查器) 是**圖形化追蹤工具**,捕獲執行個體內部事件 (SQL 批次、RPC、死鎖、錯誤、登入/登出...),支援**即時監控、篩選、重播、匯出**、為效能調優、問題診斷、安全審計提供核心可見性。
Event Class (如 RPC:Starting, SQL:BatchStarting)、TextData、BinaryData、SPID、StartTime、EndTime 等關鍵欄位profiler.exe (安裝目錄 Shared 資料夾).trc) / 資料表 — **生產環境建議檔案,避免寫入負載**Duration > 1000000 (微秒)、DatabaseID = 5、LoginName = 'AppUser'| 場景 | 範本 | 核心事件類別 | 關鍵篩選 |
|---|---|---|---|
| 一般效能基線 | TSQL_Duration | SQL:BatchCompleted, RPC:Completed | Duration > 100ms |
| 慢查詢深度分析 | TSQL_Replay | SQL:BatchStarting/Completed, RPC:Starting/Completed, Showplan XML | Duration > 1s, Reads > 10000 |
| 死鎖分析 | TSQL_Locks | Deadlock Graph, Lock:Deadlock, Lock:Deadlock Chain | 無 (需捕獲所有) |
| 審計追蹤 | Security_Audit | Audit Login/Logout, Audit Schema Object Access, Audit Database Object Access | Failed = 1 |
| 預存程序偵錯 | TSP_Debug | SP:StmtStarting/Completed, SP:Starting/Completed | ObjectName = 'usp_XXX' |
-- 建立追蹤定義
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;
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;
| 誤區 | 事實 | 正確做法 |
|---|---|---|
| 「預設範本足夠用」 | 預設範本事件過多、無篩選,生產環境會拖垮效能 | **必須自訂事件 + 嚴格篩選 + 限制欄位** |
| 「追蹤不影響效能」 | 每個事件觸發需複製資料到緩衝區、寫入檔案/表 | **僅追蹤必要事件、設定 Duration 閾值、限制時間** |
| 「重播能完全複現死鎖」 | 重播僅執行 SQL 文本,無法重現精確的併發時序與鎖定順序 | 死鎖分析請用 Deadlock Graph 事件 或 Trace Flag 1222/1204 |
| 「追蹤表比檔案快」 | 寫入資料表需交易記錄、鎖定、索引維護,**檔案通常更快** | 生產採集用檔案,分析時再匯入表 |
SQL Server Profiler 是 DBA/開發者的「聽診器」。核心心法:**明確目標 → 選對範本 → 嚴格篩選 → 限制欄位 → 設定停止條件 → 離開時必須停止**。配合伺服器端追蹤、追蹤檔匯入分析、Extended Events 現代化遷移,構建全生命週期可見性體系。