Эффективный способ выдержать сравнение для ПУСТОГО УКАЗАТЕЛЯ или оценить за столбец в SQL

Что эффективный путь состоит в том, чтобы проверить на пустой указатель или оценить за столбец в SQL-запросе. Рассмотрите sql таблицу table с целочисленным столбцом column который имеет индекс. @value может быть некоторое целое число или пустой указатель исключая: 16 или пустой указатель.

Запрос 1: Не уверенный, но кажется, что не нужно полагаться на короткое замыкание в SQL. Однако ниже запроса всегда работает правильно когда @value некоторое целое число или пустой указатель.

select * from
table
where (@value is null or column = @value)

Ниже запроса расширенная версия вышеупомянутого запроса. Это работает правильно также.

select * from 
table 
where ((@value is null) 
    or (@value is not null and column = @value))

Был бы вышеупомянутые 2 запроса пользоваться премуществом индекса?

Запрос 2: ниже запроса сравнивает столбец с непустым указателем @value еще сравнивает столбец column с собой, который всегда будет верен и возвращает все. Это работает правильно также. Этот запрос использовал бы в своих интересах индекс?

select * from
table
where (column = isnull(@value, column))

Каков лучший способ?

Примечание: Если ответ меняется в зависимости от баз данных, я интересуюсь MS-SQL.

9
задан hIpPy 31 October 2012 в 17:47
поделиться

1 ответ

Вариации на этот вопрос возникали несколько раз за последние пару дней (почему это всегда происходит в группах?). Короткий ответ: да, SQL Server закоротит логику, ЕСЛИ он создаст план запроса с известными значениями. Итак, если у вас есть этот код в сценарии, где установлены переменные, я считаю, что он должен замкнуть логику (проверьте, чтобы убедиться). Однако, если он находится в хранимой процедуре, SQL Server заранее создаст план запроса, и он не будет знать, может ли он выполнить короткое замыкание запроса, потому что он не знает значений параметров во время генерации план запроса.

Независимо от того, закорочен он или нет, SQL Server должен иметь возможность использовать индекс, если это единственная часть вашего запроса. Однако, если переменная имеет значение NULL, вы, вероятно, не хотите, чтобы SQL Server использовал индекс, потому что это будет бесполезно.

Если вы используете хранимую процедуру, лучше всего использовать OPTION (RECOMPILE) в вашем запросе. Это заставит SQL Server каждый раз создавать новый план запроса. Это небольшие накладные расходы, но выгоды обычно намного перевешивают их. Это подходит ТОЛЬКО для SQL 2008, и то только для некоторых более поздних пакетов обновления. До этого была ошибка с RECOMPILE, делающая его бесполезным. Для получения дополнительной информации ознакомьтесь с замечательной статьей Эрланда Соммарскога по этому поводу. В частности, вы захотите заглянуть в разделы статического SQL.

2
ответ дан 5 December 2019 в 01:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: