最近我对存储过程进行了更改,以传递参数值以除以其中一个字段的值...并且存储过程变得非常缓慢。运行 1 个 recs 需要 600 分钟,现在运行相同的结果需要 8-9 分钟。你能帮忙改进这个小变化吗?
我只在选择列表中添加了以下行
(nullif(x.tardies, 0) / @addtardies) addtardies
下面是完整的代码:
ALTER PROCEDURE [dbo].[z_testCalc]
(
@calendarID int,
@grade varchar(3),
@AbsType varchar(1),
@Tardies varchar(1),
@startDate smallDateTime,
@endDate smallDateTime,
@TeamActivity varchar(50),
@Percent VARCHAR(10),
@AddTardies int
)
AS
BEGIN
SET NOCOUNT ON;
select distinct
x.test1,
x.test2,
x.AbsType,
x.UnexAbs,
x.ExAbs,
x.Tardies,
mp.meetings,
round((1 - cast(x.UnexAbs as decimal(6,3))/cast(mp.meetings as decimal(6,3))) * 100,1) percentPres,
**(nullif(x.tardies, 0) / @addtardies) addtardies,**
x.endDate
from
(SELECT DISTINCT
sch.test1,
p.test1,
case when @AbsType = 'T' then 'Unexc, Exc' when @AbsType = 'U' then 'Unexc' else 'Exc' end 'AbsType',
sum(case when COALESCE(x.status, a.status) = 'A' and CASE WHEN a.excuseID IS NOT NULL THEN x.excuse ELSE a.excuse END = 'U' then 1 else 0 end) 'UnexAbs',
sum(case when COALESCE(x.status, a.status) = 'A' and CASE WHEN a.excuseID IS NOT NULL THEN x.excuse ELSE a.excuse END = 'E' then 1 else 0 end) 'ExAbs',
sum(case when COALESCE(x.status, a.status) = 'T' then 1 else 0 end) 'Tardies',
ros.endDate
FROM
test1 a WITH (NOLOCK)
提前谢谢你。
在我看来,
这不像是巨大的参数嗅探问题的可能情况。 尽管如此,当引入参数会导致您描述的奇怪的减速时,我总是喜欢排除它。
尝试添加一行将参数分配给局部变量,然后在查询中使用局部变量,而不是参数。
所以在查询之前把它放在顶部...
DECLARE @AddTardies_lcl int
SET @AddTardies_lcl = @AddTardies
然后在新逻辑中使用@AddTardies_lcl
。
(nullif(x.tardies, 0) / @AddTardies_lcl) addtardies
希望对您有所帮助!