Sql-Server

尋求幫助以了解此 SQL 腳本中發生的情況,該腳本顯示有關 SQL Server 自動增長事件的關鍵資訊

  • August 25, 2021

下面是程式碼:

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

  • 加入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')可能是獲取預設日誌和跟踪位置的更簡單方法。

引用自:https://dba.stackexchange.com/questions/298548