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

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

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/

相关文章:

按日期查询销售报告的SQL

mysql - 本地计算机上的 MySQL57 服务启动然后停止

sql - 如何将 group-by T-SQL 语句中的所有负数清零

php - 在 Linux 上从 PHP 连接到 MS SQL Server

sql - 内连接在最后一个连接中有多个 ON 子句

sql - 如何转换 SQL Server XML 类型值 (xsi :nil) of DateTime to null

java - H2 用户定义的聚合函数 ListAgg,不能在第一个参数上使用 DISTINCT 或 TRIM()

php - php mysql 中的问题

MySQL与空值比较

sql - 在 SQL 中计算滚动聚合的最有效方法是什么?