Бөлісу құралы:


Подготовка команд

Применимо: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure azure Synapse Analytics Analytics Platform System (PDW)

Скачать драйвер OLE DB

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

По соображениям производительности подготовка команды откладывается до ее выполнения. Это поведение принимается по умолчанию. Об ошибках, содержащихся в подготавливаемой команде, не будет ничего известно до ее выполнения или до выполнения операции с метасвойством. Установка свойства SQL Server SSPROP_DEFERPREPARE значение FALSE может отключить это поведение по умолчанию.

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

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

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

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

При создании временной хранимой процедуры драйвер OLE DB для SQL Server выполняет временную хранимую процедуру и возвращает результаты, как если бы выполнялась сама инструкция.

Создание временных хранимых процедур управляется свойством инициализации SSPROP_INIT_USEPROCFORPREP, определяемым драйвером OLE DB для SQL Server. Если свойство имеет значение SSPROPVAL_USEPROCFORPREP_ON или SSPROPVAL_USEPROCFORPREP_ON_DROP, то драйвер OLE DB для SQL Server при подготовке команды выполняет попытку создать хранимую процедуру. Создание хранимой процедуры завершается успешно, если у пользователя приложения достаточно разрешений SQL Server.

Для потребителей, которые редко отключаются, создание временных хранимых процедур может потребовать значительных ресурсов tempdb, системной базы данных SQL Server, в которой создаются временные объекты. Если значение SSPROP_INIT_USEPROCFORPREP SSPROPVAL_USEPROCFORPREP_ ON, временные хранимые процедуры, созданные драйвером OLE DB для SQL Server, удаляются, только если сеанс, созданный командой, теряет подключение к экземпляру SQL Server. Если это соединение по умолчанию, созданное при инициализации источника данных, то временная хранимая процедура удаляется только тогда, когда источник данных становится неинициализированным.

Если свойство SSPROP_INIT_USEPROCFORPREP имеет значение SSPROPVAL_USEPROCFORPREP_ON_DROP, то временные хранимые процедуры драйвера OLE DB для SQL Server будут удаляться только в указанных ниже случаях.

  • Потребитель вызывает метод ICommandText::SetCommandText для задания новой команды.

  • Потребитель вызывает метод ICommandPrepare::Unprepare для указания на то, что текст команды больше не нужен.

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

Объект команды имеет в базе данных tempdb не более одной хранимой процедуры. Любая существующая временная хранимая процедура представляет текущий текст команды для этого объекта.

См. также

Команды