Partilhar via


Preparando comandos

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSistema de Plataforma de Análise (PDW)Base de dados SQL no Microsoft Fabric

Baixar driver OLE DB

O Driver OLE DB para SQL Server suporta a preparação de comandos para execução múltipla otimizada de um único comando; no entanto, a preparação de comandos gera sobrecarga, e o consumidor não precisa de preparar um comando para o executar mais do que uma vez. Em geral, deve ser preparado um comando se for executado mais de três vezes.

Por razões de desempenho, a preparação do comando é adiada até que o comando seja executado. Este é o comportamento padrão. Quaisquer erros no comando em preparação não são conhecidos até que o comando seja executado ou uma operação de metapropriedade seja executada. Definir a propriedade do SQL Server SSPROP_DEFERPREPARE como FALSE pode desativar este comportamento predefinido.

No SQL Server, quando um comando é executado diretamente (sem o preparar primeiro), é criado e armazenado em cache um plano de execução. Se a instrução SQL for executada novamente, o SQL Server tem um algoritmo eficiente para corresponder a nova instrução ao plano de execução existente na cache e reutiliza o plano de execução para essa instrução.

Para comandos preparados, o SQL Server fornece suporte nativo para preparar e executar instruções de comandos. Quando prepara uma instrução, o SQL Server cria um plano de execução, armazena-o em cache e devolve um handle a esse plano de execução ao fornecedor. O fornecedor usa então este handle para executar a instrução repetidamente. Não são criados procedimentos armazenados. Como o handle identifica diretamente o plano de execução de uma instrução SQL em vez de corresponder a instrução ao plano de execução na cache (como acontece na execução direta), é mais eficiente preparar uma instrução do que executá-la diretamente, se 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 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, comandos que especifiquem execução de procedimentos armazenados ou que incluam texto inválido para a criação de stored procedure no SQL Server não devem ser preparados.

Se for criado um procedimento armazenado temporário, o Driver OLE DB para SQL Server executa o procedimento armazenado temporário, devolvendo resultados como se a própria instrução tivesse sido executada.

A criação temporária de procedimentos armazenados é controlada pelo OLE DB Driver for SQL Server -specific propriedade de inicialização SSPROP_INIT_USEPROCFORPREP. Se o valor da propriedade for SSPROPVAL_USEPROCFORPREP_ON ou SSPROPVAL_USEPROCFORPREP_ON_DROP, o Driver OLE DB para SQL Server tenta criar um procedimento armazenado quando um comando é preparado. A criação de procedimentos armazenados é bem-sucedida se o utilizador da aplicação tiver permissões suficientes para o SQL Server.

Para consumidores que raramente se desconectam, a criação de procedimentos armazenados temporários pode exigir recursos significativos do tempdb, a base de dados do sistema SQL Server onde são criados objetos temporários. Quando o valor de SSPROP_INIT_USEPROCFORPREP está SSPROPVAL_USEPROCFORPREP_ ON, os procedimentos armazenados temporários criados pelo Driver OLE DB para SQL Server só são descartados quando a sessão que criou o comando perde a ligação à instância do SQL Server. Se essa ligação for a ligação padrão criada na inicialização da fonte de dados, o procedimento armazenado temporário é abandonado apenas quando a fonte de dados se torna desinicializada.

Quando o valor de SSPROP_INIT_USEPROCFORPREP é SSPROPVAL_USEPROCFORPREP_ON_DROP, o OLE DB Driver para procedimentos armazenados temporários do SQL Server é eliminado quando ocorre uma das seguintes situações:

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

  • O consumidor utiliza ICommandPrepare::Unprepare para indicar que já não necessita do texto do comando.

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

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

Ver também

Comandos