Принудительная установка UNION на операционную систему для оптимизации в SQL Server 2000 - PullRequest
2 голосов
/ 16 декабря 2008

Как я могу получить запрос, который использует OR в предложении WHERE, чтобы разделить себя на два запроса с помощью UNION во время компиляции? Если я переписываю его вручную, запрос с использованием UNION будет в 100 раз быстрее, чем отдельный запрос, поскольку он может эффективно использовать разные индексы в каждом запросе объединения. Есть ли способ заставить оптимизатор использовать этот подход?

У меня есть запрос, который выглядит примерно так:

select columnlist
from table1
join table2 on joincond2
join table3 on joincond3
where conditions1 
    and ((@param1 is null and cond3a) or (cond3b))

Где columnlist, joincond2, joincond3 и условие1 - все это более длинные выражения. Кикер в том, что только одно из условий в ИЛИ когда-либо выполняется.

Сначала я подумал, что мог бы просто переписать его, чтобы выполнить объединение, но затем я повторяю columnlist, joincond2, joincond3 и condition1, то есть примерно 20 строк SQL, которые в будущем могут потребовать много обслуживания. Могу ли я дать подсказку или какой-нибудь лучший способ написать предложение WHERE? Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 16 декабря 2008

Вы можете группировать

select columnlist
from table1
join table2 on joincond2
join table3 on joincond3

в представление, а затем используйте объединение.

но если вы можете перейти на sql2005 / 8, Вы можете использовать общее табличное выражение.

with cte ( columnlist )
as (
    select columnlist
    from table1
    join table2 on joincond2
    join table3 on joincond3 )
select columnlist from cte where ...
union
select columnlist from cte where ...
0 голосов
/ 16 декабря 2008

Попробуйте добавить в запрос OPTION (RECOMPILE). Если это в хранимой процедуре, добавьте WITH RECOMPILE. Может случиться так, что при первом запуске запроса SQL Server придумывает план и кэширует его, но затем во второй раз он все еще использует старый (и теперь плохой) план запроса.

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

РЕДАКТИРОВАТЬ: я читал, что использование WITH RECOMPILE в хранимой процедуре в SQL 2000 не всегда работает должным образом. Эта ошибка, предположительно, была исправлена ​​в SQL 2005. Я лично никогда не сталкивался с этой ошибкой, поэтому не знаю, что именно с ней происходит. Попробуйте, хотя.

...