Поделиться через


Подготовленное выполнение

API ODBC определяет подготовленное выполнение как способ снижения затрат на анализ и компиляцию, связанных с повторным выполнением инструкции Transact-SQL. Приложение строит строку символов, содержащую инструкцию SQL, а затем выполняет ее в два этапа. Он вызывает функцию SQLPrepare один раз для анализа инструкции и ее компиляции в план выполнения ядром СУБД. Затем он вызывает SQLExecute для каждого выполнения подготовленного плана выполнения. Это снижает расход ресурсов на синтаксический анализ и компиляцию при каждом выполнении. Подготовленное выполнение часто используется приложениями для многократного выполнения параметризованных инструкций SQL.

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

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

SQL Server также обеспечивает встроенную поддержку подготовленного выполнения. План выполнения создается на основе SQLPrepare , а затем выполняется при вызове SQLExecute . Так как SQL Server не требуется для создания временных хранимых процедур в SQLPrepare, дополнительные затраты на системные таблицы в базе данных tempdb не требуются.

Для повышения производительности подготовка инструкции откладывается до вызова SQLExecute или выполнения операции метасвойства (например , SQLDescribeCol или SQLDescribeParam в ODBC). Это поведение по умолчанию. Любые ошибки в подготавливаемой инструкции неизвестны до выполнения инструкции или до выполнения операции над метасвойством. Установка SQL_SOPT_SS_DEFER_PREPARE атрибута SQL Server Native Client для конкретного драйвера ODBC SQL_DP_OFF может отключить это поведение по умолчанию.

В случае отложенной подготовки вызов SQLDescribeCol или SQLDescribeParam перед вызовом SQLExecute создает дополнительную повторную попытку на сервере. В SQLDescribeCol драйвер удаляет предложение WHERE из запроса и отправляет его на сервер с параметром SET FMTONLY ON, чтобы получить описание столбцов в первом результирующем наборе, возвращенном запросом. В SQLDescribeParam драйвер вызывает сервер, чтобы получить описание выражений или столбцов, на которые ссылаются любые маркеры параметров в запросе. Этот метод также имеет несколько ограничений, таких как невозможность обработки параметров вложенных запросов.

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

В SQL Server подготовленные инструкции нельзя применять для создания временных объектов.

Некоторые ранние приложения ODBC использовали SQLPrepare при использовании SQLBindParameter . SQLBindParameter не требует использования SQLPrepare, его можно использовать с SQLExecDirect. Например, используйте SQLExecDirect с SQLBindParameter , чтобы получить код возврата или выходные параметры из хранимой процедуры, которая выполняется только один раз. Не используйте SQLPrepare с SQLBindParameter , если только та же инструкция не будет выполнена несколько раз.

См. также:

Выполнение инструкций (ODBC)