Простая параметризация

В SQL Server 2005 использование параметров или маркеров параметров в инструкциях Transact-SQL увеличивает возможности реляционного механизма по применению существующих скомпилированных планов выполнения для новых инструкций SQL.

ms186219.security(ru-ru,SQL.90).gifПримечание безопасности.
Использование параметров или маркеров параметров для хранения значений, введенных конечными пользователями, более безопасно, чем сцепление значений в строку, которая впоследствии выполняется с помощью API-метода доступа к данным, инструкции EXECUTE или хранимой процедуры sp_executesql.

Если инструкция SQL выполняется без параметров, SQL Server 2005 неявно параметризует инструкцию, чтобы увеличить возможность ее противопоставления существующему плану выполнения. Данный процесс называется простой параметризацией. В SQL Server 2000 этот процесс назывался автоматической параметризацией.

Рассмотрим следующую инструкцию.

SELECT * FROM AdventureWorks.Production.Product 
WHERE ProductSubcategoryID = 1

Значение 1 в конце инструкции может быть указано в виде параметра. Реляционный механизм строит план выполнения для данного пакета, как если бы параметр был указан на месте значения 1. При помощи этой простой параметризации SQL Server 2005 распознает, что следующие две инструкции формируют, по сути, одинаковый план выполнения, и повторно использует первый план для второй инструкции:

SELECT * FROM AdventureWorks.Production.Product 
WHERE ProductSubcategoryID = 1

SELECT * FROM AdventureWorks.Production.Product 
WHERE ProductSubcategoryID = 4

В процессе обработки сложных инструкций SQL реляционный механизм может с трудом определять, какие выражения могут быть параметризованы. Чтобы увеличить способность реляционного механизма находить сложным инструкциям SQL соответствующие существующие неиспользованные планы выполнения, необходимо явно указать параметры при помощи процедуры sp_executesql или маркеров параметров. Дополнительные сведения см. в разделе Параметры и повторное использование планов выполнения.

ms186219.note(ru-ru,SQL.90).gifПримечание.
При использовании арифметических операторов +, -, *, / или % для явного или неявного преобразования постоянных значений типов int, smallint, tinyint или bigint в типы данных float, real, decimal или numeric, SQL Server применяет специальные правила для вычисления типа и точности результатов выражения. Однако эти правила различаются в зависимости от того, параметризован запрос или нет. Таким образом, одинаковые выражения в запросах могут в некоторых случаях давать отличающиеся результаты. Дополнительные сведения см. в разделе int, bigint, smallint, и tinyint (Transact-SQL).

В поведении простой параметризации по умолчанию SQL Server параметризует сравнительно небольшой класс запросов. Однако можно указать, чтобы все запросы в базе данных были параметризованы в соответствии с определенными ограничениями, настроив параметр PARAMETERIZATION команды ALTER DATABASE на FORCED. Уменьшая частоту компиляции запросов, эти действия улучшат производительность баз данных, которые испытывают большие объемы параллельных запросов. Дополнительные сведения см. в разделе Принудительная параметризация.

Иначе можно указать параметризацию одного запроса и других, синтаксически равных, но отличающихся значениями параметра, запросов. Дополнительные сведения см. в разделе Указание механизма параметризации запросов с помощью руководств плана.

См. также

Справочник

SQL Server, объект SQL Statistics

Справка и поддержка

Получение помощи по SQL Server 2005