жестко закодировано.С производительностью SQL важнее ремонтопригодность.
Последствия в плане выполнения между использованием константы, которую оптимизатор может проверить во время генерации плана, и использованием любой формы косвенного обращения (UDF, JOIN, подзапрос) часто бывают драматичными.SQL-компиляция - это необычный процесс (в том смысле, что он не является "обычным", как, скажем, генерация IL-кода), поскольку результат определяется не только компилируемой языковой конструкцией (т. Е. Фактическим текстом запроса), но ипо схеме данных (существующие индексы) и фактические данные в этих индексах (статистика).Когда используется жестко закодированное значение, оптимизатор может дать лучший план, потому что он может фактически сравнить значение со статистикой индекса и получить оценку результата.
Другое соображение состоит в том, что приложение SQL не является кодомтолько, но с большим отрывом это код и данных.«Рефакторинг» SQL-программы ... отличается.Там, где в программе на C # можно изменить константу или перечисление, перекомпилировать и успешно запустить приложение, в SQL этого нельзя сделать, поскольку это значение, вероятно, присутствует в миллионах записей в базе данных, а изменение значения константы подразумевает также изменение ГБ данных.часто онлайн при выполнении новых операций.
То, что значение жестко задано в запросах и процедурах, видимых сервером, не обязательно означает, что значение должно быть жестко задано воригинальный исходный код проекта.Существуют различные инструменты генерации кода, которые могут позаботиться об этом.Рассмотрим что-нибудь столь же тривиальное, как использование переменных сценариев sqlcmd :
defines.sql
:
:setvar STATUS_LOADED 87
somesource.sql
:
:r defines.sql
SELECT ... FROM [Table] WHERE StatusId = $(STATUS_LOADED);
someothersource.sql
:
:r defines.sql
UPDATE [Table] SET StatusId = $(STATUS_LOADED) WHERE ...;