小编gcr*_*sse的帖子

SQL IF ELSE性能问题

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

如果我将限制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) …
Run Code Online (Sandbox Code Playgroud)

sql-server performance stored-procedures if-statement

6
推荐指数
1
解决办法
1512
查看次数