5

可能重复:
多个 INSERT 语句与具有多个 VALUES 的单个 INSERT

我对博客文章的批处理事务进行了一些性能分析,我注意到当您使用批处理插入语句时,它的执行速度比等效的单个 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')

这似乎只在您第一次在表上使用批量插入时发生,但它是可重现的。

另请注意,即时插入的数据是随机的(但两个查询相同)

编辑:

这是我用于此案例的虚拟随机数据的复制案例:https ://gist.github.com/2489133

4

3 回答 3

3

根据Multiple INSERT statements vs. single INSERT with multiple VALUES ,这里的问题是,当 SQL 获取查询时,它必须在第一次执行时计算查询计划。对于单次插入来说,这既好又快,因为不需要计算太多,而且在构建查询计划之后,它只是重复使用了 1000 次。

在批处理场景中,需要将 3k 个变量构建到查询计划中,这需要更长的时间来计算。

@MartinSmith 指出的一个疯狂特性是,在高达 250 行的批处理大小附近有一个神奇的性能数字,这意味着计划计算非常低。

将我的上述查询分成 5 200 行语句将 1000 行的执行时间减少到 94 毫秒

于 2012-04-25T11:56:53.127 回答
1

第一项是必须解析的大型语句,因此花费的额外时间在于一个大型解析作业而不是 1000 个小型作业的开销。

虽然我没有测试所有1000行,但我测试了3行,发现单个insert语句的执行计划更大。另请注意,对于 3 个单独的插入,只有一个小计划被重复使用。

在此处输入图像描述

在此处输入图像描述

于 2012-04-25T11:50:07.603 回答
0

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

于 2012-04-25T11:46:26.467 回答