3️⃣1️⃣ MS-SQL 效能查詢指令
===
###### tags: `31` `MS-SQL`
```sql=
--SELECT * FROM sys.traces
--Trace資料檢查
DECLARE @TraceName nvarchar(128)
DECLARE @TracePath nvarchar(256)
DECLARE @TracePath_default nvarchar(256)
DECLARE @TraceFolder nvarchar(256)
/******************** 設定參數 ********************/
DECLARE @LoginName nvarchar(64)='' --登入帳號,沒填寫就不過濾
DECLARE @TextData_Filler nvarchar(64)='' --過濾TextData欄位,沒填寫就不過濾
DECLARE @TraceFlag tinyint = 0 --0 檢查 Duration 1 檢查Deadlock
DECLARE @TraceDayRange tinyint = 1 --要取得從現在算起幾天內的資料
/******************** 設定參數結尾 ********************/
--要查詢的追蹤名稱/檔名
SET @TraceName = CASE WHEN @TraceFlag = 0
THEN 'DurationLog'
WHEN @TraceFlag = 1
THEN 'Deadlock' END
SET @TracePath = (SELECT TOP 1 path FROM sys.traces WHERE path LIKE '%'+@TraceName+'%')
SET @TraceFolder=SUBSTRING(@TracePath,1, CHARINDEX(@TraceName,@TracePath)-1)
--根據串接紀錄規則重新組成整個trace log的檔案名稱(無流水號的檔案名稱)
SET @TracePath_default = @TraceFolder+@TraceName+'.trc'
--SELECT SUBSTRING(@TracePath,1, CHARINDEX(@TraceName,@TracePath)-1), @TraceName, @TracePath
PRINT @TracePath_default
--取得過去時間範圍的資料
SELECT TOP 1000
ISNULL(StartTime,EndTime) AS LogTime
,CONVERT(DECIMAL(18,2),(Duration / 1000000.0)) [Duration Sec]
,*
FROM fn_trace_gettable(@TracePath_default, default)
WHERE ISNULL(StartTime,EndTime) >= DATEADD(day,@TraceDayRange * -1,GETDATE())
AND ISNULL(LoginName,'')= CASE WHEN ISNULL(@LoginName,'') <> '' THEN @LoginName ELSE ISNULL(LoginName,'') END
AND TextData LIKE '%'+@TextData_Filler+'%'
ORDER BY ISNULL(StartTime,EndTime) DESC
/*
--只取deadlock的xml資料部分
SELECT TOP (100) TextData,StartTime
FROM fn_trace_gettable(@TracePath_default, default)
WHERE StartTime >= DATEADD(dd,-24,GETDATE())
AND EventClass=148
ORDER BY EndTime DESC
*/
```