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

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

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

Чтобы решить эту проблему, электронная таблица использует разновидность встроенного SQL под названием динамический 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 или SQLDA.

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

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