Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
API ODBC определяет подготовленное выполнение как способ уменьшения затрат на анализ и компиляцию, связанных с многократной выполнением инструкции Transact-SQL. Приложение создает символьную строку, содержащую инструкцию SQL, а затем выполняет ее на двух этапах. Он вызывает функцию SQLPrepare один раз, чтобы оператор синтаксировался и компилировался в план выполнения ядром СУБД. Затем он вызывает SQLExecute для каждого выполнения подготовленного плана выполнения. Это позволяет сохранить синтаксический анализ и скомпилировать затраты на каждое выполнение. Подготовленное выполнение обычно используется приложениями для многократного выполнения одной и той же параметризованной инструкции SQL.
Для большинства баз данных подготовка выполняется быстрее, чем прямое выполнение для инструкций, выполняемых более трех или четырех раз, так как инструкция компилируется только один раз, а операторы, выполняемые непосредственно, компилируются непосредственно при каждом выполнении. Подготовленное выполнение также может обеспечить сокращение сетевого трафика, так как драйвер может отправлять идентификатор плана выполнения и значения параметров, а не всю инструкцию SQL в источник данных при каждом выполнении инструкции.
SQL Server уменьшает разницу в производительности между прямым и подготовленным выполнением с помощью улучшенных алгоритмов обнаружения и повторного использования планов выполнения из SQLExecDirect. Это делает некоторые преимущества производительности подготовленного выполнения доступными для инструкций, выполняемых непосредственно. Дополнительные сведения см. в разделе "Прямое выполнение".
SQL Server также обеспечивает встроенную поддержку подготовленного выполнения. План выполнения основан на SQLPrepare и более поздних версиях выполняется при вызове SQLExecute . Так как SQL Server не требуется для создания временных хранимых процедур в SQLPrepare, в системных таблицах tempdb нет дополнительных затрат.
По соображениям производительности подготовка инструкции откладывается до вызова SQLExecute или операции метапропастерии (например, SQLDescribeCol или SQLDescribeParam в ODBC). Это поведение по умолчанию. Все ошибки, которые подготавливаются в инструкции, не известны до выполнения инструкции или операции метапропастерии. Задание атрибута инструкции ODBC для собственного клиента SQL Server SQL_SOPT_SS_DEFER_PREPARE для SQL_DP_OFF может отключить это поведение по умолчанию.
В случае отложенной подготовки вызов SQLDescribeCol или SQLDescribeParam перед вызовом SQLExecute создает дополнительный раунд на сервер. В SQLDescribeCol драйвер удаляет предложение WHERE из запроса и отправляет его серверу с помощью SET FMTONLY ON, чтобы получить описание столбцов в первом результирующем наборе, возвращенном запросом. В SQLDescribeParam драйвер вызывает сервер, чтобы получить описание выражений или столбцов, на которые ссылаются все маркеры параметров в запросе. Этот метод также имеет некоторые ограничения, такие как отсутствие возможности разрешать параметры в вложенных запросах.
Избыточное использование SQLPrepare с драйвером ODBC собственного клиента SQL Server снижает производительность, особенно при подключении к более ранним версиям SQL Server. Подготовленное выполнение не должно использоваться для инструкций, выполняемых один раз. Подготовленное выполнение выполняется медленнее, чем прямое выполнение для одного выполнения инструкции, так как для него требуется дополнительный обход сети от клиента к серверу. В более ранних версиях SQL Server она также создает временную хранимую процедуру.
Подготовленные инструкции нельзя использовать для создания временных объектов в SQL Server.
Некоторые ранние приложения ODBC использовали SQLPrepare в любой момент использования SQLBindParameter . SQLBindParameter не требует использования SQLPrepare, его можно использовать с SQLExecDirect. Например, используйте SQLExecDirect с SQLBindParameter для получения возвращаемого кода или выходных параметров из хранимой процедуры, которая выполняется только один раз. Не используйте SQLPrepare с SQLBindParameter, если только одна и та же инструкция не будет выполняться несколько раз.