2013-09-27 3 views
0

Я поставил задачу оптимизировать запрос sql ниже. В настоящее время запрос является тайм-аутом и вызывает много блокировки. Я только начал использовать t-sql, поэтому, пожалуйста, помогите мне с оптимизацией запроса.Оптимизация запросов на серверный сервер Sql

select ExcludedID 
from OfferConditions with (NoLock) 
where OfferID = 27251 
    and ExcludedID in (210,223,409,423,447,480,633,...lots and lots of these..., 
    13346,13362,13380,13396,13407,1,2) 

union 

select CustomerGroupID as ExcludedID 
from CPE_IncentiveCustomerGroups ICG with (NoLock) 
inner join CPE_RewardOptions RO with (NoLock) 
on RO.RewardOptionID = ICG.RewardOptionID 
where RO.IncentiveID = 27251 
    AND ICG.Deleted = 0 and RO.Deleted = 0 and 
    and ExcludedUsers = 1 
    and CustomerGroupID in (210,223,409,423,447,480,633,...lots and lots of these..., 
    13346,13362,13380,13396,13407,1,2); 
+2

Откуда этот большой список идентификаторов с жестким кодом? И вы уверены, что вам нужен UNION, а не UNION ALL? Вы посмотрели фактические планы выполнения, чтобы увидеть, где узкое место? –

+0

Идентификаторы поступают из кода, код на самом деле строит строку, я догадываюсь, что она передает его, и у меня нет деталей, почему они выбирают UNION вместо UNION ALL – user2041076

+1

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

ответ

0

Ключом к решению вашей проблемы является не исправление SQL, а исправление индексов на ваших таблицах. Например, у вас должен быть составной индекс в таблице OfferConditions с OfferID и ExcludedID.

Когда вы создаете индексы других таблиц, помните, что если поле находится в том месте, где находится фильтр присоединения, оно должно быть частью вашего составного индекса.

+2

Я не совсем согласен. Начните с индекса на 'OfferID', и если это даст адекватную производительность, я бы остановился там. Избегайте делать индексы более широкими, чем они должны быть, и не индексировать поле только потому, что оно находится в предложении WHERE. –

1

Вы можете попробовать вставить эти ID в таблицу temp и присоединиться к ней вместо использования инструкции IN.

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