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

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
Часто приходится отредактирвоать хранимую процедуру и доавить в неё какой-то параметр поиска, последний мой пример

and (@PrivateSearch is null or @PrivateSearch = 1 and c1.Ticker is null or @PrivateSearch = 0 and c1.Ticker is not null) 

Есть ещё куча примеров как это условие можно реализовать используя case, isnull, coalesce....
Это более понятен для вопроса

И вот...

Не было параметра, жил себе спокойно, ...
если PrivateSearch is null, то пытаемся искать как и раньше до проверки.

И в этом месте начинаются замедления запроса. Обычно всё нормально происходит когда параметр обязательный и на всегда должен быть передан (будет хотя бы дефолтное значение).
Так же было бы легко если бы значение всегда было установлено. Тогда всегда можно было бы создать таблицу и с сделать inner join, а уже сожержанием временной таблицы управлять. Если надо выбирать всё, то заполняешь "всеми значениями из справочника" если его размеры примлемы.

Как победить эти замедления без динамических запросов? Не буду же я процедуру всю переписывать на динамику после добавления параметра. А тут куча параметров добавилось "по одному" и самое обидное когда они могут быть null-ыми, в входной параметр должен позволить выбрать "только нулдовые" или "только не нуловые" или "нуловые и ещё какие-то".

Как правильно писать такой OR что бы быстродействие не ухудшалось?!.
4 дек 09, 16:31    [8021353]     Ответить | Цитировать Сообщить модератору
 Re: Операция "OR" в статических запросах.  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
Могу сказать что перенос условия из where в подзапрос немного решил проблему ( в два раза быстрее)

FROM (select *
          from Company C1 with(nolock)
         where (@PrivateSearch is null or @PrivateSearch = 1 and c1.Ticker is null or @PrivateSearch = 0 and c1.Ticker is not null) 
       ) C1


Но не рисовать же мне лесенку подзапросов ?!!!!
Я так могу сколь угодно долго "отсеивать"
4 дек 09, 16:58    [8021584]     Ответить | Цитировать Сообщить модератору
 Re: Операция "OR" в статических запросах.  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
Блин, две таблички переписал на подзапросы с выбором нужных полей - уже быстрее работает...
Там хоть индексы должны использоваться после такой херни?

T. e. если я пишу

  from (select * from table1 t1 
          where ....) t1
 inner
  join (select * from talbe2 t2
          where ...) t2
    on t2.fk = t1.pk

То условие "on t2.fk = t1.pk" может сработать раньше и передать в подзапрос только те идентификаторы во второй запрос, которые изначально соответствуют?!

Я помню я такое попытался намутить с ЦТЕ, но там если я его два раза использовал оно точно два раза вызывалось.
4 дек 09, 17:17    [8021723]     Ответить | Цитировать Сообщить модератору
 Re: Операция "OR" в статических запросах.  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
Ёмоё, с ЦТЕ быстрее работает, просто на следющем уровне выбираешь все поля с уровня выше....

КАК ЭТОГО ИЗБЕЖАТЬ?! как заставить в нужной последовательности смотреть данные?
4 дек 09, 17:27    [8021791]     Ответить | Цитировать Сообщить модератору
 Re: Операция "OR" в статических запросах.  [new]
Glory
Member

Откуда:
Сообщений: 104760
NIIIK
Ёмоё, с ЦТЕ быстрее работает, просто на следющем уровне выбираешь все поля с уровня выше....

КАК ЭТОГО ИЗБЕЖАТЬ?! как заставить в нужной последовательности смотреть данные?

А нужная - это какая ?
4 дек 09, 17:33    [8021836]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить