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

Откуда:
Сообщений: 241
дано:

 a.column1 = ISNULL(@p1, a.column1 ) 


Конструкция выше сваливает запрос в сканирование индексов и хэш джойн (optimize for не помог);
хотя по логике должен быть поиск. ~22тыс записей всего, эстимейт ~200, актуал 21.
индексы есть, стастистика есть.

 a.column1 = @p1 

при таком условии поиск.

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

как обойти ситуацию? исключать ISNULL и делать вторую процедру, которая будет все данные отдавать?
17 июл 12, 15:56    [12878601]     Ответить | Цитировать Сообщить модератору
 Re: ISNULL в предикате  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37228
@p1 is null or a.column1 = @p1

Далее, если плохо, переписывать на два запроса через union all.

Сообщение было отредактировано: 17 июл 12, 16:00
17 июл 12, 15:59    [12878624]     Ответить | Цитировать Сообщить модератору
 Re: ISNULL в предикате  [new]
_ч_
Member

Откуда:
Сообщений: 1440
dmitry stakanov,

а что будет, если написать так:

a.column1 = @p1 OR @p1 IS NULL 
17 июл 12, 15:59    [12878625]     Ответить | Цитировать Сообщить модератору
 Re: ISNULL в предикате  [new]
user89
Member

Откуда:
Сообщений: 2083
dmitry stakanov,

Интересная тема
Выбор условия WHEN в WHERE
17 июл 12, 16:04    [12878660]     Ответить | Цитировать Сообщить модератору
 Re: ISNULL в предикате  [new]
dmitry stakanov
Member

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

резюме:

OR лучше, чем ISNULL, по крайней мере в случае инициализированных переменных, эстимация очень близка к актуал.

остановился на гибридном решении: OR + RECOMPILE + FORCESSEK;

OR дает адекватную оценку, когда переменные инициализированы
FORCESEEK не дает падать запросу в сканы, тк один OR не спасает, когда переменные NULL;

всем, спасибо!

