Когда я пишу SQL, я стараюсь сделать его максимально читаемым. Среди прочего я часто объявляю "константы" вместо использования "магических чисел".
то есть. вместо
WHERE [Order].OrderType = 3
Я делаю
DECLARE @OrderType_Cash AS int = 3;
...
WHERE [Order].OrderType = @OrderType_Cash
Это отлично работает, и я не заметил никаких проблем с производительностью для размера запросов и данных, с которыми я обычно работаю.
Недавно я прочитал статью о параметрах sniffing и обходных решениях (https://blogs.msdn.microsoft.com/turgays/2013/09/10/parameter-sniffing-problem-and-possible-workarounds/). В искусстве один из обходных решений представлен "использовать локальные переменные".
- Обходной путь: используйте локальную переменную. Это обходное решение очень похоже на предыдущее (OPTION (OPTIMIZE FOR (@VARIABLE UNKNOWN))) - когда вы присваиваете параметрам локальные SQL Server использует статистику плотности вместо статистических гистограмм - So Он оценивает то же самое количество записей для всех параметров. Недостатком является то, что некоторые запросы будут использовать субоптимальные планы, поскольку плотности не точны достаточно как статистическая гистограмма.
Это меня немного беспокоит, так как мои интерпретации состоят в том, что я могу получить неоптимальный план в моих хранимых процедурах только потому, что вместо "волшебного номера" я использую локальную переменную.
У меня также создалось впечатление, что SQL Server автоматически преобразует "магические числа" в переменные, чтобы повторно использовать планы.
Может кто-нибудь прояснит это для меня?
- Есть ли разница между использованием "магического числа" и локальной переменной?
- Если да, то это только в хранимых процедурах или применяется также к ad-hoc-запросам и динамическому SQL?
- Это плохая привычка использовать локальные переменные, как я?