首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL 效能小技巧:在 T-SQL 中精確測量陳述式執行時間

     編輯:關於SqlServer

需求場景

快速比較兩種寫法效能、檢測特定查詢耗時、在預存程序中記錄關鍵步驟執行時間,無需開啟 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;

注意事項

  • SYSDATETIME() 精度 100ns,優於 GETDATE() (3.33ms)。
  • 測量包含編譯、執行、網路傳輸時間;純引擎時間請看執行計畫 Elapsed Time 或 SET STATISTICS TIME ON。
  • 首次執行含編譯成本,建議先 Warm-up 執行一次 再計時。
  • 併發環境下結果有波動,需多次執行取中位數。

替代方案對照

方法精度適用場景干擾度
變數 + SYSDATETIME()微秒Ad-hoc、預存程序內嵌極低
SET STATISTICS TIME ON毫秒SSMS 分析單一批次低 (僅輸出訊息)
Extended Events (sql_statement_completed)微秒生產環境持續監控、彙總分析極低
Query Store毫秒歷史趨勢、計畫變更比較無 (背景收集)

結語

內嵌計時變數是開發階段快速驗證效能的輕量利器;上線前仍應配合 Extended Events/Query Store 建立基準線。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved