Sql-Server
加快 INSERT
我需要一種快速、同步、持續時間最短的方法來插入表。我嘗試過的(“盲目”)是:
- 表上沒有任何索引
- 切換到簡單日誌記錄(從完整日誌記錄)
我使用的測試場景由 100 個連接組成,每個連接執行一個 INSERT,然後等待 0.1 秒,然後無限期地再次等待。每個“插入器”記錄執行時間。
查看執行時間,我有時會在插入時看到 1.5 甚至 10 秒(作為例外情況),否則我看到的是典型的 0.2 秒。
進一步的背景:
- SQL Server 2008 R2 Express(afaik express 版本僅限制 DB 大小 (4GB)、RAM (1GB) 和邏輯 CPU (1))
- 機器:具有 7200 RPM HDD、8 GB RAM 和 8 個邏輯 CPU 的筆記型電腦,託管伺服器和客戶端
- 該表由 1 個 BigInt ID(身份)、一個 NVARCHAR(100) 欄位和 NVARCHAR(MAX)(此上的 INSERT 具有 10k 有效負載)和一個 NVARCHAR(MAX)(INSERT 處的 30k 有效負載)列組成
我應該在哪裡尋找對此類流程性能的進一步改進?
很多人在評論中補充了很多優點。
將您的事務日誌分離到不同的驅動器上。這對於筆記型電腦來說會很困難。如果你不能做到這一點,那就為筆記型電腦買一個 SSD,這應該會讓你的生活變得更好。
將您的數據和日誌文件預先增長到目標數量。如果您希望將 1GB 的數據添加到您的數據庫,請使您的數據和日誌文件至少為 1.5GB 才能開始。數據和日誌文件的自動增長是性能的殺手,很可能是您看到這些 10 秒性能“阻塞”的原因。SQL Management Studio 有一些內置報告(我相信您可以右鍵點擊數據庫,然後選擇報告 -> 磁碟使用情況),其中應該有一個包含所有自動增長事件的表。)
如果您可以在每個客戶端的基礎上批量插入,請使用 SqlBulkCopy 或 BULK INSERT 語句來執行此操作。
應該沒有理由說明你的表不應該有一個聚集的主鍵。SQL Server 應該能夠以相當高效的方式處理 IDENTITY 列上的聚集索引。