Подготовка команд в собственном клиенте SQL Server
Применимо: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure azure Synapse Analytics Analytics Platform System (PDW)
Поставщик 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 выполняет временную хранимую процедуру, возвращая результаты, как если бы сам оператор был выполнен.
Создание временной хранимой процедуры управляется поставщиком OLE DB собственного клиента SQL Server, определенным свойством инициализации SSPROP_INIT_USEPROCFORPREP. Если значение свойства SSPROPVAL_USEPROCFORPREP_ON или SSPROPVAL_USEPROCFORPREP_ON_DROP, поставщик OLE DB SQL Server Native Client пытается создать хранимую процедуру при подготовке команды. Создание хранимой процедуры завершается успешно, если у пользователя приложения достаточно разрешений 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 не более одной хранимой процедуры. Любая существующая временная хранимая процедура представляет текущий текст команды для этого объекта.