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次也难以接受