传递参数将字段值除以存储过程会使其变慢

时间:2014-11-14 19:31:38

标签: sql sql-server stored-procedures

最近我对我的存储过程进行了更改,以传递参数值来划分其中一个字段的值......并且存储过程变得非常慢。运行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)

提前谢谢。

1 个答案:

答案 0 :(得分:0)

这对我来说并不像是一个巨大的参数嗅探问题。尽管如此,当引入参数导致像你描述的奇怪的减速时,我总是喜欢排除它。

尝试添加一行将参数分配给局部变量,然后在查询中使用局部变量,而不是参数。

所以在查询之前把它放在顶部...

DECLARE @AddTardies_lcl int
SET @AddTardies_lcl = @AddTardies

然后在新逻辑中使用@AddTardies_lcl

(nullif(x.tardies, 0) / @AddTardies_lcl) addtardies
希望它有所帮助!