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


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

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

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

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

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

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

Некоторые команды не могут быть подготовлены. Например, команды, указывающие выполнение хранимой процедуры или содержащие недопустимый текст для создания хранимой процедуры 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 не более одной хранимой процедуры. Любая существующая временная хранимая процедура представляет текущий текст команды для этого объекта.

См. также

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

Commands