Подготовка команд
Поставщик OLE DB для собственного клиента SQL Server поддерживает подготовку команд для оптимизированного многократного выполнения одной команды. Однако подготовка команд создает дополнительную нагрузку, и потребителю нет необходимости выполнять подготовку команды для ее выполнения больше одного раза. Обычно команда должна быть подготовлена, если планируется выполнять ее больше трех раз.
По соображениям производительности подготовка команды откладывается до ее выполнения. Это поведение применяется по умолчанию. Ошибки, содержащиеся в подготавливаемой команде, неизвестны до выполнения команды или до выполнения операции с метасвойством. При установке для свойства SQL Server SSPROP_DEFERPREPARE значения FALSE это используемое по умолчанию поведение может быть отключено.
В SQL Server, если команда выполняется напрямую (без ее предварительной подготовки), план выполнения создается и кэшируется. Если инструкция SQL выполняется снова, SQL Server применяет эффективный алгоритм сопоставления новой инструкции с существующим планом выполнения и повторно использует план выполнения для этой инструкции.
В SQL Server предусмотрена встроенная поддержка подготавливаемых и выполняющихся инструкций. При подготовке инструкции SQL Server создает план выполнения, кэширует его и возвращает поставщику дескриптор этого плана выполнения. Поставщик затем использует этот дескриптор для повторного выполнения инструкции. Хранимые процедуры не создаются. Поскольку дескриптор прямо указывает на план выполнения инструкции SQL, а не сопоставляет инструкцию с планом выполнения в кэше (как в случае выполнения напрямую), более эффективным подходом является подготовить инструкцию, а не выполнять ее напрямую, если известно, что инструкция будет использоваться многократно.
В SQL Server 2005, SQL Server 2000 и SQL Server 7.0 подготовленные инструкции не могут применяться для создания временных объектов и не могут ссылаться на системные хранимые процедуры, создающие временные объекты, например временные таблицы. Эти процедуры следует выполнять напрямую.
Некоторые команды нельзя подготавливать. Например, команды, указывающие выполнение хранимой процедуры или содержащие недопустимый текст для создания хранимой процедуры 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. Любая существующая временная хранимая процедура представляет текущий текст определенного объекта команды.