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/ 可以白手起家不可手无寸铁!我是我命运的主宰者,我是我灵魂的掌舵人! 每一次的选择都将是一个挑战!
  • 相关阅读:
    iOS 数据存储
    iOS 中@property() 括号中,可以填写的属性?
    iOS 中关闭键盘方法
    iBeacons 资源汇总
    iOS7 下去掉状态栏(全屏)
    监听器HttpSessionListener
    监听器 HttpSessionBindingListener
    servlet 3.0 的使用
    工厂模式小例子 getDaoImp
    servlet和filter初始化
  • 原文地址:https://www.cnblogs.com/yunanwu/p/4168584.html
Copyright © 2011-2022 走看看