SQL IF ELSE性能问题

gcr*_*sse 6 sql-server performance stored-procedures if-statement

我有一个存储过程,可以从两个不同的源获取数据,具体取决于用户是从单个关闭期间(存档到数据仓库表)还是从打开期间(来自事务表的数据)请求数据.

如果我将限制select的参数传递给数据仓库表(提供关闭期间的年份和期间),除非我注释掉ELSE BEGIN ...代码,否则该过程需要很长时间才能返回结果.没有数据来自ELSE部分的代码,但它仍然在减慢程序的速度.如果我注释掉ELSE部分的代码,那就非常快.

我试过OPTION (RECOMPILE),我正在使用局部变量来避免参数嗅探,但它没有帮助.有没有办法解决这个问题?以下是我正在做的运行缓慢的示例:

IF @Year <> 0 AND @Period <> 0 AND (SELECT PerClosedTimestamp
                                    FROM Period
                                    WHERE 
                                        PerCompanyID = @CompanyID AND
                                        PerYear = @Year AND
                                        PerPeriod = @Period) IS NOT NULL
BEGIN
    SELECT   
        datawhse.column1, datawhse.column2, etc …
    FROM    
        datawhse        
END 
ELSE
BEGIN
    SELECT 
        trantable.column1, trantable.column2, etc…
    FROM    
        trantable       
END 
Run Code Online (Sandbox Code Playgroud)

如果我排除ELSE语句,它运行速度非常快:

IF @Year <> 0 
   AND @Period <> 0 
   AND (SELECT PerClosedTimestamp
        FROM Period
        WHERE PerCompanyID = @CompanyID 
          AND PerYear = @Year   
          AND PerPeriod = @Period) IS NOT NULL
BEGIN
    SELECT   datawhse.column1
            ,datawhse.column2, etc …
    FROM    datawhse        
END 
Run Code Online (Sandbox Code Playgroud)

Dan*_*nry 2

@Year 和 @Period 是否直接来自存储过程的输入?就像在您的存储过程定义中一样,您是按以下方式编写的吗?

create proc USP_name @Year int, @Period int as
begin
     ...
end
Run Code Online (Sandbox Code Playgroud)

你可以尝试使用局部变量,根据我的经验,在很多这样的情况下,局部变量有很大帮助。

create proc USP_name @Year int, @Period int as
begin
    declare @Year_local int, @Period_local int
    set @Year_local = @Year, @Period_local = @period

    if @Year_local <> 0 AND @Period_local <> 0 AND ...
    ....
end
Run Code Online (Sandbox Code Playgroud)