SqlBulkCopy测试

先上码:

public static void WriteSQL()
{
    //http://www.codeweblog.com/sqlbulkcopy-%E7%9A%84-timeout-%E5%92%8C-batchsize/
    const int times = 20;
    const int precount = 100000;
    const string constr = "Data Source=.,1433;Initial Catalog=SuperSite;Integrated Security=True";

    DataRow dr;
    var dt = new DataTable();
    var tbarr = new List<DataTable>();
    var locker = new Object();

    dt.Columns.Add("name", typeof(string));
    dt.Columns.Add("age", typeof(int));
    dt.Columns.Add("address", typeof(string));
    dt.Columns.Add("remarks", typeof(string));

    for (int j = 0; j < times; j++)
    {
        dt.Rows.Clear();

        for (int i = precount * (j) + 1; i <= precount * (j + 1); i++)
        {
            dr = dt.NewRow();
            dr["name"] = "张三" + i;
            dr["age"] = i;
            dr["address"] = "杭州" + i;
            dr["remarks"] = "备注" + i;
            dt.Rows.Add(dr);
        }

        tbarr.Add(dt);
    }

    using (var con = new SqlConnection(constr))
    {
        con.Open();

        try
        {
            using (var bulkCopy = new SqlBulkCopy(con.ConnectionString, SqlBulkCopyOptions.KeepIdentity))
            {
                bulkCopy.BatchSize = precount;
                bulkCopy.DestinationTableName = "TB_Test";
                bulkCopy.ColumnMappings.Add("name", "name");
                bulkCopy.ColumnMappings.Add("age", "age");
                bulkCopy.ColumnMappings.Add("address", "address");
                bulkCopy.ColumnMappings.Add("remarks", "remarks");

                Stopwatch stopwatch = new Stopwatch();
                stopwatch.Start();

                Parallel.ForEach(tbarr, x =>
                {
                    lock (locker) { bulkCopy.WriteToServer(x); }
                });

                stopwatch.Stop();
                Console.WriteLine("{0}条数据插入,耗时:{1}", precount * times, stopwatch.Elapsed);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("错误:{0}", ex.Message);
        }
        finally
        {
            dr = null;
            dt = null;
            tbarr = null;

            con.Close();
        }
    }
}



感觉BatchSize的大小不是能随便设置的,经过测试,与总插入量有关。20w条数据,而且还是单挑数据量比较下的情况下几十次测试下来,发现最好的情况下也只能接近9。

摘录一段MSDN上的说明:https://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlbulkcopy.batchsize.aspx


另附相关阅读:

http://stackoverflow.com/questions/4535536/timeout-expired-with-sqlbulkcopy

http://stackoverflow.com/questions/779690/what-is-the-recommended-batch-size-for-sqlbulkcopy

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值