当前位置: 代码迷 >> Sql Server >> 江湖救急 为啥数据处理起来那么慢
  详细解决方案

江湖救急 为啥数据处理起来那么慢

热度:507   发布时间:2016-04-24 10:21:58.0
江湖救急。。。 为什么数据处理起来那么慢。
1、要从“TanHouse_GSHP_Solar_Datas”表里面取数据,然后调用“sp_DataComputer_TanHouse_GSHP_Solar_Datas”存储过程进行数据计算。  得到“时、日、月、年”数据。

2、数据是取到了一个临时表里,然后通过循环去处理数据。
select @j=count(1) from #tmpTanHouse_GSHP_Solar_data

while @j>0
Begin
select top 1 @DANo=DANO,@DATime=DATime,@LogTime=LogTime,@MeterNo=MeterNo,@MeterType=MeterType,@Qty=Qty,@Unit=Unit from #tmpTanHouse_GSHP_Solar_data   order by datime;

exec sp_DataComputer_TanHouse_GSHP_Solar_Datas @DANo,@DATime,@LogTime,@MeterType,@MeterNo,@IncreaseQty,@Unit;

delete  from #tmpTanHouse_GSHP_Solar_data where meterno=@MeterNo and datime=@DATime;
set @j=@j-1


如果是“TanHouse_GSHP_Solar_Datas”每次处理几千条数据还可以,但是现在有200万数据要处理,发现处理速度非常慢。
执行这个存储过程几乎没有进度。

问题一:是因为用临时表数据量太大,几百万行,造成数据库阻塞了吗?  怎么几乎没有处理进度啊?

问题二:是因为每次top 1 临时表  order  by  datime,造成时间太长吗?

问题三:这个过程应该如何优化,使用游标行吗?



------解决方案--------------------
慢的是循环 而不是临时表。
------解决方案--------------------
我说几句,LZ 参考一下;

1. 这个临时表,建立的时候,可以按 order by datime 来生成 identity 列,这样不用每次都 TOP 一下。
2.检查一下,你这个 SP 是不是很慢。 sp_DataComputer_TanHouse_GSHP_Solar_Datas 
3.如果有可能,改一下SP,看看能不能批量处理,不要一次一条,这个是慢的根本所在。
------解决方案--------------------
几百万数据塞进临时表也够受了,放在临时表仅仅是为了循环,那就是错上加错了
------解决方案--------------------
存储过程要优化,不能这么写循环,这样相当这个语句得运行几百万次,肯定快不了。


------解决方案--------------------
写法有问题
1、用个游标,减少每次删除临时表
2、更彻底点,连带调用SP一并改写

------解决方案--------------------
LZ的程序写法是逐行处理的,需调用了几百万次存储过程sp_DataComputer_TanHouse_GSHP_Solar_Datas.
建议分析存储过程的代码,设法修改为批量处理的方式,一般都是可行的.

------解决方案--------------------
坚持用循环的话,把循环内部加快,以前改过一个循环,8万多数据好像是3秒还是多少,还是用循环,只是把每次循环的速度加快,有时候并不是循环出了问题,而是每次循环太久,即使循环3次也难以接受
  相关解决方案