传递参数以将字段值划分到存储过程会使速度变慢



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

希望对您有所帮助!

最新更新