快速比較兩種寫法效能、檢測特定查詢耗時、在預存程序中記錄關鍵步驟執行時間,無需開啟 Profiler/Extended Events。
DECLARE @StartTime DATETIME2(7) = SYSDATETIME(); -- 高精度啟動時間
-- ===== 待測量的 SQL 陳述式 =====
SELECT TOP 1000 * FROM Sales.OrderDetails
WHERE OrderDate >= '2024-01-01' AND OrderDate < '2024-02-01';
-- ===============================
SELECT DATEDIFF(MILLISECOND, @StartTime, SYSDATETIME()) AS ElapsedMs;
DECLARE @T0 DATETIME2(7) = SYSDATETIME();
-- 步驟 1
SELECT * INTO #Tmp FROM LargeTable WHERE Type = 'A';
DECLARE @T1 DATETIME2(7) = SYSDATETIME();
-- 步驟 2
CREATE INDEX IX_Tmp_Code ON #Tmp(Code);
DECLARE @T2 DATETIME2(7) = SYSDATETIME();
-- 步驟 3
SELECT * FROM #Tmp WHERE Code = 'X';
DECLARE @T3 DATETIME2(7) = SYSDATETIME();
SELECT
DATEDIFF(MICROSECOND, @T0, @T1) AS Step1_SelectInto_us,
DATEDIFF(MICROSECOND, @T1, @T2) AS Step2_CreateIndex_us,
DATEDIFF(MICROSECOND, @T2, @T3) AS Step3_Select_us,
DATEDIFF(MILLISECOND, @T0, @T3) AS Total_Ms;
GETDATE() (3.33ms)。Elapsed Time 或 SET STATISTICS TIME ON。| 方法 | 精度 | 適用場景 | 干擾度 |
|---|---|---|---|
| 變數 + SYSDATETIME() | 微秒 | Ad-hoc、預存程序內嵌 | 極低 |
| SET STATISTICS TIME ON | 毫秒 | SSMS 分析單一批次 | 低 (僅輸出訊息) |
| Extended Events (sql_statement_completed) | 微秒 | 生產環境持續監控、彙總分析 | 極低 |
| Query Store | 毫秒 | 歷史趨勢、計畫變更比較 | 無 (背景收集) |
內嵌計時變數是開發階段快速驗證效能的輕量利器;上線前仍應配合 Extended Events/Query Store 建立基準線。