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

Откуда:
Сообщений: 573
Правильно ли я понимаю, что индекс в SQL Server, как и в Oracle, НЕ хранит NULL значения?

Оптимизирую чужой запрос. В WHERE присутствует проверка ISNULL.
Когда я выношу ее из WHERE в тело процедуры скорость выполнения увеличивается в разы.
Это потому, что ISNULL вынуждает выполнять полный просмотр, а когда его нет, может использваться индекс?
Похоже?
26 май 14, 12:56    [16072793]     Ответить | Цитировать Сообщить модератору
 Re: NULL значения в индексе  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8577
ISNULL() - это не проверка, а функция. Скорее всего, Вы теряете оптимизацию при её использовании.
26 май 14, 13:03    [16072877]     Ответить | Цитировать Сообщить модератору
 Re: NULL значения в индексе  [new]
o-o
Guest
expimp
Правильно ли я понимаю, что индекс в SQL Server, как и в Oracle, НЕ хранит NULL значения?

если это обычный индекс, то хранит.
если же это специально созданный фильтрованный индекс с условием
where MyField IS NOT NULL
, то не хранит
26 май 14, 13:14    [16072993]     Ответить | Цитировать Сообщить модератору
 Re: NULL значения в индексе  [new]
user89
Member

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

когда-то находил здесь, на форуме
isnull поменять на or

--Быстро
SELECT * 
FROM table 
WHERE field1 = 1 AND (fiels = @val or @val is null)

--Медленно
SELECT * 
FROM table 
WHERE field1 = 1 AND fiels = isnull(@val,fiels)
26 май 14, 13:16    [16073012]     Ответить | Цитировать Сообщить модератору
 Re: NULL значения в индексе  [new]
expimp
Member

Откуда:
Сообщений: 573
Владислав Колосов
ISNULL() - это не проверка, а функция. Скорее всего, Вы теряете оптимизацию при её использовании.


Да, убрав INULL() получаю хорошую скорость. Но пытаюсь понять, почему.
А то получается, что это "силой молитв" )
26 май 14, 13:38    [16073252]     Ответить | Цитировать Сообщить модератору
 Re: NULL значения в индексе  [new]
daw
Member

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

ну, вы запрос-то уже покажете свой?
26 май 14, 13:46    [16073316]     Ответить | Цитировать Сообщить модератору
 Re: NULL значения в индексе  [new]
Glory
Member

Откуда:
Сообщений: 104751
expimp
Да, убрав INULL() получаю хорошую скорость. Но пытаюсь понять, почему.

Потому, что isnull() - это функция. Ее надо вычислять. Потому что нигде не хранится ее значение.
26 май 14, 14:18    [16073592]     Ответить | Цитировать Сообщить модератору
 Re: NULL значения в индексе  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4832
Попробуйте в качестве эксперимента добавить в индекс условие WHERE IS NOT NULL и проверьте, что произойдет.

Вторая идея -- сделайте persistent вычисляемое поле c выражением ISNULL или IIF (... IS NULL, 1, 0) и повесьте на него индекс
26 май 14, 19:16    [16075731]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить