Оба решения будут генерировать одинаковое количество компиляций.
Первое решение, которое оптимизатор запросов может составить наилучший план для каждого из двух разных запросов.Первый запрос (в ветви NULL IF) не так уж и хорош, но второй (в ветви NOT NULL идентификатора) можно оптимизировать, если существует индекс для столбца Id
.
Но второе решение - это катастрофа оптимизации.Независимо от значения параметра @User_Id
оптимизатор должен разработать план, который работает для любого значения параметра.Таким образом, независимо от значения @User_Id
план будет всегда использовать сканирование неоптимальных таблиц.Обойти эту проблему просто невозможно, и это , а не параметр, сниффинг, как некоторые могут подумать.Это просто правильность плана, даже если значение во время генерации плана НЕ равно NULL, план должен работать , даже если параметр равен NULL, поэтому он не может использовать индекс наId
.
Всегда, всегда, всегда используйте первую форму с явным IF
.