通过Dapper进行批量插入比逐行插入要慢
我正在使用Dapper将实时数据源中的数据插入到Sql Server中,因此我关心性能。最近我注意到一些奇怪的东西。
开箱即用,如果您给Dapper一个集合和一个插入查询,它将触发每个元素的插入语句。我的测试表明我可以在1秒钟12场插入有关大致1800对象这样(只计算connection.Execute(...)
运行时间。
现在,我没有找到小巧玲珑批量插入功能,并实现了我自己(构建参数列表和SQL查询)之后,我发现我只能在约3秒内(限于1000行)插入一个批次(再次,只计算connection.Execute(...)
调用
因此,这使得我的批次差不多比发送速度慢6倍在一个单独的查询每一行。有人可以解释这样对我?我认为人们使用批处理操作,以加快这一进程。
我想插入时间,以1秒之最。 我使用SQL Server 2012标准,该标准是在本地网络上。我插入的表只在主键(这是bigint字段)上有聚簇索引,没有非聚簇索引和触发器。
我可以发布代码,但没有什么特别的通过Dapper进行批量插入比逐行插入要慢
我不确定为什么你要使用Dapper Execute扩展方法,如果你想获得最好的性能。
最佳的性能要插入的最好的免费的方式是直接使用SqlBulkCopy
类。
免责声明:我的项目Dapper Plus
该项目为以下操作容易支持的所有者:
- BulkInsert
- BulkUpdate
- BulkDelete
- BulkMerge
例子:
// CONFIGURE & MAP entity
DapperPlusManager.Entity<Order>()
.Table("Orders")
.Identity(x => x.ID);
// CHAIN & SAVE entity
connection.BulkInsert(orders)
.AlsoInsert(order => order.Items);
.Include(x => x.ThenMerge(order => order.Invoice)
.AlsoMerge(invoice => invoice.Items))
.AlsoMerge(x => x.ShippingAddress);
理想的批量大小可以从服务器到服务器而异,关键因素是记录,这将影响资源密集型的插入是,你能有多大让你批你看到之前表现下降。
的关键在于快速插入/更新是确保你满足最小记录的要求,请看看这个Microsoft White Paper。不要惊慌 - 你不需要阅读所有内容 - 查看描述符合“最小日志记录”条件的表格(你需要与你的DBA交谈)。
一旦您尽可能少地记录日志,那么您需要查看SPOOLS的执行计划,如果批次开始后台打印到Tempdb,那么您的打印速度会显着减慢。关键是保持批量小到足以保留在缓冲区(RAM)中。但是,可用的缓冲空间量将取决于其他进程。
注:TABLOCK与TABLOCKX不同。
将调查它。说实话,我已经使用了SqlBulkCopy,它的速度比所有的选择都快。我可以在少于100毫秒内插入1500行。这对我来说已经足够了 – chester89
这里有什么问题?插入时间太长是1秒?你对一张一张的插入不满意吗?在这两种情况下,为什么?根据环境和使用情况,一个接一个都有好处,批量插入也有好处。此外,这是一次性的或反复出现的,你绝对*有*使用Dapper? – iamdave
@iamdave问题是我需要插入更多来自实时馈送的数据。现在我使用Dapper,它的运行量约为我计划用于生产的量的30%。不,它不一定是Dapper,我还没有尝试过SqlBulkCopy – chester89
可能值得看看你的自定义批量插入实现。 – grek40