我有一个存储过程引用多个表(四个具体即RefurbRef
,ActivationDetailRefurb
,ActivationDetailReplaced
,ReplacedData
),其中包含大约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分钟。
我有什么方法可以优化查询以提高程序的性能吗?
提前致谢
答案 0 :(得分:0)
根据提供的信息,我会查看 RefurbRef.model 号码,看看该字段是否有覆盖索引。我敢打赌,一旦你添加了这个标准,它就没有基于它跳到20分钟。另外,我会将变量更改为varchar中的日期。
@fromDate Date,
@toDate Date,
希望这有帮助, 杰森