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

Откуда:
Сообщений: 651
Приветы!

Имеется следующая довольно популярная конструкция:
DECLARE @id INT = 1
SELECT * FROM DOCUMENTS d 
WHERE (d.id = @id OR @id IS NULL)
Если указан параметр, то идет фильтрация по нему, если нет - фильтрация отключается.

PK таблицы сделан по полю ID. План выполнения показывает Clustered Index Scan, и непонятно, почему не Seek. По идее, до запуска селекта процессор мог определить, что @id - не NULL, и отключить часть "OR @id IS NULL". Почему он этого не делает?

Ессно, при запросе:
DECLARE @id INT = 1
SELECT * FROM DOCUMENTS d 
WHERE (d.id = @id)
выполняется Seek.

Буду признателен за подсказку.
13 июл 11, 12:38    [10966697]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по оптимизации...  [new]
Penner
Member

Откуда:
Сообщений: 342
IsNull(d.id,0)=id
13 июл 11, 12:42    [10966718]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по оптимизации...  [new]
Dmitry Gurianov
Member

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

Дружище, спасибо! Круто :)
13 июл 11, 12:44    [10966734]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по оптимизации...  [new]
Dmitry Gurianov
Member

Откуда:
Сообщений: 651
упс, поторопился... Неправильно
имелось в виду, наверное, это:
WHERE d.id = IsNull(@id, d.id)
но оно все равно дает Scan
13 июл 11, 12:51    [10966797]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по оптимизации...  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> PK таблицы сделан по полю ID. План выполнения показывает Clustered Index Scan, и непонятно, почему не Seek. По идее, до
> запуска селекта процессор мог определить, что @id - не NULL, и отключить часть "OR @id IS NULL". Почему он этого не делает?

ему для этого явно надо сказать:

SELECT  * FROM  DOCUMENTS d
WHERE  (d.id = @id)
option (recompile)

ну, последствия понятны, я думаю.

Posted via ActualForum NNTP Server 1.4

13 июл 11, 12:59    [10966867]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по оптимизации...  [new]
Dmitry Gurianov
Member

Откуда:
Сообщений: 651
daw, спасибо! В нашем случае это вполне приемлемо.
13 июл 11, 13:06    [10966934]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по оптимизации...  [new]
Crimean
Member

Откуда:
Сообщений: 13147
есть еще один вариант - устроить вечный between + option( recompile )
для конкретного значения - ставить его, для null - ставить min int / max int
13 июл 11, 17:37    [10969192]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить