为什么插入单行x比一次插入x行快x倍

时间:2012-04-25 11:17:56

标签: sql sql-server tsql sql-server-2008-r2

  

可能重复:
  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

3 个答案:

答案 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个单独的插入,只有一个小计划可以重复使用。

enter image description here

enter image description here

答案 2 :(得分:0)

第一个是单个语句,作为单个事务运行。第二个是1000个语句,其中包含1000个事务的开销。将第二个括在begin transactioncommit transaction中时,差异应该会变小。