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

Откуда: Азербайджан, г. Баку
Сообщений: 1382
Здравствуйте!


В обычном программировании при использовании оператора OR, условия проверяются поочередно, слева направо.
В запросе ниже даже при VARIABLE1 и N'VARIABLE2 == NULL (а таких переменных может быть несколько, а запрос более сложным) всё работает медленно, скорее всего из-за того, что по плану запроса правая часть всё равно выполняется.
Можно ли заставить SQL работать "правильно" с такими запросами?
Или как эту задачу решить другим способом?
PS: вариант собирать запрос как строку и выполнять ее - не подходит по ряду причин.

SELECT f1, f2, f3
FROM table1 a
WHERE f4 = 123 AND f5 = 456
  AND ((SELECT SESSION_CONTEXT(N'VARIABLE1')) IS NULL  OR   ID IN (SELECT b.ID FROM table2 b)
  AND ((SELECT SESSION_CONTEXT(N'VARIABLE2')) IS NULL  OR   ID IN (SELECT c.ID FROM table3 c)


Сообщение было отредактировано: 31 окт 19, 15:22
31 окт 19, 15:17    [22007273]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация данных с проверкой переменной сессии  [new]
Владислав Колосов
Member

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

select ... from ... where isnull
union all
select ... from ... where exists ()
31 окт 19, 15:30    [22007290]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация данных с проверкой переменной сессии  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Samir,

SESSION_CONTEXT(N'VARIABLE1') в переменные + RECOMPILE тогда выбросит
31 окт 19, 15:34    [22007294]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация данных с проверкой переменной сессии  [new]
Samir
Member

Откуда: Азербайджан, г. Баку
Сообщений: 1382
Это вьюшка, для фильтрации некоторых полей используются переменные сессии, так как фильтруемые поля невозможно вывести как поля для фильтрации.
31 окт 19, 15:35    [22007295]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация данных с проверкой переменной сессии  [new]
Samir
Member

Откуда: Азербайджан, г. Баку
Сообщений: 1382
TaPaK,

Думаете если вместо вьюшки создать функцию с параметрами - будет работать как надо?
31 окт 19, 15:37    [22007299]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация данных с проверкой переменной сессии  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Samir
TaPaK,

Думаете если вместо вьюшки создать функцию с параметрами - будет работать как надо?

нет
31 окт 19, 15:38    [22007300]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация данных с проверкой переменной сессии  [new]
Samir
Member

Откуда: Азербайджан, г. Баку
Сообщений: 1382
Получается нет больше вариантов кроме как собирать запрос как строку?

Кстати в запросе выше скобки не там стояли

SELECT f1, f2, f3
FROM table1 a
WHERE f4 = 123 AND f5 = 456
  AND ( SESSION_CONTEXT(N'VARIABLE1') IS NULL  OR   ID IN (SELECT b.ID FROM table2 b) )
  AND ( SESSION_CONTEXT(N'VARIABLE2') IS NULL  OR   ID IN (SELECT c.ID FROM table3 c) )


Сообщение было отредактировано: 1 ноя 19, 10:49
1 ноя 19, 10:45    [22007839]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация данных с проверкой переменной сессии  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Samir,

автор
, скорее всего из-за того, что по плану запроса правая часть всё равно выполняется.

поставьте SET STATISTICS IO ON и посмотрите, не должно читать что-то из подзапросов. И план актуальный покажите
1 ноя 19, 10:53    [22007850]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить