SET NOCOUNT { ON | OFF }
OFF(10 rows affected))| 設定 | 網路流量 | @@ROWCOUNT | 用戶端顯示 |
|---|---|---|---|
| ON | 大幅減少(不送 DONE_IN_PROC 封包) | 正常更新 | 不顯示 rows affected |
| OFF | 正常 | 正常更新 | 顯示 rows affected |
存儲過程包含多條 INSERT/UPDATE/DELETE/SELECT 時,每條敘述預設都會傳回一個 DONE_IN_PROC 封包給用戶端。開啟 NOCOUNT ON 可消除這些封包,對於:
效能提升明顯,有時可達 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
SET NOCOUNT ON,避免巢狀觸發器產生大量訊息DONE_IN_PROC 會產生額外處理開銷SET NOCOUNT ONSET NOCOUNT OFF 維持環境乾淨(雖連線結束自動重置)sp_configure 'user options', 512 可在伺服器層級預設開啟(影響所有連線)SET NOCOUNT ON 是零成本、高收益的存儲過程優化標準動作,請養成肌肉記憶。