Partilhar via


MSSQLSERVER_2814

Applies to:SQL Server

Details

Attribute Value
Product Name SQL Server
Event ID 2814
Event Source MSSQLSERVER
Component SQLEngine
Symbolic Name PR_POSSIBLE_INFINITE_RECOMPILE
Message Text Uma possível recompilação infinita foi detetada para SQLHANDLE %hs, PlanHandle %hs, iniciando o offset %d, terminando o offset %d. A última razão de recompilação foi %d.

Explanation

Uma ou mais instruções fizeram com que o lote de consulta fosse recompilado pelo menos 50 vezes. A instrução especificada deve ser corrigida para evitar novas recompilações.

A tabela a seguir lista os motivos para a recompilação.

Reason code Description
1 Schema changed
2 Statistics changed
3 Deferred compile
4 Definir alteração de opção
5 Tabela temporária alterada
6 Conjunto de linhas remoto alterado
7 Para permissões de navegação alteradas
8 Ambiente de notificação de consulta alterado
9 PartitionView changed
10 Opções do cursor alteradas
11 Opção (recompilar) solicitada
12 Plano parametrizado lavado
13 Linearização do plano de teste
14 Plano que afeta a versão do banco de dados alterada
15 Plano do Repositório de Consultas forçando a política alterada
16 Falha ao forçar o plano do Repositório de Consultas
17 Loja de Consultas sem o plano
18 A execução intercalada exigiu recompilação
19 Não é uma recompilação
20 Sugestões do Repositório de Consultas alteradas
21 Falha no aplicativo de dicas do Repositório de Consultas
22 Recompilação do Repositório de Consultas para capturar a consulta do cursor
23 Recompilando para limpar o plano de despachante multiplano

Para exibir todos os códigos de compilação, execute a seguinte consulta de exibição de gerenciamento dinâmico:

SELECT * FROM sys.dm_xe_map_values
WHERE name LIKE '%compile%cause%';

User action

  1. Exiba a instrução que está causando a recompilação executando a consulta a seguir. Replace the sql_handle, starting_offset, ending_offset, and plan_handle placeholders with the values specified in the error message. As database_name colunas e object_name são NULL para declarações ad hoc e preparadas Transact-SQL.

    SELECT DB_NAME(st.dbid) AS database_name,
           OBJECT_NAME(st.objectid) AS object_name,
           st.text
    FROM sys.dm_exec_query_stats AS qs
    CROSS APPLY sys.dm_exec_sql_text(0x01000600B74C2A1300D2582A2100000000000000000000000000000000000000000000000000000000000000
     /* replace the 0x01000600B... value with the actual sql_handle */
    ) AS st
    WHERE qs.statement_start_offset = 123 /* replace 123 with actual starting_offset value */
          AND qs.statement_end_offset = 456 /* replace 456 with actual ending_offset value */
          AND qs.plan_handle = 0x06000100A27E7C1FA821B10600; /* replace 0x06000100A27E7C1FA821B10600 with actual plan_handle value */
    
  2. Com base na descrição do código de motivo, modifique a instrução, o lote ou o procedimento para evitar recompilações. Por exemplo, um procedimento armazenado pode conter uma ou mais SET instruções. Estas declarações devem ser retiradas do procedimento.

    Para obter mais exemplos de causas e resoluções de recompilação, consulte Compilação em lote, recompilação e problemas de cache de plano no SQL Server 2005. Para obter mais informações sobre recompilações, consulte Recompilar planos de execução.

  3. Se o problema persistir, contacte os Serviços de Apoio ao Cliente da Microsoft.