#sql-server #query-optimization
#sql-server #оптимизация запросов
Вопрос:
В SQL Server 2012 у меня есть столбец INT с возможностью обнуления, который, когда он имеет значение, больше 0. Итак, для моих целей эти два оператора выдают идентичные результаты:
...WHERE MyColumn IS NOT NULL;
...WHERE MyColumn > 0;
Мой вопрос в том, как правило, является ли тот или иной вариант более эффективным? Предположим, что столбец проиндексирован правильно.
Комментарии:
1. Оба значения не совпадают, в вашем столбце имеет значение -1, тогда это допустимое число, и первое условие вычисляет true, а второе вычисляет false.
2. Я понимаю, что оба значения не совпадают, но для моих целей они одинаковы. Меня интересуют только записи, где значение равно > 0.
3. 1. Это два совершенно разных условия, которые не эквивалентны. 2. Если так уж получилось, что они эквивалентны, учитывая имеющиеся у вас данные, это своего рода экстремальная микрооптимизация, о которой вам действительно не стоит беспокоиться. Используйте
WHERE
предложение, которое имеет наибольший смысл для вашего запроса.4. Тогда > 0 было бы более эффективным. Одно условие и нули опущены
5. @TomRegan Если вас интересуют только записи, в которых есть значение
> 0
, тогда используйтеWHERE MyColumn > 0
. Выполнение чего-либо другого приведет к ужасному синтаксическому анализу для всех, кому приходится читать ваши запросы. Оптимизация на этом уровне не имеет значения.
Ответ №1:
Если у вас есть индекс, и вы выбираете только этот столбец, то оба параметра будут выполнять ПОИСК по ИНДЕКСУ или СКАНИРОВАНИЕ по ИНДЕКСУ, если вы выбираете другие атрибуты, очевидно, что это удаляет поиск или поиск по ключу или полностью, он может даже не использовать ваш индекс и использовать полное сканирование, зависит от избирательности столбцов. Следовательно, я не вижу никакой разницы в производительности при оценке предиката.
Если у вас есть отфильтрованный индекс, в котором есть записи, отличающиеся от NULL, тогда будет разница в вводе-выводе из-за количества операций чтения в записях
Комментарии:
1. Спасибо @Kannan, мы только что перешли с SQL Server 2005, я все еще не привык рассматривать отфильтрованные индексы, но это именно то, что мне нужно использовать здесь.
Ответ №2:
Я бы выбрал WHERE MyColumn > 0
, потому что это кристально ясно как условие и задокументировано самостоятельно.
С другой стороны, WHERE MyColumn IS NOT NULL
тоже понятно, но в вашем случае это скрывает особую логику, которая нигде не документирована. Вы ОЖИДАЕТЕ, что каждое значение not null является положительным целым числом, хотя область значений столбца является целочисленной. Для всех остальных это непонятно.
Я не думаю, что возникнут какие-либо проблемы с производительностью. Я думаю, что иногда мы чрезмерно анализируем некоторые вещи.