許多開發者初學 T-SQL 時,習慣用 WHILE 迴圈逐筆 INSERT 測試資料。雖然語法直觀,但在生產環境或大量資料場景下,這是效能殺手。本文示範基本寫法,並解析為何應改用集合式操作。
DECLARE @i INT = 1;
WHILE @i < 30
BEGIN
INSERT INTO dbo.test (userid) VALUES (@i);
SET @i += 1;
END;
INSERT INTO dbo.test (userid)
VALUES (1), (2), (3), ..., (29);
WITH nums AS (
SELECT 1 AS n
UNION ALL
SELECT n + 1 FROM nums WHERE n < 29
)
INSERT INTO dbo.test (userid)
SELECT n FROM nums
OPTION (MAXRECURSION 0);
INSERT INTO dbo.test (userid)
SELECT TOP (1000000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM sys.all_objects a CROSS JOIN sys.all_objects b;
BEGIN TRAN ... COMMIT 在迴圈外層,減少日誌刷盤次數INSERT ... SELECTTABLOCK 與 BULK_LOGGED 復原模式(需評估 HA/DR 影響)WHILE 迴圈適合邏輯複雜、無法集合化的極少數場景。99% 的批次寫入需求,集合式 INSERT 搭配數列產生器才是專業選擇。下次寫測試資料腳本時,請直接複製方案三並調整 TOP (N)。