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导入数据库的时候是不是也会有另外一种优化方法。。。
菜鸟求教,请勘误。
本文从百度空间搬家到博客园。。
sql执行万条update语句优化的更多相关文章
- 一条update语句优化小记
遇到性能问题的sql如下: sql1: UPDATE amlclientlevel a SET a.client_value = (SELECT l.client_value ...
- 完蛋,公司被一条 update 语句干趴了!
大家好,我是小林. 昨晚在群划水的时候,看到有位读者说了这么一件事. 在这里插入图片描述 大概就是,在线上执行一条 update 语句修改数据库数据的时候,where 条件没有带上索引,导致业务直接崩 ...
- MySQL实战 | 01-当执行一条 select 语句时,MySQL 到底做了啥?
原文链接:当执行一条 select 语句时,MySQL 到底做了啥? 也许,你也跟我一样,在遇到数据库问题时,总时茫然失措,想重启解决问题,又怕导致数据丢失,更怕重启失败,影响业务. 就算重启成功了, ...
- 一条update语句到底加了多少锁?带你深入理解底层原理
迎面走来了你的面试官,身穿格子衫,挺着啤酒肚,发际线严重后移的中年男子. 手拿泡着枸杞的保温杯,胳膊夹着MacBook,MacBook上还贴着公司标语:"我爱加班". 面试开始,直 ...
- SQL语法基础之UPDATE语句
SQL语法基础之UPDATE语句 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查看UPDATE语句的帮助信息 1>.查看UPDATE的帮助信息 mysql> ? ...
- 如何将多条update语句合并为一条
需求: 如何将多条update语句合并为一条update语句:如,update table1 set col='2012' where id='2014001' update table1 ...
- MySQL45讲:一条update语句是怎样执行的
首先创建一张表: create table T(ID int primary key,c int); 如果要更新ID=2这行+1:应该这样写 update T set c=c+1 where ID=2 ...
- Sql Server执行一条Update语句很慢,插入数据失败
今天同事要我修改服务器数据库里面的2条数据,查看服务器上的SQL Server数据库的时候,发现这几天数据没有添加成功,然后发现磁盘很快就满了,执行Update语句时,执行半天都提示还在执行,查询语句 ...
- sql server中同时执行select和update语句死锁问题
原始出处 http://oecpby.blog.51cto.com/2203338/457054 最近在项目中使用SqlServer的时候发现在高并发情况下,频繁更新和频繁查询引发死锁.通常我们知道如 ...
随机推荐
- USB做Host的OTG原理
在介绍USBOTG的基础上,着重介绍Maxim公司的MAX3301E型USBOTG电路的特点.内部结构和工作原理. 1 引言 随着USB2.0版本的发布,USB越来越流行,已经成为一种标准接口.现在, ...
- delphi中WEBBrowser网页html相互调用(一)
1.基本操作1.1.激活 var doc,url:Olevariant ; begin url:='about:blank' ;//或者一个有实际意义的url WebBrowser1.Navigate ...
- insert into select * from 锁表
mysql[192.168.11.187] processid[249] root@localhost in db[zjzc] hold transaction time 197 112069858, ...
- 【HDOJ】1160 FatMouse's Speed
DP. #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAXNUM 1005 ...
- Eclipse中添加android sdk javadoc和source
在 javadoc location path中添加file:/D:/Android_SDK/sdk/docs/reference/ 在 source attachment中添加为 Externa ...
- c#4.0新特性之协变与逆变
1.C#3.0以前的协变与逆变 如果你是第一次听说这个两个词,别担心,他们其实很常见.C#4.0中的协变与逆变[1](Covariance and contravariance)有了进一步的完善,主要 ...
- OnClientClick事件
1.OnClientClick="return validation()" //注意return 2.//默认情况下返回true function validation() ...
- HDOJ --- 1258
#include<map> #include<string> #include<cstdio> #include<cstring> #include&l ...
- sql递归函数(自定义函数递归查找) 能返回递归的层次
实现效果图如下: 创建表: create table t_tree ( id int IDENTITY(1,1), parentid int, name varchar(10) ) go 插入测试数据 ...
- ORM介紹及ORM優點、缺點
主要內容: 1.ORM的概念 2.為什麽要使用ORM 3.ORM的優缺點 4..Net中有那些ORM產品 5.總結 一.ORM的概念 ORM,即Object-Relational Mapping( ...