Бөлісу құралы:


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

Применимо: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure azure Synapse Analytics Analytics Platform System (PDW)

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 , если только одна и та же инструкция не будет выполняться несколько раз.

См. также

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