Поделиться через


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Подготовка и выполнение в более ранних версиях SQL Server

SQL Server версии 6.5 и более ранних версиях не поддерживают напрямую модель подготовки и выполнения. Тем не менее драйвер ODBC в SQL Server поддерживает модель подготовки и выполнения с помощью хранимых процедур:

  • когда приложение запрашивает подготовку инструкции SQL, драйвер ODBC помещает эту инструкцию в инструкцию CREATE PROCEDURE и отправляет ее в SQL Server;
  • при запросе выполнения драйвер ODBC запрашивает в SQL Server выполнение созданной хранимой процедуры.

В SQL Server 6.5 и SQL Server 6.0 созданные хранимые процедуры являются временными и хранятся в базе данных tempdb. Поскольку SQL Server версии 4.21a и более ранние версии не поддерживают временные хранимые процедуры, драйвер создает обычные процедуры, которые хранятся в текущей базе данных. При подключении к SQL Server версии 6.5, SQL Server версии 6.0 и SQL Server версии 4.21a поставщик Microsoft OLE DB для SQL Server и драйвер ODBC SQL Server, входящие в состав SQL Server 2000, ведут себя аналогичным образом.

См. также

Основные понятия

Кэширование и повторное использование плана выполнения
Параметры и повторное использование планов выполнения

Справка и поддержка

Получение помощи по SQL Server 2005