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)
@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)
| 归档时间: |
|
| 查看次数: |
1512 次 |
| 最近记录: |