日期:2014-05-19  浏览次数:20674 次

大表更新问题
情况描述:
1、一张用户基本信息表,UserSN为主键,数据类型(bigint),数据量为1000万
2、一批更新语句:update   table   set   a   =   a   +   4,b   =   5   where   usersn   =   1231231223     大概有200万条这样的更新语句

目前实现方法:将更新语句插入到一张表中(idx   identity,sql   varchar),然后用存储过程循环跑每条sql语句(根据idx),需要643分钟,请问为什么需要这么长时间?有什么更好的解决方法吗?

------解决方案--------------------
把要更新的UserSN值和a值,b值插入到一个表中,例如:
insert into tmpForUpdate(UserSN,a,b) values(1231231223,4,5)
然后使要更新的表与该表内联进行更新:
Update a set
a = a + t.a,
b = t.b
From 用户基本信息表 as a
Inner Join tmpForUpdate as t on a.UserSN = t.UserSN
------解决方案--------------------
200万条的更新语句中90%是更新两个字段,如何解析出来?
其中10%可能涉及多个字段的更新,还有insert into 语句如果过滤?

------------------------------------------------------
我想问一下这200万条的更新语句 是什么来的呢?什么会一次这多的?
如果是输入的,为什么不分开来update呢?
如果关联,像hellowork(一两清风)的方法就好多了
感觉这个update方法处理本身就有问题
------解决方案--------------------
我想楼主的方法应该没问题.
有一点忽略了,你必须1条条语句执行.结果,你用了643分钟.
"1条条语句执行 ",这个看来是必须的了,但是,你可以同时启动多个程序去执行,达到并行的效果.
假设,你把原来的1张表该成10张,开10个程序去执行.

------解决方案--------------------
单单 update table set a = a + 4,b = 6 where usersn = 1231231223 即使有200W也不会那么长时间的。你这样做会产生大量日志记录,建议把日志先设置简单,然后执行

------解决方案--------------------
试试把那个中间表,换成 表变量.
看是否能快些,表变量是在内存中,应该比读取硬盘快些.