存储过程突然挂起 - 参数被嗅探?

时间:2018-06-15 15:02:12

标签: sql sql-server

我有一个SQL Server 2016存储过程,在300多列上执行聚合加权平均值。

该过程将begin_monthend_monthmonthly_flag作为输入参数。

参数的逻辑如下:

create procedure sp_calc
     (@begin_month int, 
      @end_month int, 
      @monthly_flag char(1) 
as
begin 
    if monthly_flag = Y
       select begin_date,end_date 
       into _all_dates 
       where active_flag='Y' 
         and salemonth between @begin_month and @end_month
    else
       select begin_date,end_date 
       into _all_dates 
       where active_flag='Y' 
         and salemonth between @begin_month and @end_month 

    select a.*,b.begin_date,b.end_date
    into _agg_table
    from full_trans a, _all_dates b
    where a.sale_date between b.begin_date and b.end_date
      and a.sale_month = b.salemonth

    --begin aggregations
    select 
        col1, col2, col3, 
        sum(price * weights) / nullif(sum(weights), 0) as wp_price
    from 
        _agg_table
    group by 
        col1, col2, col3
end

此过程每个月过去大约需要2分钟。 Full_Trans表在给定月份有大约500K记录。

前几天,我使用monthly_flag=Y执行了3年的程序,并在25分钟内完成。

几个小时后,我更改了参数,并使用monthly_flag = 'N'将其运行到201506。

我期待这个程序在正常的2分钟内完成,但它会卡住并运行2.5小时以上。

full_Trans表被编入索引,没有其他任何更改。

我重新启动了服务器,重新启动了数据库服务并尝试了 - 但没有任何影响。

我尝试使用RECOMPILE选项:

Alter sp_calc <<Parameters>> 
    WITH RECOMPILE 

但没有效果。

这里可能发生了什么?这是参数嗅探的情况吗?如果是这样,我怎样才能恢复平常时间?

有什么想法吗?非常感谢任何见解。

编辑:谢谢大家的回复。重建索引似乎已经成功了。

0 个答案:

没有答案