Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 теоретический вопрос по производительности.  [new]
denis_viktorovich
Member

Откуда: Екб
Сообщений: 1239
Доброго времени суток!
Возник такой вопрос. Не задумывался раньше, но изменяя запрос обратил внимание на частое наличие в коде нескольких условий с оператором or и скалярными функциями. Примерно такого вида:
 
Select field1, field2, ....
from OrderTable 
where .....  /*тут некие условия*/
and 
(field1=1 or Func1(Field3)=0 or Func3(Field4)=0) 


Если известно, что затраты на проверку первого условия будут минимальными, а Func1(Field3) уже на порядок затратнее, а в Func3(Field4) наворочено что то совсем тяжелое. Можно ли точно задать порядок выполнения проверки, чтобы например при выполнении первого условия остальные уже гарантированно не проверялись? Или это уже делает оптимизатор?
29 янв 16, 17:02    [18746924]     Ответить | Цитировать Сообщить модератору
 Re: теоретический вопрос по производительности.  [new]
Glory
Member

Откуда:
Сообщений: 104751
denis_viktorovich
Можно ли точно задать порядок выполнения проверки, чтобы например при выполнении первого условия остальные уже гарантированно не проверялись?Или это уже делает оптимизатор?

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

Сообщение было отредактировано: 29 янв 16, 17:10
29 янв 16, 17:10    [18746969]     Ответить | Цитировать Сообщить модератору
 Re: теоретический вопрос по производительности.  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
denis_viktorovich
Можно ли точно задать порядок выполнения проверки, чтобы например при выполнении первого условия остальные уже гарантированно не проверялись?
Можно, если понимаете что делаете и как это повлияет на план выполнения
case
 when field1=1 then 1
 when Func1(Field3)=0 then 1
 when Func3(Field4)=0 then 1
end = 1

Но оптимизатор лучше вас знает как построить оптимальный план выполнения. На то он и оптимизатор.
А если задумались о производительности, лучше избавьтесь от скалярных функций - толку будет больше, чем от обеспечения порядка вычисления предикатов.
29 янв 16, 17:18    [18747028]     Ответить | Цитировать Сообщить модератору
 Re: теоретический вопрос по производительности.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8823
denis_viktorovich,

увы, увы, т.к. план выполнения готовится заранее. А вот не в запросах такое очень даже должно сработать.
IF fn(a) = 0 or megaFN(b)=0
    print 'ok'

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

И скалярные функции не используйте в запросах - потеряете параллелизм, как минимум. Старайтесь только inline.
29 янв 16, 23:24    [18748641]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить