存储过程执行太慢

时间:2015-08-25 06:27:50

标签: sql-server sql-server-2008

我有一个存储过程引用多个表(四个具体即RefurbRefActivationDetailRefurbActivationDetailReplacedReplacedData),其中包含大约1个数据每张桌子。

我需要将存储过程中的数据绑定到前端的UI。当我尝试在SQL Server 2008上执行存储过程时,执行并获取结果花了将近20分钟。用户无法等待长时间注视"请等待加载"用户界面。

这是程序:

CREATE procedure [dbo].[uspLotFailureDetail]
     @fromDate varchar(50),
     @toDate varchar(50),
     @vendorName varchar(50),
     @modelName varchar(50)
AS
BEGIN
    select 
        d.LOTQty, 
        ApprovedQty = count(distinct d.SerialNUMBER),
        d.DispatchDate,
        Installed = count(a.SerialNumber) + count(r.SerialNumber),
        DOA = sum(case when datediff(day, coalesce(a.ActivationDate,r.ActivationDate), f.RecordDate) between 0 and 10 then 1 else 0 end),
        Bounce = sum(case when datediff(day, coalesce(a.ActivationDate,r.ActivationDate), f.RecordDate) between 11 and 180 then 1 else 0 end)
    from 
        RefurbRef d 
    left join 
        ActivationDetailRefurb a on d.SerialNUMBER= a.SerialNumber
                                 and d.DispatchDate <= a.ActivationDate 
                                 and d.LOTQty = a.LOTQty
    left join 
        ActivationDetailReplaced r on d.SerialNUMBER= r.SerialNumber
                                   and d.DispatchDate <= r.ActivationDate
                                   and d.LOTQty = r.LotQty
                                   and (a.ActivationDate is null or a.ActivationDate <= d.DispatchDate)
    left join 
        ReplacedData f on f.OldSerialNumber = (coalesce (a.SerialNumber, r.SerialNumber))
                       and f.RecordDate >= (coalesce (a.ActivationDate, r.ActivationDate))
    where 
        d.DispatchDate between @fromDate and @toDate  
        and d.VendorName = @vendorName 
        and d.Model = @modelName
    group by 
        d.LOTQty, d.DispatchDate
END

该过程提取两种类型的结果,基于供应商和模型的结果。但是,如果根据供应商提取结果,即仅使用@fromDate@toDate@Vendor,则过程执行时间不到2分钟并获得结果。但是当像上面的过程一样使用所有四个变量时,执行时间不少于20分钟。

我有什么方法可以优化查询以提高程序的性能吗?

提前致谢

1 个答案:

答案 0 :(得分:0)

根据提供的信息,我会查看 RefurbRef.model 号码,看看该字段是否有覆盖索引。我敢打赌,一旦你添加了这个标准,它就没有基于它跳到20分钟。另外,我会将变量更改为varchar中的日期。

@fromDate Date,   
@toDate Date,

希望这有帮助, 杰森