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

SQL Server 2008 R2 批次插入多筆資料的高效寫法

     編輯:關於SqlServer

傳統寫法痛點

逐筆 INSERT INTO ... VALUES (...) 產生大量網路往返與編譯開銷,效能低落。

VALUES 子句多列語法 (SQL Server 2008+ 原生支援)

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');
  • 單一陳述式、單一交易、單一編譯
  • 最多 1000 列資料列 (超過請分批或改用 bulk insert)

動態產生 VALUES 清單技巧

若資料來源在另一張表,可用 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)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved