У меня есть хранимая процедура, которая несколько таблиц см (четыре быть конкретными RefurbRef
т.е., ActivationDetailRefurb
, ActivationDetailReplaced
, ReplacedData
) с приблизительно 1 лаковые данных по каждой таблице.хранимой процедуры является слишком медленным
Мне нужно привязать данные из хранимой процедуры к пользовательскому интерфейсу на переднем конце. Когда я попытался выполнить хранимую процедуру на своем 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
Есть два типа результатов из процедуры выписки, результаты, основанные на поставщика и на модели. Однако, если результат извлекается на основе Vendor i.e, используя только @fromDate
, @toDate
и @Vendor
, процедура занимает менее 2 минут для выполнения и получения результата. Но когда используются все четыре переменные, как в приведенной выше процедуре, для выполнения требуется не менее 20 минут.
Есть ли способ оптимизировать запрос, чтобы увеличить производительность процедуры?
Заранее спасибо
вы можете повысить производительность за счетом использования индексов, вы можете также проверить выполнение план, чтобы увидеть, что часть запроса занимает много времени –
20 минут очень долго ... Но без каких-либо подробностей относительно структуры таблицы, индексов, подсчета строк невозможно ответить. Btw: вы не должны использовать хранимую процедуру только для чтения данных ... В этом случае лучше использовать просмотр или одноразовый UDF ... – Shnugo
Пожалуйста, поделитесь планом выполнения. – StackUser