sql-server - SQL IF ELSE 性能问题

标签 sql-server performance if-statement stored-procedures

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

如果我传递限制对数据仓库表的选择的参数(提供关闭期间的年份和期间),则过程需要很长时间才能返回结果,除非我注释掉 ELSE BEGIN… 代码。代码的 ELSE 部分没有数据,但它仍然减慢了过程。如果我注释掉代码的 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 
ELSE
BEGIN
    SELECT 
        trantable.column1, trantable.column2, etc…
    FROM    
        trantable       
END 

如果我排除 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 

最佳答案

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

create proc USP_name @Year int, @Period int as
begin
     ...
end

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

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

关于sql-server - SQL IF ELSE 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38985774/

相关文章:

if-statement - PHP、C++等语法解释

javascript - 选择更改时更改 SQL 语句

c# - 在 C# 中解析和上传 >1GB 的数据

sql-server - 在循环中读取 Sql 服务器中的逗号分隔字符串

java - 在 SQLite 数据库中按数组存储数组

performance - 有没有办法加速/批量 Google 日历读/写?

SQL查询;水平到垂直

与 XP 相比,WinForms ListView 在 Windows 7 中绘制速度极慢

php - 我们如何解析字符串条件以在 if 语句中使用

python - 检查返回值是否为 None