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

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

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

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

Самый простой способ выполнения динамической инструкции SQL — с инструкцией EXECUTE ИНТЕРПРЕТАЦИЯ. Эта инструкция передает инструкцию SQL в СУБД для компиляции и выполнения.

Одним из недостатков инструкции EXECUTE ИНТЕРПРЕТАЦИЯ является то, что СУБД должна пройти каждый из пяти шагов обработки инструкции SQL при каждом выполнении инструкции. Затраты, связанные с этим процессом, могут быть значительными, если многие инструкции выполняются динамически, и это расточительно, если эти инструкции похожи.

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

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

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

  2. Программа передает инструкцию SQL в СУБД с инструкцией PREPARE, которая запрашивает синтаксический анализ, проверку и оптимизацию инструкции и создание плана выполнения. Затем программа использует инструкцию EXECUTE (а не инструкцию EXECUTE ИНТЕРПРЕТАЦИЯ) для последующего выполнения инструкции PREPARE. Он передает значения параметров для инструкции через специальную структуру данных, называемую областью данных SQL или SQLDA.

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

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

См. также

EXECUTE (Transact-SQL)
sp_executesql (Transact-SQL)