2012-04-25 64 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