Это всегда будет возвращать true, так что вы можете устранить его (и, возможно, объединить до)
AND (up.site = 'ALL' OR up.site = up.site)
Если вы можете жить с грязным чтением, тогда с (nolock)
И я бы попробовал Attachement как объединение.Может не помочь, но стоит попробовать.Like - это относительно дорого, и если он делает это в цикле, в котором он мог бы один раз, это действительно помогло бы.
Join Attachment a
on a.contextid = c.correspondenceid
AND a.context = 'correspondence'
AND ( a.attachmentname like '%.rtf' or a.attachmentname like '%.doc'))
Я знаю, что есть некоторые люди на SO, которые настаивают, что существование всегда быстрее соединения,И да, это часто быстрее, чем объединение, но не всегда.
Другой подход заключается в создании таблицы #temp с использованием
CREATE TABLE #Temp (contextid INT PRIMARY KEY CLUSTERED);
insert into #temp
Select distinct contextid
from atachment
where context = 'correspondence'
AND ( attachmentname like '%.rtf' or attachmentname like '%.doc'))
order by contextid;
go
select ...
from correspondence c
join #Temp
on #Temp.contextid = c.correspondenceid
go
drop table #temp
Особенно, если productID является первичным ключом или частью первичногопоможет ключ при переписке, создавая PK на #temp.
Таким образом, вы можете быть уверены, что подобное выражение вычисляется только один раз.Если подобное является дорогой частью и в цикле, то это может быть танкование запроса.Я часто использую это, когда у меня довольно дорогой основной запрос, и мне нужно, чтобы эти результаты собирали справочные данные из нескольких таблиц.Если вы делаете много объединений несколько раз, оптимизатор запросов становится глупым.Но если вы передадите оптимизатору запросов PK на PK, то это не будет глупо и быстро.Обратной стороной является то, что для создания и заполнения # temp требуется около 0,5 секунды.