powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Параметризованный фильтр или OR
9 сообщений из 9, страница 1 из 1
Параметризованный фильтр или OR
    #39947263
SHKoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Други, помогите, пожалуйста, как реализовать выборку...

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

Итак, есть таблица:
Код: sql
1.
select a, b, c from T



и есть условия выборки, нужно отобрать данные, где
1. данные выборки удовлетворяют условию фильтра
2. данные выборки не удовлетворяют условию выборки
3. все

иными словами, я хочу параметризовать то, что сейчас отбирается так:
1.
Код: sql
1.
select * from T where a = @param


2.
Код: sql
1.
select * from T where a != @param


3.
Код: sql
1.
select * from T



таким образом, в случаях
1. выбираются все (условно) договора, которые удовлетворяют условию, что направление договоров = @param
2. выбираются все другие договора, где направление любые, кроме @param
3. выбираются договора все.

Таким образом я написал запрос:
Код: sql
1.
2.
3.
4.
select * from T
where (a = ID and @param = 'конкретное_направление')
or (a != ID and @param = 'другие_направления')
or (@param = 'все_направление')



где ID собственно идентификатор из справочника того самого направления.

И вся беда в том, что такой запрос стал работать непомерно дольше и я понимаю, что проблема в OR , но как ее решить, что-то не могу дать ладу.
Подскажи всезнающий all, чего я не так наворотил?

Мне это виделось так, что я мог бы задавать значения параметру @param , и было бы щастье.

Спасибо огромное

в диктанте три-четыре варнинга, но в общем компилируется
...
Рейтинг: 0 / 0
Параметризованный фильтр или OR
    #39947271
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
select * from T
where (a = ID and @param = 'конкретное_направление')
or (a != ID and @param = 'другие_направления')
or (@param = 'все_направление')
option (recompile)


Либо
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select * from T
where (a = ID and @param = 'конкретное_направление')

union all

select * from T
where (a != ID and @param = 'другие_направления')

union all

select * from T
where @param = 'все_направление'
...
Рейтинг: 0 / 0
Параметризованный фильтр или OR
    #39947275
SHKoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Код: sql
1.
option (recompile)



Спасибо огромное
В чем фокус?

Union не красивы скрипт. Очень громоздкий код и без него, а с ним в три этажа... не айс
...
Рейтинг: 0 / 0
Параметризованный фильтр или OR
    #39947312
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SHKoder
В чем фокус?
Сервер переделывает запрос (строит план запроса) для конкретных значений параметров
...
Рейтинг: 0 / 0
Параметризованный фильтр или OR
    #39947313
SHKoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
Сервер переделывает запрос (строит план запроса) для конкретных значений параметров

Тогда я понимаю, что эту опцию правильно использовать для любого параметризованного запроса?

О Боги! Чему нас только в школе учили?
А хотя нас учили достаточно давно. Однако, правильно ли использовать опцию в каждом запросе, где есть более одного параметра по структуре OR?

Для запроса типа
Код: sql
1.
2.
3.
4.
5.
select *
from T
where a = @a
and b = @b
and c = @c


очевидно нет необходимости??
...
Рейтинг: 0 / 0
Параметризованный фильтр или OR
    #39947315
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SHKoder
alexeyvgСервер переделывает запрос (строит план запроса) для конкретных значений параметров

Тогда я понимаю, что эту опцию правильно использовать для любого параметризованного запроса?Нет, потому что тогда серверу придётся каждый раз перестраивать план, что увеличивает расход ЦПУ ,и время выполнения.

Вариант с UNION будет выполняться всегда быстро, а recompile можно ставить для сложных, но редко выполняющихся запросов, или для очень простых (что бы перестроение плана было быстрым).

SHKoder
Для запроса типа
Код: sql
1.
2.
3.
4.
5.
select *
from T
where a = @a
and b = @b
and c = @c


очевидно нет необходимости??
Ну, значения параметров могут повлиять на оптимальный план. Так что зависит от конкретного случая.
Для простого запроса и правильных индексов recompile точно вреден.
...
Рейтинг: 0 / 0
Параметризованный фильтр или OR
    #39947316
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SHKoder, а так, что получается?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
select a, b, c
  from #T    

 where a between
   
   case @param
    when 'конкретное_направление' then @ID
    when 'другие_направления' then -2147483648
    when 'все_направление' then a
   end
   
  and
   
   case @param
    when 'конкретное_направление' then @ID
    when 'другие_направления' then 2147483647
    when 'все_направление' then a
   end
   
  and a !=
   
   case @param
    when 'конкретное_направление' then ~a
    when 'другие_направления' then @ID
    when 'все_направление' then ~a
   end

P.S. поможет ли - не уверен
...
Рейтинг: 0 / 0
Параметризованный фильтр или OR
    #39947317
SHKoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nullin,

Друг, у меня остался только один патрон... Раньше я думал, что потрачу его на хромую лошадь, но я ошибался...
...
Рейтинг: 0 / 0
Параметризованный фильтр или OR
    #39947318
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SHKoder, так и думал
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Параметризованный фильтр или OR
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]