当前位置: 代码迷 >> Sql Server >> SqlServer2008 千万数据更新速率的有关问题
  详细解决方案

SqlServer2008 千万数据更新速率的有关问题

热度:552   发布时间:2016-04-24 10:28:30.0
SqlServer2008 千万数据更新速率的问题
表中大概有数据千万级的数据,经常要更新某些记录,如何提高更新效率!
语句很简单:
Update MyTable Set Field1='AAA',Field2='BBB',Field3='CCC' Where Field4='DDD' And Field5='EEE' And Field6=6
有些字段可能用到Case判断,我在Field4和Field5上建立了索引。
因为每次接收到数据大概1000条左右,我就循环更新,速率大概在每秒80-100之间,循环更新完大概15秒左右
想问下,还能如何优化,提高Update效率呢!
------解决方案--------------------
大数据量的更新 其实可以变通 

先DELETE 然后INSERT 
------解决方案--------------------
循环更新
如何使得每次循环都能提交,而不是所有循环的更改都一起写一次巨量的日志
------解决方案--------------------
引用:
Quote: 引用:

循环更新
如何使得每次循环都能提交,而不是所有循环的更改都一起写一次巨量的日志

没怎么听明白!


把你的事务包含在循环的内部,事务仅仅包含update语句,而不是一个大的事务包含整个的循环。
------解决方案--------------------
把你的Field4,Field5,Field6加一个包含Field1,Field2,Field3的组合索引,这样更好一些。
------解决方案--------------------
Field6为什么不加到索引里面?
------解决方案--------------------
另外Field1、2、3如非必要不要加索引
------解决方案--------------------
因为每次接收到数据大概1000条左右,我就循环更新,速率大概在每秒80-100之间,循环更新完大概15秒左右

--> 请问循环更新是不是指1000条记录逐条进行更新? 
     如果是,则建议用表关联更新的方式,步骤:
     1. 讲1000条待更新的记录写入临时表.
     2. 正式表关联临时表进行更新,效率肯定是比逐条更新高的.


Update  a 
 Set a.Field1=[字段值],
     a.Field2=[字段值],
     a.Field3=[字段值]
 from MyTable a
 inner join [临时表] b on a.Field4=b.Field4 and a.Field5=b.Field5 and a.Field6=b.Field6


------解决方案--------------------
基本的索引设计,在Field4/5/6上建索引,把可选择度高的放前面
先产生临时表,一次性更新表
------解决方案--------------------
在Field4/5/6上建复合索引,速度就会快些
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

循环更新
如何使得每次循环都能提交,而不是所有循环的更改都一起写一次巨量的日志

没怎么听明白!


把你的事务包含在循环的内部,事务仅仅包含update语句,而不是一个大的事务包含整个的循环。


我以前在一些场合试过这样写,但是日志还是一起写似的,很大很慢
比较纳闷
  相关解决方案