Sql-Server
尋求幫助以了解此 SQL 腳本中發生的情況,該腳本顯示有關 SQL Server 自動增長事件的關鍵資訊
下面是程式碼:
DECLARE @current_tracefilename VARCHAR(500); DECLARE @0_tracefilename VARCHAR(500); DECLARE @indx INT; SELECT @current_tracefilename = path FROM sys.traces WHERE is_default = 1; SET @current_tracefilename = REVERSE(@current_tracefilename); SELECT @indx = PATINDEX('%\%', @current_tracefilename); SET @current_tracefilename = REVERSE(@current_tracefilename); SET @0_tracefilename = LEFT(@current_tracefilename, LEN(@current_tracefilename) - @indx) + '\log.trc'; SELECT DatabaseName, te.name, Filename, CONVERT(DECIMAL(10, 3), Duration / 1000000e0) AS TimeTakenSeconds, StartTime, EndTime, (IntegerData * 8.0 / 1024) AS 'ChangeInSize MB', ApplicationName, HostName, LoginName FROM ::fn_trace_gettable(@0_tracefilename, DEFAULT) t INNER JOIN sys.trace_events AS te ON t.EventClass = te.trace_event_id WHERE(trace_event_id >= 92 AND trace_event_id <= 95) ORDER BY t.StartTime;
當我的團隊遇到自動增長事件但找不到原因時,我在 SQL Shack 中偶然發現了這一點。該腳本在追踪導致自動增長的原因方面非常有幫助,但它使用了許多我沒有使用過的概念,例如 PATH 函式、::fn_trace_gettable 和 PATINDEX()。
這些是完整的步驟
- 聲明
DECLARE @current_tracefilename VARCHAR(500); DECLARE @0_tracefilename VARCHAR(500); DECLARE @indx INT;
- 獲取預設跟踪的完整路徑
SELECT @current_tracefilename = path FROM sys.traces WHERE is_default = 1;
- 找到
\
路徑中最後一個的位置並使用它來去除文件名。SET @current_tracefilename = REVERSE(@current_tracefilename); SELECT @indx = PATINDEX('%\%', @current_tracefilename); SET @current_tracefilename = REVERSE(@current_tracefilename); SET @0_tracefilename = LEFT(@current_tracefilename, LEN(@current_tracefilename) - @indx) + '\log.trc';
這個比較奇怪,不需要用
SET @current_tracefilename
兩次,就這樣SELECT @indx = PATINDEX('%\%', REVERSE(@current_tracefilename));
SELECT DatabaseName, te.name, Filename, CONVERT(DECIMAL(10, 3), Duration / 1000000e0) AS TimeTakenSeconds, StartTime, EndTime, (IntegerData * 8.0 / 1024) AS 'ChangeInSize MB', ApplicationName, HostName, LoginName FROM ::fn_trace_gettable(@0_tracefilename, DEFAULT) t
- 這個表值函式(更準確地說
sys.fn_trace_gettable
)返回跟踪文件的內容
- 加入
trace_events
以獲得活動名稱。INNER JOIN sys.trace_events AS te ON t.EventClass = te.trace_event_id WHERE(trace_event_id >= 92 AND trace_event_id <= 95) ORDER BY t.StartTime;
最好
log.trc
直接從 中實際選擇跟踪文件的路徑sys.traces
,儘管它僅在跟踪目前正在執行時才會顯示。並且
SERVERPROPERTY('InstanceDefaultLogPath')
可能是獲取預設日誌和跟踪位置的更簡單方法。