# Sql Profiler 每日自動側錄滿足特定過濾條件SQL 背景說明如下,資料庫有效能問題,無法長時間遠端開著 Sql Profiler 進行追蹤,處理方式改用 Sql 排程與 sp_trace_create 追蹤每日 08:00~18:30 間系統 duration > 1000ms 的 SQL 查詢, 大略操作如下: * 新增 SQL 排程於每日 08:00 執行. * 執行內內容如大略如附件 SQL,附件SQL 可以用 Sql Profiler 設定好錄製的條件然後匯出在手動做一些修正. * `SQL追蹤.sql` 摘要說明: ```SQL declare @rc int; declare @TraceID int; /*設定 trc 上限 100MB */ declare @maxfilesize bigint = 100; /* 動態使用日期產生要 存放的路徑檔名 這樣就可以達到一天一個 trc 檔,方便識別也避免單一檔案太大 我這邊用的路徑是 /var/MsSqlBackUp/ 是因為這是一臺跑在 Linux 上的 MSSQL , 如果 Windwos 可能是 C:\... 或 S:\ 看實際主機環境而定. */ declare @tracefile nvarchar(256) = '/var/MsSqlBackUp/' + CONVERT(VARCHAR(8), GETDATE(), 112) + '_' + Replace(CONVERT(VARCHAR(5), GETDATE(), 114),':',''); /* 動態設定追蹤停止於 18:30 停止 當時間到 18:30 或者 trc 達到 100MB 這個追蹤就會停止 */ declare @stoptime datetime = convert(nvarchar(10),getdate(),121) + ' 18:30'; .................... 略 這邊會有很多類似下面的指令,基本要不就查文件要不就透過 Sql Profiler 設定好匯出,不然光看那些數字應該很難猜是哪一個追蹤項目 exec sp_trace_setevent @TraceID, 10, 11, @on .................... 略 -- Set the Filters declare @bigintfilter bigint /* 設定 duration > 1000ms 的 SQL 查詢才記錄下來,畢竟般追效能先不管 Disk I/O ,或者 CPU 消耗高的,基本上都會讓回應時間變長,所以一般會先從 duration 作基本的過濾, 不然 trc 的太多一方面加 Disk I/O 的負擔,也增加未來的分析跟閱讀 trc 的負擔. 至於要 > 3000ms > 2000ms > 1000ms 多少才合理沒有絕對標準,也許一開始很慘的時候先從 3000 跳... 先把大條的處理完再逐步往下追蹤下去. */ set @bigintfilter = 1000*1000 /* 10,000 是 10ms*/ exec sp_trace_setfilter @TraceID, 13, 0, 4, @bigintfilter .................... 略. ```