Compartilhar 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 detectada para SQLHANDLE %hs, PlanHandle %hs, deslocamento inicial %d, deslocamento final %d. O último motivo da recompilação foi %d.

Explanation

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

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

Reason code Description
1 Schema changed
2 Statistics changed
3 Deferred compile
4 Definir alteração de opção
5 Tabela temp 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 de cursor alteradas
11 Opção (recompilar) solicitada
12 Plano parametrizado liberado
13 Linearização do plano de teste
14 Plano que afeta a versão do banco de dados alterado
15 Plano do Repositório de Consultas forçando a alteração da política
16 Falha ao forçar o plano do Repositório de Consultas
17 Repositório de Consultas sem o plano
18 Recompilação necessária de execução intercalada
19 Não é um recompilação
20 Dicas 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 dispatcher 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. Para exibir a instrução que causa a recompilação, execute 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 as object_name colunas são NULL para instruções Transact-SQL ad hoc e preparadas.

    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 do 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. Essas instruções devem ser removidas 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 Planos no SQL Server 2005. Para obter mais informações sobre recompilações, consulte Recompilar planos de execução.

  3. Se o problema persistir, contate os Serviços de Atendimento ao Cliente da Microsoft.