Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 通过Dapper批量插入比逐个插入行慢_.net_Sql Server_Dapper_Batch Insert - Fatal编程技术网

.net 通过Dapper批量插入比逐个插入行慢

.net 通过Dapper批量插入比逐个插入行慢,.net,sql-server,dapper,batch-insert,.net,Sql Server,Dapper,Batch Insert,我使用Dapper将数据从实时提要插入Sql Server,所以我关心性能。最近,我注意到一些奇怪的事情 开箱即用,如果给Dapper一个集合和一个insert查询,它将为每个元素激发insert语句。我的测试表明,通过这种方式,我可以在1秒内插入大约1800个对象和12个字段(仅计算connection.Execute(…)运行时间。 现在,我没有在Dapper中找到批插入功能,而是实现了我自己的(构造参数列表和sql查询)。之后,我发现我只能在大约3秒钟内插入一个批(限制为1000行)(同样

我使用Dapper将数据从实时提要插入Sql Server,所以我关心性能。最近,我注意到一些奇怪的事情
开箱即用,如果给Dapper一个集合和一个insert查询,它将为每个元素激发insert语句。我的测试表明,通过这种方式,我可以在1秒内插入大约1800个对象和12个字段(仅计算
connection.Execute(…)
运行时间。
现在,我没有在Dapper中找到批插入功能,而是实现了我自己的(构造参数列表和sql查询)。之后,我发现我只能在大约3秒钟内插入一个批(限制为1000行)(同样,只计算
连接。执行(…)
调用。
因此,这使得我的批处理几乎比在单独查询中发送每一行慢了6倍。有人能给我解释一下吗?我以为人们使用批处理操作来加快处理速度。
我希望插入时间最多为1秒。 我使用本地网络上的Sql Server 2012标准。我要插入的表在主键上只有聚集索引(即bigint字段),没有非聚集索引和触发器。

我可以发布代码,但实际上没有什么特别的

如果您想要获得最佳性能,我不确定为什么要使用简洁的执行扩展方法

以最佳性能插入的最佳自由方式是直接使用
SqlBulkCopy

免责声明:我是项目的所有者

该项目为以下操作提供了方便的支持:

  • 隔板
  • 批量更新
  • 批量删除
  • 大合并
例如:

// 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);   
//配置和映射实体
DapperPlusManager.Entity()
.表格(“订单”)
.Identity(x=>x.ID);
//链和保存实体
连接.批量插入(订单)
.AlsoInsert(订单=>order.Items);
.Include(x=>x.ThenMerge(订单=>order.Invoice)
.AlsoMerge(发票=>invoice.Items))
.AlsoMerge(x=>x.ShippingAddress);

如果希望获得最佳性能,我不确定为什么要使用Dapper Execute extension方法

以最佳性能插入的最佳自由方式是直接使用
SqlBulkCopy

免责声明:我是项目的所有者

该项目为以下操作提供了方便的支持:

  • 隔板
  • 批量更新
  • 批量删除
  • 大合并
例如:

// 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);   
//配置和映射实体
DapperPlusManager.Entity()
.表格(“订单”)
.Identity(x=>x.ID);
//链和保存实体
连接.批量插入(订单)
.AlsoInsert(订单=>order.Items);
.Include(x=>x.ThenMerge(订单=>order.Invoice)
.AlsoMerge(发票=>invoice.Items))
.AlsoMerge(x=>x.ShippingAddress);

理想的批处理大小可能因服务器而异,关键因素是日志记录,这将影响插入的资源密集程度,以及在性能下降之前可以进行多大的批处理

快速插入/更新的关键是确保您满足最小日志记录的要求,请查看此项。不要惊慌-您不需要阅读所有内容-查看描述满足“最小日志记录”条件的表格(您需要与DBA交谈)

一旦日志记录尽可能少,那么就需要查看假脱机的执行计划,如果一个批开始假脱机到Tempdb,那么速度就会急剧下降。关键是要使该批足够小,以便保留在缓冲区(RAM)中。但可用的缓冲区空间量将取决于其他进程


注意:TABLOCK与TABLOCKX不同。

理想的批处理大小可能因服务器而异,关键因素是日志记录,这将影响插入的资源密集程度以及在性能下降之前可以进行的批处理的大小

快速插入/更新的关键是确保您满足最小日志记录的要求,请查看此项。不要惊慌-您不需要阅读所有内容-查看描述满足“最小日志记录”条件的表格(您需要与DBA交谈)

一旦日志记录尽可能少,那么就需要查看假脱机的执行计划,如果一个批开始假脱机到Tempdb,那么速度就会急剧下降。关键是要使该批足够小,以便保留在缓冲区(RAM)中。但可用的缓冲区空间量将取决于其他进程


注意:TABLOCK与TABLOCKX不同。

这里的问题是什么?1秒钟的插入时间太长了吗?您对逐个插入不满意吗?在这两种情况下,原因是什么?逐个插入和批量插入都有好处,具体取决于环境和使用情况。此外,这是一次性的还是重复性的,您绝对必须使用Dapp吗呃?@iamdave问题是我需要插入更多来自实时提要的数据。现在我使用Dapper,它的运行量约为我计划的生产使用量的30%。不,它不必是Dapper,我没有尝试SqlBulkCopy。yetIt可能值得一看您的自定义批量插入实现。是否有任何开销SQL Server端?是否要插入带有索引和触发器的表?当批太大时,SQL可能会被淹没。@Paciley否,该表唯一的功能是主键上的聚集索引。我将把这一点添加到问题中,这里有什么问题?插入太长是1秒吗?您对逐个插入不满意吗?在两个CA中是的,为什么?逐个插入和批量插入都有好处,这取决于环境和使用情况。此外,这是一次性的还是重复性的,您绝对有吗