2012-04-25 67 views
5

可能重複插入x行快x次:
Multiple INSERT statements vs. single INSERT with multiple VALUES爲什麼插入單行比一次

Im做批量處理的交易一些性能分析的博客文章我注意到當你使用批量插入語句時,它的執行速度比等效的單個SQL語句慢得多。

如下插入1000行大約需要3秒

INSERT TestEntities (TestDate, TestInt, TestString) VALUES 
('2011-1-1', 11, 'dsxcvzdfdfdfsa'), 
('2011-1-1', 11, 'dsxcvzdfdfdfsa'), 
('2011-1-1', 11, 'dsxcvzdfdfdfsa') 

插入1000行如下需要130MS

INSERT TestEntities (TestDate, TestInt, TestString) VALUES ('2011-1-1', 11, 'dsxcvzdfdfdfsa') 
INSERT TestEntities (TestDate, TestInt, TestString) VALUES ('2011-1-1', 11, 'dsxcvzdfdfdfsa') 
INSERT TestEntities (TestDate, TestInt, TestString) VALUES ('2011-1-1', 11, 'dsxcvzdfdfdfsa') 

這僅出現在您使用批量插入表上的第一次發生但其重現性好。

還要注意數據IM插入是隨機的(但相同的兩個查詢)

編輯:

繼承人我的攝製情況下使用這種情況下的僞隨機數據IM:https://gist.github.com/2489133

+1

@MikaelEriksson是啊,這是同一個問題密切生病這一個 – 2012-04-25 11:52:32

+0

@blam看看在http://計算器。com/q/8635818/1070291它更深入地解釋了這個問題,它也有查詢計劃 – 2012-04-25 12:23:26

回答

3

根據Multiple INSERT statements vs. single INSERT with multiple VALUES這裏的問題是,當SQL獲取查詢它來計算第一執行的查詢計劃。對於單個插入來說,這是很好的和快速的,因爲沒有太多可計算的東西,並且在它構建查詢計劃之後,它只是重新使用它1000次。

在批處理場景中,需要將3k個變量構建到查詢計劃中,這需要花費更長的時間進行計算。

@MartinSmith指出的一個瘋狂特性是,在一個批量大小最多爲250行的地方有一個神奇的性能數字,這意味着計劃計算非常低。

打破了我上面的查詢到5個200行報表減少了執行時間,以94ms爲1000行

0

第一個是作爲單個事務運行的單個語句。第二個是1000條語句,1000條事務的開銷。當您將第二個文件包含在begin transactioncommit transaction中時,差異應該變小。

+0

這兩個都在事務中運行,但奇怪的是第二個是速度更快的一個20倍。我期望第一個更快,它的小負載和單一語句如您所說 – 2012-04-25 11:47:27

+0

請注意,他聲稱單一的所有功能於一身的聲明運行SLOWER。 – 2012-04-25 11:48:56

+1

@HotLicks:擁有'values'的人只有1筆交易,我希望這筆交易更快。如果兩者都已經在一次交易中,像盧克的評論,這個答案沒有提供任何解釋。 – Andomar 2012-04-25 11:50:55

1

第一項是一個必須解析的大語句,因此花費的額外時間在於一個大分析工作而不是1000個小工作的開銷。

雖然我沒有測試所有1000行,但我測試了3,發現單個插入語句的執行計劃更大。另請注意,對於3個單獨的插入,只有一個小計劃被重用。

enter image description here

enter image description here