CORRECÇÃO: Execução simultâneas de procedimento armazenado que recompila pode falhar executar todas as instruções

Traduções deste artigo Traduções deste artigo
ID do artigo: 250506 - Exibir os produtos aos quais esse artigo se aplica.
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
BUG #: 55251 (SQLBUG_70)
Expandir tudo | Recolher tudo

Sintomas

Um procedimento armazenado pode falhar silenciosamente ao executar todas as instruções contidas nele se as seguintes condições são atendidas:

  • Várias conexões estão executando o mesmo procedimento simultaneamente.

  • Uma referência é feita para uma tabela temporária criada fora deste procedimento.

  • Um ou mais instruções que também podem causar uma recompilação (possivelmente disparada por 'estatísticas de atualização automática') siga a referência a essa tabela temporária.
Todas as instruções podem executar para alguns dos usuários executando o procedimento, enquanto outros falharem.

Como Contornar

Criar o procedimento com a cláusula WITH RECOMPILAR ou use a cláusula WITH RECOMPILAR ao executar o procedimento.

Situação

A Microsoft confirmou que este é um problema no SQL Server 7.0. Esse problema foi corrigido no EUA Service Pack 2 para o Microsoft SQL Server 7.0. Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
254561INF: Como obter o Service Pack 2 para Microsoft SQL Server 7.0 e Microsoft Data Engine (MSDE) 1.0
Para obter mais informações, entre em contato com seu provedor de suporte primário.

Mais Informações

Se uma referência é feita para uma tabela temporária criada fora do procedimento atual, que instrução e quaisquer instruções subseqüentes podem não ser compiladas quando o procedimento é executado pela primeira vez. Isso ocorre porque nenhuma informação é conhecida sobre o esquema da tabela. Após a execução atinge essa instrução e os valores de esquema e cardinalidade estão disponíveis, o procedimento é recompilado usando essas informações. Para minimizar o tempo de compilação, o SQL Server faz uma "compilação parcial" nessa situação e apenas gera um plano de consulta para instruções até este.

Uma vez que vários usuários possam compartilhar um plano de compilado, o SQL Server 7.0 serializa recompilações para garantir que somente uma das conexões executa a recompilação. Se as outras conexões também precisará recompilar, eles esperar na primeira conexão para concluir seu recompilar e retomar a execução na sua próxima etapa.

Se você encontrar uma situação onde duas conexões são em vários estágios de execução e aquele que dispara a recompilação é primeiro antes da referência para a tabela temporária criada fora o procedimento, ele irá parar compilando um plano quando atingir essa instrução. Se uma segunda conexão está em algum lugar após isso e também aciona uma recompilação enquanto a primeira conexão é compilar, ele continua a execução e incorretamente acredita que executou todas as instruções no plano.

Se você usar WITH RECOMPILAR, quando o procedimento for criado ou quando ele é executado, as duas conexões nunca compartilham o mesmo plano compilado e nunca encontrará essa condição.

Sempre que possível, também é aconselhável fazer referência a uma tabela temporária criada fora do procedimento atual, pois ela sempre requer uma recompilação do procedimento. Outras práticas de programação para procedimentos armazenados podem ser encontradas no tópico "Dicas de Transact-SQL" nos manuais online do SQL.

Para determinar quando um procedimento é ser recompilado, você pode observar o evento SP:Recompile no SQL Profiler.

Propriedades

ID do artigo: 250506 - Última revisão: domingo, 20 de outubro de 2013 - Revisão: 2.0
A informação contida neste artigo aplica-se a:
  • Microsoft SQL Server 7.0 Standard Edition
Palavras-chave: 
kbnosurvey kbarchive kbmt kbbug kbfix KB250506 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 250506

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com