Подготовка инструкций SQL

В реляционном механизме SQL Server введена полная поддержка подготовки инструкций SQL перед их выполнением. Если приложению требуется выполнить инструкцию SQL несколько раз, то оно может использовать API базы данных следующим образом.

  • Однократная подготовка инструкции. Инструкция SQL компилируется в план выполнения.

  • Ранее скомпилированный план выполнения выполняется каждый раз при необходимости использовать эту инструкцию. Это избавляет от необходимости повторно компилировать инструкцию SQL при каждом последующем выполнении.

    Подготовка и выполнение инструкций контролируется функциями и методами API. Они не имеют отношения к языку Transact-SQL. Модель подготовки и выполнения инструкций SQL поддерживается поставщиком OLE DB для собственного клиента SQL Server, а также драйвером ODBC для собственного клиента SQL Server. При запросе на подготовку поставщик или драйвер отправляет инструкцию SQL Server с запросом на подготовку инструкции. SQL Server компилирует план выполнения и возвращает его дескриптор поставщику или драйверу. При запросе на выполнение поставщик или драйвер отправляет на сервер запрос на выполнение плана, связанного с этим дескриптором.

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

Злоупотребление моделью подготовки и выполнения может отрицательно сказаться на производительности. Если инструкция выполняется только один раз, то для прямого выполнения потребуется только один цикл приема-передачи с сервером. Для подготовки и выполнения инструкции SQL, которая выполняется только один раз, потребуется два таких цикла: один для подготовки и один для выполнения.

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

Приложение может выполнять отдельный запрос по каждому необходимому продукту:

SELECT * FROM AdventureWorks.Production.Product
WHERE ProductID = 63;

Второй способ заключается в следующем.

  1. Приложение подготавливает инструкцию, содержащую маркер параметра (?):

    SELECT * FROM AdventureWorks.Production.Product
    WHERE ProductID = ?;
    
  2. Затем оно связывает переменную программы с этим маркером.

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

Второй способ более эффективен, если инструкция выполняется более трех раз.

В SQL Server модель подготовки и выполнения не дает существенного прироста производительности по сравнению с непосредственным выполнением из-за того, каким образом SQL Server повторно использует планы выполнения. В SQL Server предусмотрены эффективные алгоритмы для сопоставления текущих инструкций SQL и планов, созданных для предыдущих случаев выполнения той же инструкции SQL. Если приложение выполняет инструкцию SQL с маркерами параметров несколько раз, то SQL Server будет в дальнейшем использовать уже готовый план выполнения (если только этот план не будет удален из кэша процедур). Впрочем, у модели подготовки и выполнения есть следующие достоинства:

  • поиск плана производится путем идентификации дескриптора, что эффективнее алгоритмов, которые применяются для сопоставления инструкции SQL и существующих планов выполнения;

  • приложение может управлять временем создания и повторного использования плана выполнения;

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