我有一个SQL Server 2016存储过程,在300多列上执行聚合加权平均值。
该过程将begin_month
,end_month
,monthly_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
但没有效果。
这里可能发生了什么?这是参数嗅探的情况吗?如果是这样,我怎样才能恢复平常时间?
有什么想法吗?非常感谢任何见解。
编辑:谢谢大家的回复。重建索引似乎已经成功了。