zoukankan      html  css  js  c++  java
  • sql执行万条update语句优化

    几个月没有更新笔记了,最近遇到一个坑爹的问题,顺道记录一下。。

    需求是这样的:一次性修改上万条数据库。

    项目是用MVC+linq的。

    本来想着用 直接where()

    1
    var latentCustomerList = this.FindAll().Where(m => arrId.Contains(m.CustomerID.ToString())).ToList();

    这样子执行,意料之中的就是出错了,出啥错,自己试了就知道了。哈哈

    想来就只有直接操作数据库了。第一次的想法,直接就是for拼接语句,拼是拼了。

    1
    2
    3
    4
    5
    6
    for (int i = 0; i < obaList.Count; i++)
                   {
                       arrId[i] = obaList[i].CustomerID.ToString();
                       sbUpdateSqlStr.AppendFormat("update dbo.Customer set IsValid=1 where CustomerID='{0}' ;  ", arrId[i]);
                        
                   }

    可是执行起来总共花费了7秒。第二次花费4.5秒,第三次5秒。

    数据库都是争分夺毫秒。这样拼了一万多条的语句还真不是办法。调试进去也许你也会崩溃。。。就想着能不能快,再快。就想到了IN

    于是就改成了下面的方法。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    for (int i = 0; i < obaList.Count; i++)
                    {
                        arrId[i] = obaList[i].CustomerID.ToString();
                        if (i != 0 && i % 50 == 0)
                        {
                            ids = ids.Remove(ids.Length - 1);
                            sbUpdateSqlStr.AppendFormat("update dbo.Customer set IsValid=1 where CustomerID in({0}) ;  ", ids);
                            ids = "'" + arrId[i] + "',";
                        }
                        else
                        {
                            ids += "'" + arrId[i] + "',";
                        }
                         
                    }

    看看总共的执行时间吧。。

    也只能是这样的速度了...

    说说最后的思想吧,其实就是减少执行语句数量的问题,把原本需要执行12223条的语句,减少了50倍,也就是245条。效率不言而喻了。(实际使用需要结合数据库索引以及in的问题。)

    做到这,想到Excel导入数据库的时候是不是也会有另外一种优化方法。。。

    菜鸟求教,请勘误。

    本文从百度空间搬家到博客园。。

    邮箱:yunanwu@foxmail.com 微博:@提灯寻影(http://weibo.com/wuyunnan) 技术主页:http://www.cnblogs.com/yuanawu/ 可以白手起家不可手无寸铁!我是我命运的主宰者,我是我灵魂的掌舵人! 每一次的选择都将是一个挑战!
  • 相关阅读:
    bzoj1415 NOI2005聪聪和可可
    Tyvj1952 Easy
    poj2096 Collecting Bugs
    COGS 1489玩纸牌
    COGS1487 麻球繁衍
    cf 261B.Maxim and Restaurant
    cf 223B.Two Strings
    cf 609E.Minimum spanning tree for each edge
    cf 187B.AlgoRace
    cf 760B.Frodo and pillows
  • 原文地址:https://www.cnblogs.com/yunanwu/p/4168584.html
Copyright © 2011-2022 走看看