我正在使用1000個INSERT語句之間的性能對比:1000個值多個INSERT語句與多個值單INSERT
INSERT INTO T_TESTS (TestId, FirstName, LastName, Age)
VALUES ('6f3f7257-a3d8-4a78-b2e1-c9b767cfe1c1', 'First 0', 'Last 0', 0)
INSERT INTO T_TESTS (TestId, FirstName, LastName, Age)
VALUES ('32023304-2e55-4768-8e52-1ba589b82c8b', 'First 1', 'Last 1', 1)
...
INSERT INTO T_TESTS (TestId, FirstName, LastName, Age)
VALUES ('f34d95a7-90b1-4558-be10-6ceacd53e4c4', 'First 999', 'Last 999', 999)
..versus使用單INSERT語句:
INSERT INTO T_TESTS (TestId, FirstName, LastName, Age)
VALUES
('db72b358-e9b5-4101-8d11-7d7ea3a0ae7d', 'First 0', 'Last 0', 0),
('6a4874ab-b6a3-4aa4-8ed4-a167ab21dd3d', 'First 1', 'Last 1', 1),
...
('9d7f2a58-7e57-4ed4-ba54-5e9e335fb56c', 'First 999', 'Last 999', 999)
令我大吃一驚的是,結果與我的想法相反:
- 1000 INSERT語句:290毫秒。
- 1 INSERT語句有1000個VALUES:2800毫秒。
測試與SQL Server Profiler中直接執行在MSSQL Management Studio中用於測量(和我使用的SqlClient,這更加suprising考慮所有的DAL層往返了從C#代碼運行它類似的結果)
這是否合理或以某種方式解釋?如何來,一個據說更快的方法導致10倍(!)更差的性能?
謝謝。
編輯:兩個附加執行計劃:
這些都是乾淨的測試中,沒有什麼是並行執行,沒有重複的數據(每個查詢都有不同的數據,當然爲了避免簡單的緩存) – Borka
有沒有涉及到任何觸發器? –
我將一個程序轉換爲TVP以超過1000的限制值,並獲得了很大的性能提升。我會進行比較。 – Paparazzi