USE AdventureWorks;
GO
SELECT * INTO temp_trc
FROM fn_trace_gettable('C:\temp\my_trace.trc', DEFAULT);
GO
DEFAULT 參數表示讀取所有 rollover 檔案(my_trace_1.trc、my_trace_2.trc...)。
USE AdventureWorks;
GO
SELECT IDENTITY(INT, 1, 1) AS RowNumber, * INTO temp_trc
FROM fn_trace_gettable('C:\temp\my_trace.trc', DEFAULT);
GO
適合後續分頁查詢或做為主鍵參考。
注意:SQL 2005/2008 追蹤檔為 9.0 格式,Read80Trace 僅支援 8.0 格式,執行會報錯 is not a valid 8.0 trace file format。
Read80Trace -f -Slocalhost -Usa -PpassWord -Dtracedb -IE:\profiler\mytrace.trc
| 參數 | 說明 |
|---|---|
-f | 關閉 RML 報告檔產生(節省磁碟空間) |
-S | 目標 SQL Server(緊接主機名,無空格) |
-U/-P | 登入帳密(需建立資料庫權限) |
-D | 匯入目標資料庫名稱 |
-I | 追蹤檔路徑(自動讀取同目錄下 rollover 檔) |
WARNING: The following trace events were not captured: SQL:BatchStarting, RPC:Starting, SP:StmtStarting...
ERROR: Event 10 does not contain the following required column(s): 15
ERROR: Performance analysis has been disabled because one or more events is missing required columns.
原因:追蹤事件/資料欄未勾選完整。
解決:Profiler 建立追蹤時,務必勾選以下事件與欄位:
SQL:BatchStarting、SQL:BatchCompleted、RPC:Starting、RPC:CompletedSP:StmtStarting、SP:StmtCompleted、SP:CompletedShowplan StatisticsAudit Login、Audit LogoutExistingConnectionEventClass、TextData、ApplicationName、NTUserName、LoginNameCPU、Reads、Writes、DurationClientProcessID、SPID、StartTime、EndTimeDatabaseID、ObjectID、NestLevel、IntegerDataRead80Trace 匯入後產生的 tblBatches、tblUniqueBatches 表可搭配以下預存程式快速找出高耗能語句:
CREATE PROC usp_GetAccessPattern @duration_filter INT = -1
AS
BEGIN
DECLARE @sum_total FLOAT, @sum_cpu FLOAT, @sum_reads FLOAT, @sum_duration FLOAT, @sum_writes FLOAT;
SELECT @sum_total = COUNT(*) * 0.01,
@sum_cpu = SUM(cpu) * 0.01,
@sum_reads = SUM(reads) * 0.01,
@sum_writes = SUM(writes) * 0.01,
@sum_duration = SUM(duration) * 0.01
FROM tblBatches WHERE duration >= @duration_filter;
SELECT
COUNT(*) AS exec_count,
STR(COUNT(*)/@sum_total,4,1)+'%' AS exec_ratio,
SUM(cpu) AS total_cpu, STR(SUM(cpu)/@sum_cpu,4,1)+'%' AS cpu_ratio,
SUM(reads) AS total_reads, STR(SUM(reads)/@sum_reads,4,1)+'%' AS reads_ratio,
SUM(duration) AS total_duration, STR(SUM(duration)/@sum_duration,4,1)+'%' AS dur_ratio,
textdata
INTO #query_stats
FROM (
SELECT b.reads, b.cpu, b.duration, b.writes, CONVERT(VARCHAR(2000), u.NormText) AS textdata
FROM tblBatches b
INNER JOIN tblUniqueBatches u ON b.HashId = u.hashid
WHERE b.duration > @duration_filter
) B
GROUP BY textdata;
PRINT 'Top 10 by CPU+Reads+Duration';
SELECT TOP 10 * FROM #query_stats ORDER BY cpu_ratio+reads_ratio+dur_ratio DESC;
-- 其餘 Top 10 分類略...
END
| 維度 | fn_trace_gettable | Read80Trace |
|---|---|---|
| 支援版本 | SQL 2005~最新版 | 僅 SQL 2000 |
| 部署複雜度 | 零部署,T-SQL 直接呼叫 | 需安裝工具、MSXML 4.0 |
| 分析功能 | 需自行撰寫查詢 | 內建報表、預存程序 |
| 推薦度 | ⭐⭐⭐⭐⭐ | ⭐(歷史參考) |
現代環境請直接使用 Extended Events (XEvents) 取代 Profiler/Trace,效能開銷更低、功能更強,並可直接查詢
sys.fn_xe_file_target_read_file導入分析。