每次查需要優化的SQL都需要上外網,通過Profiler,報表或者DMV執行特定sql來查找,來回跑很麻煩,能不能在本地直接監控外網的好性能的SQL呢?方法是有的,我們可以通過把Profiler跟蹤轉換爲T-SQL腳本,在外網做定時任務,就可以定時執行跟蹤,然後通過執行特定的腳本將跟蹤保存的文件中的數據導出到數據庫的指定表中,這樣,就可以web後臺遠程查看這個指定表中的耗性能的SQL了。詳細見下面的操作步驟。
二、操作步驟
1.從SQL SERVER PROFILER按照自己指定的條件創建跟蹤
2.選擇文件-導出-編寫跟蹤對應的腳本-選擇對應的版本號,得到跟蹤對應的T-SQL腳本
3.修改最大文件大小,set @maxfilesize = 20
設置跟蹤的時間,set @DateTime = DateAdd(mi, 20, getdate())
設置文件滾動更新,參數爲2
以年月日作爲文件名
set @FileName = DateName(year,getdate()) + DateName(month, getdate()) + DateName(day, getdate()) --以日期做文件名
set @Prefix = N'D:\ClockingProfiler\' + @FileName
得到的參數放入下面的SQL中,創建跟蹤:
exec @rc = sp_trace_create @TraceID output, 2, @Prefix, @maxfilesize, @Datetime
修改後得到下面的SQL:
-- Create a Queue declare @rc int declare @TraceID int declare @maxfilesize bigint declare @DateTime datetime declare @FileName nvarchar(20) declare @Prefix nvarchar(256) set @DateTime = DateAdd(mi, 20, getdate()) --跟蹤分鐘 set @maxfilesize = 20 -- Please replace the text InsertFileNameHere, with an appropriate -- filename prefixed by a path, e.g., c:\MyFolder\MyTrace. The .trc extension -- will be appended to the filename automatically. If you are writing from -- remote server to local drive, please use UNC path and make sure server has -- write access to your network share set @FileName = DateName(year,getdate()) + DateName(month, getdate()) + DateName(day, getdate()) --以日期做文件名 set @Prefix = N'D:\ClockingProfiler\' + @FileName select @Prefix --參數表示允許文件滾動更新 exec @rc = sp_trace_create @TraceID output, 2, @Prefix, @maxfilesize, @Datetime if (@rc != 0) goto error -- Client side File and Table cannot be scripted -- Set the events declare @on bit set @on = 1 exec sp_trace_setevent @TraceID, 10, 15, @on exec sp_trace_setevent @TraceID, 10, 16, @on exec sp_trace_setevent @TraceID, 10, 1, @on exec sp_trace_setevent @TraceID, 10, 9, @on exec sp_trace_setevent @TraceID, 10, 17, @on exec sp_trace_setevent @TraceID, 10, 2, @on exec sp_trace_setevent @TraceID, 10, 10, @on exec sp_trace_setevent @TraceID, 10, 18, @on exec sp_trace_setevent @TraceID, 10, 11, @on exec sp_trace_setevent @TraceID, 10, 12, @on exec sp_trace_setevent @TraceID, 10, 13, @on exec sp_trace_setevent @TraceID, 10, 6, @on exec sp_trace_setevent @TraceID, 10, 14, @on exec sp_trace_setevent @TraceID, 12, 15, @on exec sp_trace_setevent @TraceID, 12, 16, @on exec sp_trace_setevent @TraceID, 12, 1, @on exec sp_trace_setevent @TraceID, 12, 9, @on exec sp_trace_setevent @TraceID, 12, 17, @on exec sp_trace_setevent @TraceID, 12, 6, @on exec sp_trace_setevent @TraceID, 12, 10, @on exec sp_trace_setevent @TraceID, 12, 14, @on exec sp_trace_setevent @TraceID, 12, 18, @on exec sp_trace_setevent @TraceID, 12, 11, @on exec sp_trace_setevent @TraceID, 12, 12, @on exec sp_trace_setevent @TraceID, 12, 13, @on -- Set the Filters declare @intfilter int declare @bigintfilter bigint exec sp_trace_setfilter @TraceID, 10, 0, 7, N'SQL Server Profiler - 1073afc5-8f3b-4f95-a683-006cd83f9bc2' --設置cpu大於等於ms set @intfilter = 100 exec sp_trace_setfilter @TraceID, 18, 0, 4, @intfilter -- Set the trace status to start exec sp_trace_setstatus @TraceID, 1 -- display trace id for future references select TraceID=@TraceID goto finish error: select ErrorCode=@rc finish: Go
4.導出得到的跟蹤文件到指定的表中,若表不存在,先創建再導入;否則,直接導入。
declare @FileName nvarchar(20) declare @Prefix nvarchar(256) set @FileName = DateName(year,getdate()) + DateName(month, getdate()) + DateName(day, getdate()) --以日期做文件名 set @Prefix = N'D:\ClockingProfiler\' + @FileName + '.trc' --從跟蹤的文件中導入跟蹤數據到表中 IF OBJECT_ID(N'DigitalLibDB.dbo.DigitalLibDB_trc', N'U') IS NULL BEGIN SELECT * INTO DigitalLibDB_trc From fn_trace_gettable(@Prefix, default); END ELSE BEGIN INSERT INTO DigitalLibDB_trc SELECT * FROM fn_trace_gettable(@Prefix, default); END
5.創建定時作業,第一步執行步驟3中的SQL, 執行完成後跳轉到第二步,第二步執行步驟4中的SQL,如下圖。
三、小結
至此,就可以通過web後臺遠程查看外網數據庫表的耗性能耗io的sql,方便優化。當然,前提是你公司先得有這個web後臺。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~如果您有什麼問題,歡迎在下面評論,我們一起討論,謝謝~ ~
~如果您覺得還不錯,不妨點下右下方的推薦,有您的鼓勵我會繼續努力的~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~