最近我对我的存储过程进行了更改,以传递参数值来划分其中一个字段的值......并且存储过程变得非常慢。运行600次recs需要1分钟,现在需要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)
提前谢谢。
答案 0 :(得分:0)
这对我来说并不像是一个巨大的参数嗅探问题。尽管如此,当引入参数导致像你描述的奇怪的减速时,我总是喜欢排除它。
尝试添加一行将参数分配给局部变量,然后在查询中使用局部变量,而不是参数。
所以在查询之前把它放在顶部...
DECLARE @AddTardies_lcl int
SET @AddTardies_lcl = @AddTardies
然后在新逻辑中使用@AddTardies_lcl
。
(nullif(x.tardies, 0) / @AddTardies_lcl) addtardies
希望它有所帮助!