Possible Duplicate:
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')
这似乎只发生在您第一次在表上使用批量插入时发生,但它是可重现的。
另请注意,我插入的数据是随机的(但两个查询相同)
编辑:
这是我的重现案例,其中包含我用于此案例的虚拟随机数据:https://gist.github.com/2489133
最佳答案
这里的问题根据Multiple INSERT statements vs. single INSERT with multiple VALUES问题在于,当 SQL 获取查询时,它必须在第一次执行时计算查询计划。对于单个插入来说,这很好而且很快,因为不需要计算太多,并且在构建查询计划后,它只需重复使用它 1000 次。
在批处理场景中,需要将 3k 个变量构建到查询计划中,这需要更长的计算时间。
@MartinSmith 指出的一个疯狂功能是,在最多 250 行的批量大小周围有一个神奇的性能数字,这意味着计划计算量非常低。
将上述查询分解为 5200 行语句,将 1000 行的执行时间减少到 94 毫秒
关于sql - 为什么插入单行比一次插入 x 行快 x 倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10314528/