none
江湖救急。。。 为什么数据处理起来那么慢。 RRS feed

  • 问题

  • 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,造成时间太长吗?

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

    Science and technology is my lover.

    2014年7月13日 6:40

全部回复

  • 1 & 2. did you create proper index in temp table?

    3. did you check execution plan?

    2014年7月13日 19:51
  • 几百万的临时表, 你有建索引么? 没建索引那绝对慢, 和正式表一个道理

    你这种手工模拟游标的办法, 还不如直接用游标呢

    2014年7月14日 9:21
  • 要知道具体慢在那句, 你可以用profile 跟踪一下你的这个操作的个个 Statment

    (SP:StatmemtCompleted 和 SQL:StatmentCompleted 两个事件)

    2014年7月14日 9:24
  • 1、建索引,这样能加快速度。如果还是很慢,见2。

    2、使用SQL PROFILE跟踪这个Procedures查看每句的duration和show plan all,找出瓶颈。

    2014年7月24日 7:49