为什么 Dapper 的批量插入比我预期的要慢很多?

咨询区

  • kenwarner

我的项目中有一个批量插入的需求,我采用的是 Dapper 连接数据库,下面是我的代码。

var members = new List<Member>();
for (int i = 0; i < 50000; i++)
{members.Add(new Member(){Username = i.toString(),IsActive = true});
}using (var scope = new TransactionScope())
{connection.Execute(@"
insert Member(Username, IsActive)
values(@Username, @IsActive)", members);scope.Complete();
}

上面代码插入需要 20s,插入量大概 2500/s,虽效果还行,但我在网上找的文章说可以做到 45k/s ,请问如何做到这么高的插入量?

回答区

  • Fredrik Ljung

下面是我批量插入的最佳实践,可以实现 50k 条数据 4s 搞定。

SqlTransaction trans = connection.BeginTransaction();connection.Execute(@"
insert Member(Username, IsActive)
values(@Username, @IsActive)", members, transaction: trans);trans.Commit();
  • CallumVass

我实现了一个可批量插入的扩展方法,参考代码如下:

public static class DapperExtensions
{public static async Task BulkInsert<T>(this IDbConnection connection,string tableName,IReadOnlyCollection<T> items,Dictionary<string, Func<T, object>> dataFunc){const int MaxBatchSize = 1000;const int MaxParameterSize = 2000;var batchSize = Math.Min((int)Math.Ceiling((double)MaxParameterSize / dataFunc.Keys.Count), MaxBatchSize);var numberOfBatches = (int)Math.Ceiling((double)items.Count / batchSize);var columnNames = dataFunc.Keys;var insertSql = $"INSERT INTO {tableName} ({string.Join(", ", columnNames.Select(e => $"[{e}]"))}) VALUES ";var sqlToExecute = new List<Tuple<string, DynamicParameters>>();for (var i = 0; i < numberOfBatches; i++){var dataToInsert = items.Skip(i * batchSize).Take(batchSize);var valueSql = GetQueries(dataToInsert, dataFunc);sqlToExecute.Add(Tuple.Create($"{insertSql}{string.Join(", ", valueSql.Item1)}", valueSql.Item2));}foreach (var sql in sqlToExecute){await connection.ExecuteAsync(sql.Item1, sql.Item2, commandTimeout: int.MaxValue);}}private static Tuple<IEnumerable<string>, DynamicParameters> GetQueries<T>(IEnumerable<T> dataToInsert,Dictionary<string, Func<T, object>> dataFunc){var parameters = new DynamicParameters();return Tuple.Create(dataToInsert.Select(e => $"({string.Join(", ", GenerateQueryAndParameters(e, parameters, dataFunc))})"),parameters);}private static IEnumerable<string> GenerateQueryAndParameters<T>(T entity,DynamicParameters parameters,Dictionary<string, Func<T, object>> dataFunc){var paramTemplateFunc = new Func<Guid, string>(guid => $"@p{guid.ToString().Replace("-", "")}");var paramList = new List<string>();foreach (var key in dataFunc){var paramName = paramTemplateFunc(Guid.NewGuid());parameters.Add(paramName, key.Value(entity));paramList.Add(paramName);}return paramList;}
}

然后可以像下面这样使用。

await dbConnection.BulkInsert( "MySchemaName.MyTableName", myCollectionOfItems,new Dictionary<string, Func<MyObjectToInsert, object>>{{ "ColumnOne", u => u.ColumnOne },{ "ColumnTwo", u => u.ColumnTwo },...});

点评区

在实际开发中,批量插入是一个非常常见的场景,用 事务拼sql 都是高效的方式,我在实际开发中,用的是事务方式,学习了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/296650.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在java中写出html代码,在java里写html代码

在java里写html代码[2021-02-09 07:31:38] 简介:php去除nbsp的方法&#xff1a;首先创建一个PHP代码示例文件&#xff1b;然后通过“preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", " ", strip_tags($val));”方法去除所有nbsp即可。推荐&#xff1a;《…

append()与extend()

list函数append与extend的区别&#xff1a;前者的参数可以是任何类型&#xff0c;把元素加入到list中&#xff1b;后者的参数必须是list类型&#xff0c;把它和原list合并。 >>> a [1, 2, 3] >>> a.append([4, 5]) >>> a [1, 2, 3, [4, 5]] >&g…

简单的比较两数大小

#!/bin/bash#testecho "----- 比较两数大小-----";while (true) do{echo -n " 请输入a:";read a;echo -n " 请输入b:";read b;if [ $a -eq $b ]then echo "ab&#xff01;";elif [ $a -lt $b ]then echo "a 小于 b || $a < $b…

大咖来了!今年的 COSCon 主论坛你可以见到这些大咖

“ 点击蓝字 / 关注我们 ”| 作者&#xff1a;COSCon21 组委会| 编辑&#xff1a;王玥敏| 设计&#xff1a;朱亿钦COSCon21 主论坛已经开始了紧锣密鼓的筹备工作&#xff0c;大咖们走进影棚&#xff0c;录制主题演讲。那么在本次主论坛中&#xff0c;你都能见到哪些大咖呢&…

3部世界顶级宇宙纪录片,献给对宇宙万物充满好奇的你

全世界只有3.14 % 的人关注了爆炸吧知识宇宙深邃美丽&#xff0c;是黑夜的荧光&#xff0c;是夏天里冒着凉气的西瓜&#xff0c;总是诱人地勾起一代又一代人探索的欲望。对于宇宙思索与探索&#xff0c;人类的脚步从未停止。正是人类对宇宙的好奇&#xff0c;撑起了人类发展的大…

mysql如何查询某条记录在分页的第几页_分页插件的使用

mybatis中首先要在配置文件中配置一些东西&#xff0c;配置sqlaMapconfig和mapper.xml,然后根据这些配置去创建一个会话工厂&#xff0c;再根据会话工厂创建会话&#xff0c;会话发出操作数据库的sql语句(作用是操作数据库)&#xff0c;然后通过执行器操作数据&#xff0c;再使…

DataAdapter.FillSchema 方法

备忘: http://msdn.microsoft.com/zh-cn/library/229sz0y5.aspx转载于:https://www.cnblogs.com/lindj0307/archive/2012/08/28/2660298.html

2014全国计算机二级ms office,2014计算机二级MS Office真题及答案

根据光盘中素材文件夹中“操作题素材”子文件夹中“操作题4.2”中所提供的“迎春花”及其中的图片&#xff0c;制作名为“迎春花”的演示文稿&#xff0c;要求如下&#xff1a;(1)有标题页&#xff0c;有演示主题&#xff0c;制作单位(老年协会)&#xff0c;在第一页上要有艺术…

routine tortoisesvn operations-1

接下来, 我们讲一下tortoisesvn的常规操作. update, revert和switch的区别, 这三个命令的图标都是从服务器端到客户端的箭头, 容易搞混.1. update是最常用的操作, 就是用来更新本地的work copy, 当然, 如果某个文档是基于svn server的最新版本做了修改,那么update并不会从svn s…

nginx file not found 错误处理小记

2019独角兽企业重金招聘Python工程师标准>>> 安装完php php-fpm nginx 后访问php出现file not found错误&#xff0c;html就没问题配置文件server 段如下 server {listen 80; server_name 192.168.1.11;root /home/www;location ~ .*\.php${ try_files $uri 404;…

1300多名硕博研究生被清退!全都是活该?真相有时候比表面更让人无奈......

全世界只有3.14 % 的人关注了爆炸吧知识有时真相很像结果近日&#xff0c;西安电子科技大学公布了一份名单&#xff0c;拟清退33名“失联博士”。这些被清退的博士研究生中&#xff0c;最长的就读时间竟然是15年&#xff01;更令人震惊的是&#xff0c;自2019年来&#xff0c;已…

计算机主板复位电路的组成,主板复位电路及VRM电路原理分析.ppt

《主板复位电路及VRM电路原理分析.ppt》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《主板复位电路及VRM电路原理分析.ppt(19页珍藏版)》请在人人文库网上搜索。1、主板复位电路及VRM电路原理分析 RobinLiu,M/B 基本架构,第一章Power on 时序,Chipset : 915PICH6,Po…

SQL Server数据库同步问题分享[未完,待续](一)

SQL Server数据库同步问题分享[未完&#xff0c;待续](一) SQL Server数据库同步问题分享(二)---操作步骤[未完&#xff0c;待续] SQL Server数据库同步问题分享(三)---创建订阅 合并发布(复制)通常也是从发布数据库对象和数据的报表快照开始。并用触发器跟踪在发布服务器和订…

(转)前置++和后置++的区别

今天在阅读《google c 编程风格》的文档的时候&#xff0c;5.10. 前置自增和自减&#xff1a;有一句话引起了我的注意&#xff1a; 对于迭代器和其他模板对象使用前缀形式 (i) 的自增, 自减运算符.&#xff0c;理由是 前置自增 (i) 通常要比后置自增 (i) 效率更高。于是我查了查…

一起谈.NET技术,异步调用与多线程的区别

随着拥有多个硬线程CPU&#xff08;超线程、双核&#xff09;的普及&#xff0c;多线程和异步操作等并发程序设计方法也受到了更多的关注和讨论。本文主要是想探讨一下如何使用并发来最大化程序的性能。 多线程和异步操作的异同 多线程和异步操作两者都可以达到避免调用线程阻塞…

中国最美街景,带你一次看个够

全世界只有3.14 % 的人关注了爆炸吧知识生活永远比电视剧精彩&#xff0c;真正的美景永远比图片美&#xff01;中国960万平方公里的土地上&#xff0c;拥有无穷无尽的美景&#xff0c;足以将你的眼睛搁在天堂。抛开那些耳熟能详的景区不谈&#xff0c;单单是一些普通街道&#…

6计算机系统的组成是,计算机系统的组成(范文)(6页)-原创力文档

第 PAGE \* Arabic 1 页计算机系统的组成(范文)PAGE计算机系统的组成一、教学目标&#xff1a;知识与技能&#xff1a;⑴ 学生了解计算机组成各部分的名称和作用。⑵ 学生知道计算机的硬件有哪些。⑶ 学生知道什么是计算机软件&#xff0c;了解计算机软件的作用。⑷ 通过介绍国…

[031] 实战:书大师网站开发准备

.NET大牛之路 • 王亮精致码农 • 2021.10.19前面我们花了二十篇左右的文章讲 C# 基础和高级知识点。由于后面要讲的东西还有很多&#xff0c;所以 C# 的内容没办法做到讲得细而全&#xff0c;只能走马观花一扫而过。在后面的内容中如果有遇到 C# 高级知识点&#xff0c;我们再…

计算机视觉招聘_INDEMIND|SLAM、计算机视觉、深度学习算法招聘(社招实习)

公司介绍INDEMIND是一家专注于计算机视觉技术研发与嵌入式计算平台研发的人工智能公司&#xff0c;行业领先的计算机视觉方案提供商。公司成立于2017年&#xff0c;核心技术团队成员均为来自计算机视觉领域的顶级技术人员。研发团队结合自身在计算机视觉技术上的优势&#xff0…

2012暑假最后两次组队赛总结

最后两次组队赛的题都相对简单&#xff0c;所以两次都得到较高的题目数&#xff01;一次是在hdu的diy上做&#xff0c;另外的是在bnu做spoj的题。先补回倒数第二场的总结。倒数第二场一共有10题&#xff0c;当时过的题包括一题枚举求最大值&#xff0c;一题二分求概率&#xff…