Compartilhar via


Preparando comandos no SQL Server Native Client

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureAzure Synapse AnalyticsPDW (Analytics Platform System)

O provedor OLE DB SQL Server Native Client dá suporte à preparação de comando para a 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 aponta diretamente o plano de execução de uma instrução SQL, e não a correspondência entre a instrução e o plano de execução no cache (como acontece com a execução direta), é mais eficiente preparar uma instrução do que executá-la diretamente, caso você saiba que ela será executada mais de uma vez.

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 SQL Server Native Client executará o procedimento armazenado temporário, retornando resultados como se a própria instrução fosse executada.

A criação temporária de procedimento armazenado é controlada pelo SQL Server Native Client SSPROP_INIT_USEPROCFORPREP de propriedade de inicialização específica do provedor OLE DB. Se o valor da propriedade for SSPROPVAL_USEPROCFORPREP_ON ou SSPROPVAL_USEPROCFORPREP_ON_DROP, o provedor OLE DB 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 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 SQL Server Native Client são descartados quando ocorre um dos seguintes procedimentos:

  • 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.

Consulte Também

Comandos