Динамическая производительность SQL в ODBC

Хотя статический SQL хорошо работает во многих ситуациях, существует класс приложений, в котором доступ к данным не может быть определен заранее. Например, предположим, что электронная таблица позволяет пользователю ввести запрос, который затем электронная таблица отправляет СУБД для получения данных. Очевидно, что содержимое этого запроса неизвестно программисту при написании программы электронной таблицы.

Динамическое выполнение

Чтобы решить эту проблему, электронная таблица использует форму внедренного SQL, именуемого Dynamic SQL. В отличие от статических инструкций SQL, которые жестко запрограммированы в программе, динамические инструкции SQL могут быть построены во время выполнения и помещены в переменную узла строки. Затем они отправляются в СУБД для обработки. Поскольку СУБД должна формировать план доступа во время выполнения для динамических инструкций SQL, динамический SQL обычно медленнее, чем статический SQL. При компиляции программы, содержащей динамические инструкции SQL, динамические инструкции SQL не удаляются из программы, как в статическом SQL. Вместо этого они заменяются вызовом функции, который передает инструкцию СУБД; статические инструкции SQL в одной программе обрабатываются обычным образом.

Самый простой способ выполнить динамическую инструкцию SQL — выполнить инструкцию EXECUTE IMMEDIATE. Эта инструкция передает инструкцию SQL в СУБД для компиляции и выполнения.

Одной из недостатков инструкции EXECUTE IMMEDIATE является то, что СУБД должна пройти каждый из пяти шагов обработки инструкции SQL при каждом выполнении инструкции. Накладные расходы, связанные с этим процессом, могут быть значительными, если многие инструкции выполняются динамически и непроизводительна, если эти инструкции похожи.

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

Для решения описанной выше ситуации динамический SQL предлагает оптимизированную форму выполнения с именем подготовленное выполнение, которая выполняет следующие действия:

  1. Программа конструирует инструкцию SQL в буфере точно так же, как это делается для инструкции EXECUTE IMMEDIATE. Вместо переменных-узлов вопросительный знак (?) может быть заменен на константу в любом месте текста инструкции, чтобы указать, что значение константы будет передано позже. Вопросительный знак вызывается как маркер параметра.

  2. Программа передает инструкцию SQL в СУБД с помощью инструкции PREPARE, которая запрашивает, что СУБД анализирует, проверяет и оптимизирует инструкцию и создает план выполнения для него. Затем программа использует инструкцию EXECUTE (а не инструкцию EXECUTE IMMEDIATE) для выполнения инструкции PREPARE позже. Он передает значения параметров для инструкции через специальную структуру данных, которая называется областью данных SQL или СКЛДА.

  3. Программа может многократно использовать инструкцию EXECUTE, указывая разные значения параметров при каждом выполнении динамической инструкции.

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

См. также

EXECUTE (Transact-SQL)
Хранимая процедура sp_executesql (Transact-SQL)