Dapper插入记录性能测试

本文通过对比Dapper批量插入、SqlBulkCopy及原生SQL单条插入的方式,测试了5万条记录的插入性能。结果显示Dapper批量插入耗时10秒,虽不及SqlBulkCopy的1.5秒,但远胜过原生SQL单条插入的60秒。

最近学习了Dapper,听说它里面有批量插记录的功能,就写了个小程序来测试下:分别用SqlBulkCopay,原始的单条插入,Dapper批量插入5万条记录。

表结构 tb_User (id, UserName,Password)

比较结果如下:

1.Dapper: 花费时间10秒

 public void TesDappertBatch()
        {
            IDbConnection connection = new SqlConnection(_connect);
            connection.Open();
            var tran = connection.BeginTransaction(IsolationLevel.Serializable);
            var userList=Enumerable.Range(1, 50000).Select(i => new User
            {
                UserName = "User" + i,
                Password="pwd"+i

            });
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            var result = connection.Execute("insert tb_User(UserName,Password) values(@UserName,@Password)", userList,tran);
            tran.Commit();
            stopwatch.Stop();
            Console.WriteLine(stopwatch.ElapsedMilliseconds);
            Console.ReadLine();//10023

        }


2.SqlBulkCopy,我用的是自己封闭的SqlBulkHelper,花费1.5秒

 public void TestBulk()
        {
            BulkCopyHelper bh = new BulkCopyHelper(_connect);
            DataTable dt = new DataTable();
            dt.Columns.Add("UserName", typeof(string));
            dt.Columns.Add("PassWord", typeof(string));
            for(int i=0;i<50000;i++)
            {
                dt.Rows.Add(new object[] { "User" + i, "pwd" + i });
            }
            
            bh.SetMappingList(dt);
            bh.DestTable = "tb_User";
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            bh.BulkInsert(dt);
            stopwatch.Stop();
            Console.WriteLine(stopwatch.ElapsedMilliseconds);

            Console.ReadLine(); //1551

            
        }

3.原生SQL单条插入,花费60秒

   public void TestSingInsert()
        {
            
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            for (int i=0;i< 50000;i++)
            {
                string sql = @"
insert tb_User(UserName,PassWord) values(@p1,@p2)
";
                string user = "User" + i;
                string pwd = "Pwd" + i;
                SqlHelper.ExecuteNonQuery(_connect, CommandType.Text, sql, new SqlParameter[] { new SqlParameter("@p1", user),new SqlParameter("@p2",pwd )});
            }

            stopwatch.Stop();
            Console.WriteLine(stopwatch.ElapsedMilliseconds);

            Console.ReadLine(); //60469
        }

如此看来,虽然性能还不能和SqlBulkCopy比,但也相当不错了,而且还可以用在SqlServer以外的数据库上。在非批量导入(Excel,其它数据表),且不是单条操作的场景下适宜使用。单条操作我还是用自己的ORMapping数据模型更方便,因为Dapper需要自己手工写类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值