2015-08-25 2 views
0

У меня есть хранимая процедура, которая несколько таблиц см (четыре быть конкретными 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 минут.

Есть ли способ оптимизировать запрос, чтобы увеличить производительность процедуры?

Заранее спасибо

+0

вы можете повысить производительность за счетом использования индексов, вы можете также проверить выполнение план, чтобы увидеть, что часть запроса занимает много времени –

+0

20 минут очень долго ... Но без каких-либо подробностей относительно структуры таблицы, индексов, подсчета строк невозможно ответить. Btw: вы не должны использовать хранимую процедуру только для чтения данных ... В этом случае лучше использовать просмотр или одноразовый UDF ... – Shnugo

+1

Пожалуйста, поделитесь планом выполнения. – StackUser

ответ

0

Учитывая информацию, представленную я хотел бы посмотреть на RefurbRef.model номер, чтобы увидеть, если есть индекс покрытия на этом поле. Я бы поспорил, что он не основывается на том, что он прыгает до 20 минут после того, как вы добавили эти критерии. Кроме того, я бы изменил ваши переменные на даты из varchar.

@fromDate Date, 
@toDate Date, 

Надеется, что это помогает, Джейсону