Compartilhar via


Preparando comandos

O provedor OLE DB do SQL Server Native Client dá suporte à preparação de comando 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 ele for executado mais de três vezes.

Por motivos de desempenho, a preparação do comando é adiada até que o comando seja executado. Esse é o comportamento padrão. Os erros no comando que está sendo preparado não são conhecidos até que o comando seja executado ou uma operação de metapropertia seja executada. Definir a propriedade do SQL Server SSPROP_DEFERPREPARE 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. Se a instrução SQL for executada novamente, o SQL Server terá um algoritmo eficiente para corresponder a nova instrução com o plano de execução existente no cache e reutilizará o plano de execução dessa instrução.

Para comandos preparados, o SQL Server fornece suporte nativo para preparar e executar instruções de comando. Quando você prepara uma instrução, o SQL Server cria um plano de execução, armazena em cache e retorna um identificador para esse plano de execução para o provedor. Em seguida, o provedor usa esse identificador para executar a instrução repetidamente. Nenhum procedimento armazenado é criado. 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, as instruções preparadas não podem ser usadas para criar objetos temporários e não podem referenciar procedimentos armazenados do sistema que criam objetos temporários, como tabelas temporárias. Esses procedimentos devem ser executados diretamente.

Alguns comandos nunca devem ser preparados. Por exemplo, os comandos que especificam a execução de procedimento armazenado ou incluem texto inválido para a criação de procedimento armazenado do SQL Server não 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 própria instrução fosse executada.

A criação temporária de procedimento armazenado é controlada pelo provedor OLE DB do SQL Server Native Client -specific propriedade de inicialização 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 é preparado. A criação de procedimento armazenado terá êxito se o usuário do aplicativo tiver permissões suficientes do SQL Server.

Para consumidores que desconectam com pouca frequência, a criação de procedimentos armazenados temporários pode exigir recursos significativos do 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. Se essa conexão for a conexão padrão criada na inicialização da fonte de dados, o procedimento armazenado temporário será descartado somente quando a fonte de dados ficar não 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 um destes procedimentos:

  • O consumidor usa ICommandText::SetCommandText para indicar um novo comando.

  • O consumidor usa ICommandPrepare::Unprepare para indicar que ele não exige mais o texto do comando.

  • O consumidor libera todas as referências ao objeto de comando usando o procedimento armazenado temporário.

Um objeto de comando tem no máximo um procedimento armazenado temporário no tempdb. Qualquer procedimento armazenado temporário existente representa o texto de comando atual de um objeto de comando específico.

Consulte Também

Comandos