我有一个存储过程,可以从两个不同的源获取数据,具体取决于用户是否请求来自单个关闭周期(存档到数据仓库表)或开放周期(来自事务表的数据)的数据。
如果我传递限制对数据仓库表的选择的参数(提供关闭期间的年份和期间),则过程需要很长时间才能返回结果,除非我注释掉 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/