ps но все равно бубен какой-то, хотя запрос простой... (
17 июл 12, 16:51    [12879136]     Ответить | Цитировать Сообщить модератору
 Re: ISNULL в предикате  [new]
iap
Member

Откуда: Москва
Сообщений: 47085
Странно. Никто не сказал, что
a.column1 = ISNULL(@p1, a.column1 )
эквивалентно
a.column1 = @p1 OR @p1 IS NULL AND a.column1 IS NOT NULL
Мне что-то кажется, это не совсем то, на что расчитывал dmitry stakanov
17 июл 12, 22:34    [12880737]     Ответить | Цитировать Сообщить модератору
 Re: ISNULL в предикате  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
dmitry stakanov
all,

резюме:

OR лучше, чем ISNULL, по крайней мере в случае инициализированных переменных, эстимация очень близка к актуал.

остановился на гибридном решении: OR + RECOMPILE + FORCESSEK;

OR дает адекватную оценку, когда переменные инициализированы
FORCESEEK не дает падать запросу в сканы, тк один OR не спасает, когда переменные NULL;

всем, спасибо!

ps но все равно бубен какой-то, хотя запрос простой... (
Зачем вам FORCESSEK? Если переменные = NULL, то вам нужно выбрать все данные, и делать это через SEEK самое плохое решение какое только можно придумать.

Версию сервера кстати предлагаете угадать? Если у вас 2008 SP2 и выше, то одного RECOMPILE вам хватит за глаза, сервер сам разберется, не надо его ограничивать.
17 июл 12, 23:39    [12880954]     Ответить | Цитировать Сообщить модератору
 Re: ISNULL в предикате  [new]
dmitry stakanov
Member

Откуда:
Сообщений: 241
Mind
dmitry stakanov
all,

резюме:

OR лучше, чем ISNULL, по крайней мере в случае инициализированных переменных, эстимация очень близка к актуал.

остановился на гибридном решении: OR + RECOMPILE + FORCESSEK;

OR дает адекватную оценку, когда переменные инициализированы
FORCESEEK не дает падать запросу в сканы, тк один OR не спасает, когда переменные NULL;

всем, спасибо!

ps но все равно бубен какой-то, хотя запрос простой... (
Зачем вам FORCESSEK? Если переменные = NULL, то вам нужно выбрать все данные, и делать это через SEEK самое плохое решение какое только можно придумать.

Версию сервера кстати предлагаете угадать? Если у вас 2008 SP2 и выше, то одного RECOMPILE вам хватит за глаза, сервер сам разберется, не надо его ограничивать.


не совсем так. в самой большой таблице даже, если обе переменные NULL, выборка должна быть ~10%.
да, 2008r2sp2.

пс кстати, вопрос: если вешать recompile на запрос и на процедуру, то планы запроса разные. почему?
ппс forceseek вешался на самую обльшую таблицу.
18 июл 12, 11:25    [12882295]     Ответить | Цитировать Сообщить модератору
 Re: ISNULL в предикате  [new]
dmitry stakanov
Member

Откуда:
Сообщений: 241
iap
Странно. Никто не сказал, что
a.column1 = ISNULL(@p1, a.column1 )
эквивалентно
a.column1 = @p1 OR @p1 IS NULL AND a.column1 IS NOT NULL
Мне что-то кажется, это не совсем то, на что расчитывал dmitry stakanov


не совсем так.

разная оценка кардинальности получается. в первом случае недооценка ~5, во втором переоценка в ~1.7 раза.
это с forceseek и recompile на процедуре.
18 июл 12, 11:39    [12882409]     Ответить | Цитировать Сообщить модератору
 Re: ISNULL в предикате  [new]
iap
Member

Откуда: Москва
Сообщений: 47085
dmitry stakanov
iap
Странно. Никто не сказал, что
a.column1 = ISNULL(@p1, a.column1 )
эквивалентно
a.column1 = @p1 OR @p1 IS NULL AND a.column1 IS NOT NULL
Мне что-то кажется, это не совсем то, на что расчитывал dmitry stakanov


не совсем так.

разная оценка кардинальности получается. в первом случае недооценка ~5, во втором переоценка в ~1.7 раза.
это с forceseek и recompile на процедуре.
Что не совсем так?
Два логических выражения, написанные выше, просто-таки тождественно равны.
Весь вопрос только в том, может ли поле a.column1 принимать значение NULL.
Но об этом Вы не говорили.

Или Вы считаете, что NULL=NULL?
18 июл 12, 11:59    [12882551]     Ответить | Цитировать Сообщить модератору
 Re: ISNULL в предикате  [new]
dmitry stakanov
Member

Откуда:
Сообщений: 241
iap
dmitry stakanov
пропущено...


не совсем так.

разная оценка кардинальности получается. в первом случае недооценка ~5, во втором переоценка в ~1.7 раза.
это с forceseek и recompile на процедуре.
Что не совсем так?
Два логических выражения, написанные выше, просто-таки тождественно равны.
Весь вопрос только в том, может ли поле a.column1 принимать значение NULL.
Но об этом Вы не говорили.

Или Вы считаете, что NULL=NULL?


нет не может.

оценка тогда почему разная?
18 июл 12, 12:01    [12882570]     Ответить | Цитировать Сообщить модератору
 Re: ISNULL в предикате  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
dmitry stakanov
Mind
пропущено...
Зачем вам FORCESSEK? Если переменные = NULL, то вам нужно выбрать все данные, и делать это через SEEK самое плохое решение какое только можно придумать.

Версию сервера кстати предлагаете угадать? Если у вас 2008 SP2 и выше, то одного RECOMPILE вам хватит за глаза, сервер сам разберется, не надо его ограничивать.


не совсем так. в самой большой таблице даже, если обе переменные NULL, выборка должна быть ~10%.
да, 2008r2sp2.

пс кстати, вопрос: если вешать recompile на запрос и на процедуру, то планы запроса разные. почему?
ппс forceseek вешался на самую обльшую таблицу.
10% это много. Этого уже может быть вполне достаточно чтобы просканировать всю таблицу, но в любом случае, вам решать.
19 июл 12, 01:00    [12886121]     Ответить | Цитировать Сообщить модератору
 Re: ISNULL в предикате  [new]
dmitry stakanov
Member

Откуда:
Сообщений: 241
Mind
dmitry stakanov
пропущено...


не совсем так. в самой большой таблице даже, если обе переменные NULL, выборка должна быть ~10%.
да, 2008r2sp2.

пс кстати, вопрос: если вешать recompile на запрос и на процедуру, то планы запроса разные. почему?
ппс forceseek вешался на самую обльшую таблицу.
10% это много. Этого уже может быть вполне достаточно чтобы просканировать всю таблицу, но в любом случае, вам решать.


насчет forceseek вы правы были - убрал.
19 июл 12, 10:29    [12886942]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить