2013-09-11 2 views
1

У меня есть следующий запрос, который находит клиентов, связанных с заказом. У меня есть унаследованные ID на клиенте, поэтому я должен проверить старый идентификатор (унаследованный) и идентификатор клиента, следовательно, или заявленияИЛИ в выражении WHERE замедление вниз резко

SELECT 
    c.Title, 
    c.Name 
    FROM productOrder po 
     INNER JOIN Employee e ON po.BookedBy = e.ID 
     CROSS APPLY (
     SELECT TOP 1 * 
     FROM Customer c 
     WHERE(po.CustID = c.OldID OR po.CustID = c.CustID)  
    ) c 

    GROUP BY  
    c.CustomerId, c.Title, c.FirstName, c.LastName 

если я удалить OR заявления он работает отлично подходит для обоего ситуаций. Существует индекс идентификатора клиента и его наследия.

+1

У вас есть отдельные индексы на 'customer.oldid' и' customer.custid'? – mvp

+0

Нет, у меня есть кластеризованный индекс –

+2

Почему бы не обновить 'productOrder' и заменить старый id: s соответствующим новым id: s? Предполагая, что старый id: s также уникален в 'customer', который должен быть легким ... Что мне не хватает? – user1429080

ответ

1

Для таблицы customer вам необходимо создать отдельные индексы для столбцов oldid и custid. Если у вас уже есть кластерный индекс по custid, затем добавить индекс на oldid, а также:

CREATE INDEX customer_oldid_idx ON customer(oldid); 

Без этого индекса поиска для oldid в этом разделе:

WHERE (po.CustID = c.OldID OR po.CustID = c.CustID) 

придется использовать полное сканирование таблицы, и это будет очень медленно.

+0

Спасибо, это сделало трюк. –

Смежные вопросы