Простая параметризация
В SQL Server использование параметров или маркеров параметров в инструкциях Transact-SQL увеличивает возможности реляционного механизма по применению существующих скомпилированных планов выполнения для новых инструкций SQL.
Примечание по безопасности |
---|
Использование параметров или маркеров параметров для хранения значений, введенных конечными пользователями, более безопасно, чем объединение значений в строку, которая впоследствии выполняется с помощью метода API для доступа к данным, инструкции EXECUTE или хранимой процедуры sp_executesql. |
Если инструкция SQL выполняется без параметров, SQL Server неявно параметризует инструкцию, чтобы увеличить возможность ее противопоставления существующему плану выполнения. Данный процесс называется простой параметризацией. В SQL Server 2000 этот процесс назывался автоматической параметризацией.
Рассмотрим следующую инструкцию.
SELECT * FROM AdventureWorks.Production.Product
WHERE ProductSubcategoryID = 1;
Значение 1 в конце инструкции может быть указано в виде параметра. Реляционный механизм строит план выполнения для данного пакета, как если бы параметр был указан на месте значения 1. При помощи этой простой параметризации SQL Server распознает, что следующие две инструкции формируют, по сути, одинаковый план выполнения, и повторно использует первый план для второй инструкции:
SELECT * FROM AdventureWorks.Production.Product
WHERE ProductSubcategoryID = 1;
SELECT * FROM AdventureWorks.Production.Product
WHERE ProductSubcategoryID = 4;
В процессе обработки сложных инструкций SQL реляционный механизм может с трудом определять, какие выражения могут быть параметризованы. Чтобы увеличить способность реляционного механизма находить сложным инструкциям SQL соответствующие существующие неиспользованные планы выполнения, необходимо явно указать параметры при помощи процедуры sp_executesql или маркеров параметров. Дополнительные сведения см. в разделе Параметры и повторное использование планов выполнения.
Примечание |
---|
При использовании арифметических операторов (+, -, *, / или %) для явного или неявного преобразования постоянных значений типов данных int, smallint, tinyint или bigint в типы данных float, real, decimal или numericSQL Server применяет специальные правила для вычисления типа и точности результатов выражения. Однако эти правила различаются в зависимости от того, параметризован запрос или нет. Таким образом, одинаковые выражения в запросах могут в некоторых случаях давать отличающиеся результаты. Дополнительные сведения см. в разделе int, bigint, smallint и tinyint (Transact-SQL). |
При проведении простой параметризации SQL Server по умолчанию параметризует сравнительно небольшой класс запросов. Однако можно указать, чтобы все запросы в базе данных были параметризованы в соответствии с определенными ограничениями, настроив параметр PARAMETERIZATION команды ALTER DATABASE на FORCED. Уменьшая частоту компиляции запросов, эти действия улучшат производительность баз данных, которые испытывают большие объемы параллельных запросов. Дополнительные сведения см. в разделе Принудительная параметризация.
Иначе можно указать параметризацию одного запроса и других, синтаксически равных, но отличающихся значениями параметра, запросов. Дополнительные сведения см. в разделе Указание механизма параметризации запросов с помощью структур плана.