Not*_*ple 5 sql t-sql sql-server sql-server-2008-r2
我正在对博客文章的批处理事务进行一些性能分析,我注意到当你使用批量插入语句时,它的执行速度比等效的单个SQL语句慢得多.
插入1000行如下所示大约需要3秒
INSERT TestEntities (TestDate, TestInt, TestString) VALUES
('2011-1-1', 11, 'dsxcvzdfdfdfsa'),
('2011-1-1', 11, 'dsxcvzdfdfdfsa'),
('2011-1-1', 11, 'dsxcvzdfdfdfsa')
Run Code Online (Sandbox Code Playgroud)
插入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')
Run Code Online (Sandbox Code Playgroud)
这似乎只在您第一次在表上使用批量插入时发生,但它的可重现性.
另请注意,数据插入是随机的(但两个查询都相同)
编辑:
继承了我的repro案例与虚拟随机数据我用于这种情况:https://gist.github.com/2489133
根据Multiple INSERT statements vs. single INSERT with multiple VALUES 的问题,当 SQL 获取查询时,它必须在第一次执行时计算查询计划。对于单个插入来说,这很好而且很快,因为不需要计算太多,并且在构建查询计划后,它只需重复使用它 1000 次。
在批处理场景中,需要将 3k 个变量构建到查询计划中,这需要更长的时间来计算。
@MartinSmith 指出的一个疯狂的功能是,在最多 250 行的批量大小周围有一个神奇的性能数字,这意味着计划计算量非常低。
将上面的查询分成 5200 行语句,将 1000 行的执行时间减少到 94 毫秒
| 归档时间: |
|
| 查看次数: |
602 次 |
| 最近记录: |