Preparando comandos no SQL Server Native Client
Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics Analytics Platform System (PDW)
O provedor OLE DB do SQL Server Native Client dá suporte à preparação de comandos para execução múltipla otimizada de um único comando; No entanto, a preparação de comando gera sobrecarga e um consumidor não precisa preparar um comando para executá-lo mais de uma vez. Em geral, um comando deverá ser preparado se for executado mais de três vezes.
Por razões de desempenho, a preparação é adiada até que o comando seja executado. Esse é o comportamento padrão. Não são conhecidos erros no comando que está sendo preparada até que ele seja executado ou uma operação de metapropriedade seja executada. Definir a propriedade SSPROP_DEFERPREPARE do SQL Server como FALSE pode desativar esse comportamento padrão.
No SQL Server, quando um comando é executado diretamente (sem prepará-lo primeiro), um plano de execução é criado e armazenado em cache. Caso a instrução SQL seja executada novamente, o SQL Server conta com um algoritmo eficiente que compara a nova instrução com o plano de execução existente no cache e reutiliza o plano nessa instrução.
Em comandos preparados, o SQL Server fornece suporte nativo à preparação e à execução das instruções de comando. Quando você prepara uma instrução, o SQL Server cria um plano de execução, o armazena em cache e retorna um identificador desse plano para o provedor. Em seguida, o provedor usa esse identificador para executar a instrução repetidamente. Não é criado nenhum procedimento armazenado. Como o identificador identifica diretamente o plano de execução de uma instrução SQL em vez de corresponder a instrução ao plano de execução no cache (como é o caso da execução direta), é mais eficiente preparar uma instrução do que executá-la diretamente, se você souber que a instrução será executada mais do que algumas vezes.
No SQL Server 2005 (9.x), as instruções preparadas não podem ser usadas para criar objetos temporários e referenciar procedimentos armazenados do sistema que criam objetos temporários, como tabelas temporárias. Esses procedimentos devem ser executados diretamente.
Alguns comandos jamais devem ser preparados. Por exemplo, os comandos que especificam a execução de procedimento armazenado ou incluem texto tendo em vista a criação do procedimento armazenado do SQL Server jamais devem ser preparados.
Se um procedimento armazenado temporário for criado, o provedor OLE DB do SQL Server Native Client executará o procedimento armazenado temporário, retornando resultados como se a instrução em si tivesse sido executada.
A criação de procedimento armazenado temporário é controlada pela propriedade de inicialização específica do provedor OLE DB do SQL Server Native Client SSPROP_INIT_USEPROCFORPREP. Se o valor da propriedade for SSPROPVAL_USEPROCFORPREP_ON ou SSPROPVAL_USEPROCFORPREP_ON_DROP, o provedor OLE DB do SQL Server Native Client tentará criar um procedimento armazenado quando um comando for preparado. A criação do procedimento armazenado tem êxito caso o usuário do aplicativo tenha permissões suficientes no SQL Server.
Para clientes que não costumam se desconectar, a criação de procedimentos armazenados temporários pode exigir recursos significativos de tempdb, o banco de dados do sistema do SQL Server, no qual os objetos temporários são criados. Quando o valor de SSPROP_INIT_USEPROCFORPREP é SSPROPVAL_USEPROCFORPREP_ ON, os procedimentos armazenados temporários criados pelo provedor OLE DB do SQL Server Native Client são descartados somente quando a sessão que criou o comando perde sua conexão com a instância do SQL Server. Caso essa conexão seja a padrão criada na inicialização da fonte de dados, o procedimento armazenado temporário só é descartado quando a fonte de dados deixa de ser inicializada.
Quando o valor de SSPROP_INIT_USEPROCFORPREP é SSPROPVAL_USEPROCFORPREP_ON_DROP, os procedimentos armazenados temporários do provedor OLE DB do SQL Server Native Client são descartados quando ocorre uma das seguintes situações:
O consumidor usa ICommandText::SetCommandText para indicar um novo comando.
O consumidor usa ICommandPrepare::Unprepare para indicar que deixou de exigir o texto de comando.
O consumidor libera todas as referências ao objeto de comando que usa o procedimento armazenado temporário.
Um objeto de comando tem, no máximo, um procedimento armazenado temporário em tempdb. Qualquer procedimento armazenado temporário existente representa o texto de comando atual de um objeto de comando específico.