存储过程停止运行但重新编译修复它

时间:2017-12-01 19:44:52

标签: sql-server stored-procedures sql-server-2016

我有一个存储过程,每天在SQL Server 2016中运行几次。

只需几个选项即可对值进行求和并对记录进行计数。它返回值作为输出参数。

每隔一段时间,也许每两个月就会停止工作一次。从代码(C#)调用if时,我最终会遇到时间问题。

通常它会在不到一秒的时间内执行。如果我重新编译它,一切都恢复正常,我几个月都不会有另一个问题。

知道可能导致这种情况的原因吗?

我可以提供哪些其他信息来帮助发现问题?

以下是其中一个查询的示例:

            SET ANSI_NULLS ON
    ALTER PROCEDURE [dbo].[spName] 
        @dateFrom as datetime,
        @dateTo as datetime,
        @CustID as varchar(50)
    AS
    BEGIN
        SET NOCOUNT ON;

        declare @TotalReturns as decimal(12,0),
                @TotalReturnsValue as decimal(12,2),

        --Total Transactions and Value for returns within date range
        --**********************************************************
        select @TotalReturns = count(*), @TotalReturnsValue = sum(cast(isnull([amountField],'0') as decimal(12,2)))
        from [tableName]
        where [customerField]=@CustID
            and [returnDateField] between @dateFrom and @dateTo
            and replace([amountField],' ', '') != '' 
         --**********************************************************

        --Outputs
        select isnull(@TotalReturns,0) as TotalReturns,
            isnull(@TotalReturnsValue,0) as TotalReturnsValue       
    END

1 个答案:

答案 0 :(得分:2)

基于示例查询和评论中的讨论,我非常确定这与基于客户端和日期范围的数据偏差的参数嗅探和次优计划有关。您可以在此深入阅读有关参数嗅探的信息。 https://www.sqlinthewild.co.za/index.php/2007/11/27/parameter-sniffing/。 Gail在解决性能挑战方面做得非常出色,并且有很多方法可以解决这个问题。