測試分頁、索引、鎖定行為時常需大量測試資料。純 T-SQL WHILE 迴圈即可在資料庫端完成百萬筆插入,無需外部程式,簡單且可控。
DECLARE @i INT = 1;
WHILE @i <= 1000000
BEGIN
INSERT INTO dbo.Manager (UserName, UserPwd) VALUES ('kgdiwss', '250');
SET @i = @i + 1;
END;
DECLARE @i INT = 1, @batchSize INT = 10000;
SET NOCOUNT ON; -- 關閉 "n rows affected" 訊息,大幅提升速度
WHILE @i <= 1000000
BEGIN
-- 批次插入減少編譯/日誌刷新開銷
INSERT INTO dbo.TestTable (Id, Name, CreateDate, Status, Score)
SELECT TOP (@batchSize)
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) + @i - 1,
'User_' + CAST(ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) + @i - 1 AS VARCHAR(20)),
DATEADD(day, -ABS(CHECKSUM(NEWID())) % 3650, GETDATE()), -- 過去 10 年隨機日期
ABS(CHECKSUM(NEWID())) % 3, -- 0/1/2 隨機狀態
ABS(CHECKSUM(NEWID())) % 100 -- 0-99 隨機分數
FROM sys.all_objects a CROSS JOIN sys.all_objects b; -- 產生足夠行數的虛擬表
SET @i = @i + @batchSize;
-- 可選:每批次檢查點、日誌備份、RAISERROR 進度回報
END;
| 技巧 | 效果 |
|---|---|
SET NOCOUNT ON | 減少網路封包與用戶端處理,速度提升 20-30% |
| 批次插入 (批次 1000-10000) | 單筆迴圈每次編譯/日誌刷新,批次僅一次,速度提升 10-50 倍 |
| 簡單復原模式 | ALTER DATABASE TestDB SET RECOVERY SIMPLE 減少日誌寫入 |
| 最小化索引 | 插入前刪除非必要索引,插入後重建 |
TABLOCK 提示 | INSERT INTO dbo.TestTable WITH (TABLOCK) ... 取得表鎖,最小化日誌 (需簡單/大量記錄復原模式) |