逐筆 INSERT INTO ... VALUES (...) 產生大量網路往返與編譯開銷,效能低落。
INSERT INTO dbo.TestIP (IPAddress) VALUES
('1.192.47.125'),
('1.58.113.154'),
('1.85.189.111'),
('1.86.37.156'),
('101.84.100.87'),
('106.83.49.191');
若資料來源在另一張表,可用 XML/字串串接快速產生:
SELECT DISTINCT '(''' + LoginIP + '''),'
FROM dbo.Login
WHERE LoginName IN (
SELECT DISTINCT LoginName FROM dbo.Login WHERE LoginIP = '61.170.245.61'
);
複製結果貼上至 INSERT INTO TestIP VALUES ... 即可。
| 方案 | 適用量級 | 優點 | 缺點 |
|---|---|---|---|
| VALUES 多列 | < 1,000 列 | 語法簡單、無需額外工具 | 受 1000 列限制、編譯記憶體隨列數增長 |
| INSERT ... SELECT | 任意 | 集合運算、可並行、最小日誌 | 需來源表存在 |
| BCP / BULK INSERT | > 10 萬列 | 最高吞吐、可最小日誌、支援格式檔 | 需檔案存取、權限設定 |
| SqlBulkCopy (.NET) | > 10 萬列 | 程式碼控制、批次大小可調、資料流式處理 | 需撰寫應用程式 |
SET NOCOUNT ON 減少網路封包TABLOCK 提示可獲得最小日誌記錄 (簡單/大量記錄模式下)DISABLE TRIGGER / DROP INDEX 再重建,大幅縮短耗時sys.dm_exec_requests 觀察等待類型 (如 LOG_WRITE、PAGEIOLATCH)