Есть ли проблемы с производительностью при использовании ISNULL () в SQL Server? - PullRequest
15 голосов
/ 19 января 2012

Я использую ISNULL в MS SQl server 2008, поскольку моя таблица слишком велика, может ли использование ISNULL повлиять на производительность?

Заранее спасибо

Ответы [ 7 ]

48 голосов
/ 19 января 2012

ISNULL () в предложении select оказывает незначительное влияние на производительность.С другой стороны, в предложении where это может очень сильно повлиять на производительность, поскольку не позволяет оптимизатору использовать индекс для этого столбца.where-предложение - оценить, не позволяет ли оптимизатор запросов использовать индекс.Если это так, рассмотрите возможность создания вычисляемого столбца с результатом if isnull (col1, 0), индексируйте вычисляемый столбец и используйте его в предложении where.

13 голосов
/ 19 января 2012

Да, может.Для оптимизатора лучше переписать запрос (если это возможно) в форме

(Field = @x OR @x IS NULL)

Поскольку использование функций в определенных случаях не позволяет оптимизатору использовать статистику, а иногда и принудительные неявные преобразования типов данных

11 голосов
/ 19 января 2012

Если вам нужно его использовать, то любые различия между ISNULL и альтернативами, такими как COALESCE или CASE, ничтожны.Не беспокойтесь об этом

Любые различия связаны с обработкой типов данных.COALESCE / CASE может добавлять неявные преобразования типов данных, тогда как ISNULL имеет более простые правила.

Edit

ISNULL в списке SELECT для подавления NULLS тривиально.Основная работа будет выполнена в обработке строк и данных.Дополнительный ISNULL не поддается измерению: не оптимизировать преждевременно

1 голос
/ 25 августа 2017

Да, в SQL Server Studio 2012 существует проблема с производительностью.

Проблема довольно очевидна, когда я использовал ISNULL в сочетании с OVER. После оптимизации (то есть, добавив ISNULL в подзапрос, который я использую OVER вкл), время выполнения сократилось с (примерно) 25,2 часа до 102 секунд.

Я предполагаю, что ISNULL в порядке, когда вы запускаете его по всему столбцу (например, в обычном SELECT). Но когда вы запускаете его с OVER, он каждый раз вызывается заново, что снижает производительность.

Не готов к дальнейшему бурению. Проще говоря, здесь для справки других.

1 голос
/ 25 июня 2013

Избегайте использования isNull в предложении where.См. Эта статья .

0 голосов
/ 19 января 2012

Это зависит от того, как вы его используете, но вы можете построить планы выполнения в обоих случаях (с ISNULL () и без него) и сравнить результаты.

0 голосов
/ 19 января 2012

Как уже упоминалось, это зависит от того, как и где вы используете его в своем запросе. Может быть, вы захотите показать, как вы используете его в своем запросе.

Кроме того, я бы порекомендовал вам перейти на это - Что делает оператор SQL пригодным для использования?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...