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

SQL Server SET NOCOUNT ON/OFF 完整指南:存儲過程效能優化必備技巧

     編輯:關於SqlServer

指令語法與預設行為

SET NOCOUNT { ON | OFF }
  • 預設:OFF
  • ON:不傳回「受影響資料列數」訊息(DONE_IN_PROC)
  • OFF:傳回計數訊息(如 (10 rows affected))

核心影響機制

設定網路流量@@ROWCOUNT用戶端顯示
ON大幅減少(不送 DONE_IN_PROC 封包)正常更新不顯示 rows affected
OFF正常正常更新顯示 rows affected

效能提升原理

存儲過程包含多條 INSERT/UPDATE/DELETE/SELECT 時,每條敘述預設都會傳回一個 DONE_IN_PROC 封包給用戶端。開啟 NOCOUNT ON 可消除這些封包,對於:

  • 高頻呼叫的存儲過程
  • 大量批次操作(迴圈 INSERT 等)
  • 頻寬受限環境

效能提升明顯,有時可達 20%~50% 以上。

標準使用模板

CREATE PROCEDURE usp_Example
AS
BEGIN
    SET NOCOUNT ON;  -- 開頭開啟
    
    -- 業務邏輯
    UPDATE Table1 SET Col1 = 'A' WHERE Id < 100;
    INSERT INTO Table2 (Col1) SELECT Col1 FROM Table1;
    DELETE FROM Table3 WHERE Status = 0;
    
    SET NOCOUNT OFF;  -- 結尾恢復(可選,良好習慣)
END

驗證範例

-- 建立測試表
CREATE TABLE #Test (Id INT IDENTITY, Val VARCHAR(10));

-- 關閉 NOCOUNT(預設)
SET NOCOUNT OFF;
INSERT #Test (Val) VALUES ('A');  -- 顯示 (1 rows affected)

-- 開啟 NOCOUNT
SET NOCOUNT ON;
INSERT #Test (Val) VALUES ('B');  -- 無訊息
INSERT #Test (Val) VALUES ('C');  -- 無訊息

-- 驗證 @@ROWCOUNT 仍正常
DECLARE @cnt INT;
INSERT #Test (Val) VALUES ('D');
SELECT @cnt = @@ROWCOUNT;  -- @cnt = 1
PRINT 'Rows affected: ' + CAST(@cnt AS VARCHAR);  -- 正常輸出 1

常見誤區與注意事項

  • 誤區:「NOCOUNT ON 會影響 @@ROWCOUNT」→ 錯誤,@@ROWCOUNT 完全不受影響
  • 執行階段設定:非剖析階段,動態生效
  • 觸發器內:同樣建議加 SET NOCOUNT ON,避免巢狀觸發器產生大量訊息
  • ODBC/OLE DB/ADO.NET:用戶端驅動程式接收 DONE_IN_PROC 會產生額外處理開銷

實戰建議

  1. 所有存儲過程開頭統一加 SET NOCOUNT ON
  2. 結尾加 SET NOCOUNT OFF 維持環境乾淨(雖連線結束自動重置)
  3. 使用 sp_configure 'user options', 512 可在伺服器層級預設開啟(影響所有連線)
  4. 除錯階段可暫時關閉觀察 rows affected,上線前務必開啟

SET NOCOUNT ON 是零成本、高收益的存儲過程優化標準動作,請養成肌肉記憶。

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