大批量数据更新,分享给大家。

    今天要做一个大批量的数据分析,在表数据中要加入一些字段。并且通过程序分析得出有效值后存入数据库中。以方便接下来的操作。
    好吧,数据量也不是很大。只有55W条。通过数据导出将他从服务器上导出单表数据后。存入本地的数据库中。所以,所有的字段都设置为Varchar类型,没有主键。
    老老实实的写方法,首先通过ADO.NET中的SQLCommand来执行吧。也就是说一条数据执行一条。每次从数据库中读取100条。分析完后执行SQL语句。
    [code=csharp]new SqlCommand("Update order_db Set Sex = @Sex, Age = @Age where Ord_No = @Ord_No", conn).ExecuteNonQuery();[/code]
    平均速度为1秒<10条。纠结!~~55W条数据啊!~~


    好吧,另寻方法吧!这次使用ADO.NET中的SqlDataAdapter进行批量数据更新吧。同样,每次从数据库中取100条。批量进行数据更新
           [code=csharp] SqlDataAdapter sda = new SqlDataAdapter();
            sda.SelectCommand = command;
            sda.UpdateCommand = new SqlCommand("Update order_db Set Sex = @Sex, Age = @Age where Ord_No = @Ord_No", conn);
            sda.UpdateCommand.Parameters.Add("@Sex", SqlDbType.VarChar, 50, "sex");
            sda.UpdateCommand.Parameters.Add("@Age", SqlDbType.VarChar, 50, "Age");
            sda.UpdateCommand.Parameters.Add("@Ord_No", SqlDbType.VarChar, 50, "Ord_No");[/code]
            
            对ds的所有dataRow更新后执行更新
           [code=csharp] sda.Update(ds);
            ds.AcceptChanges();[/code] 


    速度小有提升,因为与执行SQL语句的方法类似所以不太明显。这要是要处理这么多数据也要一大段时间。恼火。
    这时,突然想起曾经在做数据采集时用到的一个对象——SqlBulkCopy。这玩意很特殊,只能插入,但是速度那真不是吹出来的。1W条数据进行写入时可能就1秒不到。
    头脑风暴来了,因为是数据分析,所以数据的安全性可以不用考虑。我设想删除的动作会非常快。然后再写入进去不就可以了。
    步骤就是取出到一个dataset中,然后对dataset中的值进行更改。然后删除掉数据库中的数据,再用SqlBulkCopy拷贝进去就可以了。
                   [code=csharp] var lq = from t in ds.Tables[0].AsEnumerable()
                             select new
                             {
                                 ordNo = t.Field<string>("Ord_No")
                             };
                    List<string> ordList = new List<string>();
                    foreach (var q in lq)
                    {
                        ordList.Add(q.ordNo);
                    }
                    string k = string.Join("','", ordList.ToArray());
                    Console.WriteLine(DateTime.Now.ToString() + "删除原始订单");
                    new SqlCommand()
                    {
                        CommandText = "Delete From order_db Where Ord_No In('" + k + "')",
                        Connection = conn,
                        CommandType = CommandType.Text
                    }.ExecuteNonQuery();
                    Console.WriteLine(DateTime.Now.ToString() + "添加新订单");
                    SqlBulkCopy bulkCopy = new SqlBulkCopy(conn);
                    bulkCopy.DestinationTableName = ("order_db");
                    bulkCopy.BatchSize = ds.Tables[0].Rows.Count;
                    foreach (DataColumn dc in ds.Tables[0].Columns)
                    {
                        bulkCopy.ColumnMappings.Add(dc.ColumnName, dc.ColumnName);
                    }
                    bulkCopy.WriteToServer(ds.Tables[0]);
                    bulkCopy.Close();[/code] 


实践证明,速度真的不是一般的快。55W条数据不到几分钟就全部处理完了,而且最大的速度浪费居然是在数据读取和分析上。因为没有主键,所以读取数据时速度大约要5秒左右。 


呵呵,发出来大家一起探讨一下。不知道对于大批量数据是否还有更好的处理办法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值