可能重复:
Multiple INSERT statements vs. single INSERT with multiple VALUES
我正在对博客文章的批处理事务进行一些性能分析,我注意到当你使用批量插入语句时,它的执行速度比等效的单个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行需要130毫秒
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')
这只会在您第一次在表格上使用批量插入时发生,但可重现。
另请注意,数据插入是随机的(但两个查询都相同)
修改
继承了我的repro案例,其中使用虚拟随机数据im for this case:https://gist.github.com/2489133
答案 0 :(得分:3)
根据Multiple INSERT statements vs. single INSERT with multiple VALUES的问题是,当SQL获取查询时,它必须在首次执行时计算查询计划。对于单个插入,这很好,很快,因为没有太多的计算,并且在构建了查询计划后,它只重复使用了1000次。
在批处理场景中,需要在查询计划中构建3k个变量,这需要更长的时间来计算。
@MartinSmith指出的一个疯狂特征是,在最多250行的批量大小周围有一个神奇的性能数字,这意味着计划计算非常低。
将我的上述查询分成5 200行语句,将执行时间减少到1000行的94毫秒
答案 1 :(得分:1)
第一项是一个必须解析的大型语句,因此花费的额外时间是一个大型解析作业的开销而不是1000个小作业。
虽然我没有测试所有1000行,但我测试了3,并发现单个insert语句的执行计划更大。另请注意,对于3个单独的插入,只有一个小计划可以重复使用。
答案 2 :(得分:0)
第一个是单个语句,作为单个事务运行。第二个是1000个语句,其中包含1000个事务的开销。将第二个括在begin transaction
和commit transaction
中时,差异应该会变小。