ITPUB??ì3
12月微软Hyper-V虚拟化沙龙主题征集
ITPUB论坛 » MS SQL Server » 超大数据量更新问题,在线等,急!

标题: 超大数据量更新问题,在线等,急!
离线 xb_wang01
初级会员



精华贴数 0
个人空间 0
技术积分 56 (26113)
社区积分 0 (1190340)
注册日期 2006-11-21
论坛徽章:0
      
      

发表于 2008-9-10 10:50 
超大数据量更新问题,在线等,急!

我的问题如下:
sqlserver2000
现在有两个表,表一:Info( Info_ID int,info_code nvarchar(6),Info_data1 float,Info_data2 float) 数据量有1000多万
              表二:Para(Para_ID int,info_code nvarchar(6),Para_fr float)数据量有50多万
现在的任务是要根据表二Para里的para_fr,来更新表一的Info_data1,Info_data2,两个表是根据Info_code这个字段连接的。
各位有什么好的解决方案吗?我直接用update  from 子句,现在只是更新了300多万的数据都要3分种,哪位有好的解决方案,指教一下。


只看该作者    顶部
离线 xb_wang01
初级会员



精华贴数 0
个人空间 0
技术积分 56 (26113)
社区积分 0 (1190340)
注册日期 2006-11-21
论坛徽章:0
      
      

发表于 2008-9-10 10:57 
最简单的更新语句:
update info
set info.info_data2=info.info_data1,
     info.info_data1=info.info_data1*t.fr
from info
left join para t on info.info_code=t.info_code
这个语句在info表有300多万,para表有5万多的数据情况下,就需要3分钟。
光靠代码估计不能提升性能,不知哪位有什么比较好的解决方案。


只看该作者    顶部
离线 luckyrandom
中级会员



来自 广东-东莞
精华贴数 0
个人空间 0
技术积分 1916 (863)
社区积分 24 (7086)
注册日期 2003-12-30
论坛徽章:2
2008北京奥运纪念徽章:自行车ITPUB新首页上线纪念徽章    
      

发表于 2008-9-10 11:25 
每次都需要全表更新么,需要多长时间更新一次
结构设计上可以改么<应该是需要改的>


__________________
有偿企业系统开发、咨询、维护、故障排除<SQL SERVER+DELPHI>
QQ:315054403 MSN:dgdba@hotmail.com 就职于东莞中大型手袋生产企业,免费咨询勿扰
只看该作者    顶部
离线 xb_wang01
初级会员



精华贴数 0
个人空间 0
技术积分 56 (26113)
社区积分 0 (1190340)
注册日期 2006-11-21
论坛徽章:0
      
      

发表于 2008-9-10 11:26 
每天更新一次,现在基本不能改了,我提议把数据计算放在代码层做,也被否决了,现在上边说1000多万的数据如果能在10分钟内更新完毕就行,还是没谱啊。


只看该作者    顶部
离线 shanfei
饭后百步走


精华贴数 0
个人空间 0
技术积分 1391 (1251)
社区积分 58 (4604)
注册日期 2002-2-5
论坛徽章:3
ITPUB元老会员2006贡献徽章授权会员   
      

发表于 2008-9-10 12:25 
换成delete+insert试试,备份一下表最好
先根据info_code删除了info表的数据,然后再从para表insert进去,不过不知道第一列的id是否可以删了重建


只看该作者    顶部
离线 lucky7_2000
一般会员


精华贴数 0
个人空间 0
技术积分 673 (2888)
社区积分 5 (15681)
注册日期 2004-8-21
论坛徽章:2
2008北京奥运纪念徽章:摔跤ITPUB新首页上线纪念徽章    
      

发表于 2008-9-10 12:48 
join 的条件列上有索引么..如果没有的话,加上索引会快一些.

还有如果可能的话,给两个表都加上tablock,应该也会快些.


__________________
msn:lucky7_2000@hotmail.com
某网络公司数据库管理员.
只看该作者    顶部
在线/呼叫 sqysl
孤独剑客



来自 山东
精华贴数 0
个人空间 9
技术积分 1570 (1108)
社区积分 36 (5889)
注册日期 2006-12-20
论坛徽章:0
      
      

发表于 2008-9-10 12:59 
其实,MSSQL最脆弱的地方就是锁,因为他会吃掉很多内存,而且随着更新数据的增多,锁会升级。
所以,对MSSQL数据修改的第一条注意的就是尽量使事务小一些,而且尽可能快的提交。
我觉得可试验如下两种方法:
1、为两个表指定表级排他锁,而不用系统自动上的锁。
2、把这条语句分解为多个小事务,一个小事务提交一次,比如:外层用循环控制,内层进行UPDATE。


__________________
曾经沧海难为水,除却巫山不是云。
天若有情天亦老,人间正道是沧桑。
只看该作者    顶部
离线 lucky7_2000
一般会员


精华贴数 0
个人空间 0
技术积分 673 (2888)
社区积分 5 (15681)
注册日期 2004-8-21
论坛徽章:2
2008北京奥运纪念徽章:摔跤ITPUB新首页上线纪念徽章    
      

发表于 2008-9-10 13:15 
如果有实验结果的话,最好贴出来,看看建议是否可行...


__________________
msn:lucky7_2000@hotmail.com
某网络公司数据库管理员.
只看该作者    顶部
离线 xb_wang01
初级会员



精华贴数 0
个人空间 0
技术积分 56 (26113)
社区积分 0 (1190340)
注册日期 2006-11-21
论坛徽章:0
      
      

发表于 2008-9-10 13:57 
其实,MSSQL最脆弱的地方就是锁,因为他会吃掉很多内存,而且随着更新数据的增多,锁会升级。
所以,对MSSQL数据修改的第一条注意的就是尽量使事务小一些,而且尽可能快的提交。
我觉得可试验如下两种方法:
1、为两个表指定表级排他锁,而不用系统自动上的锁。
2、把这条语句分解为多个小事务,一个小事务提交一次,比如:外层用循环控制,内层进行UPDATE。
*********************************************************************
我考虑过分解成比较小的update语句,外边用游标循环,不过时间更长了。


只看该作者    顶部
离线 lucky7_2000
一般会员


精华贴数 0
个人空间 0
技术积分 673 (2888)
社区积分 5 (15681)
注册日期 2004-8-21
论坛徽章:2
2008北京奥运纪念徽章:摔跤ITPUB新首页上线纪念徽章    
      

发表于 2008-9-10 14:38 
有没有试过在join的条件上加索引,再加tablock?


__________________
msn:lucky7_2000@hotmail.com
某网络公司数据库管理员.
只看该作者    顶部
相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问