Condividi tramite


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 Rilevata una possibile ricompilazione infinita per SQLHANDLE %hs, PlanHandle %hs, offset iniziale %d, offset finale %d. Motivo dell'ultima ricompilazione: % d.

Explanation

Una o più istruzioni ha determinato la ricompilazione del batch di query almeno 50 volte. Per evitare ulteriori ricompilazioni, è necessario correggere l'istruzione specificata.

I motivi della ricompilazione sono elencati nella tabella seguente.

Reason code Description
1 Schema changed
2 Statistics changed
3 Deferred compile
4 Impostare la modifica dell'opzione
5 Tabella temporanea modificata
6 Set di righe remoto modificato
7 Per le autorizzazioni di esplorazione modificate
8 Ambiente di notifica query modificato
9 PartitionView changed
10 Opzioni cursore modificate
11 Opzione (recompile) richiesta
12 Piano parametrizzato azzerato
13 Linearizzazione del piano di test
14 Piano che influisce sulla versione del database modificato
15 Politica di forzatura del piano del Query Store modificata
16 Forzatura del piano nel Query Store fallita
17 Piano mancante nell'archivio query
18 Esecuzione interleaved richiesta di ricompilazione
19 Non una ricompilazione
20 Hint di Query Store modificati
21 L'applicazione degli hint di Query Store non è riuscita
22 Ricompilazione di Query Store per acquisire la query del cursore
23 Ricompilazione per pulire il piano del dispatcher multipiattaforma

Per visualizzare tutti i codici di compilazione, eseguire la query di visualizzazione a gestione dinamica seguente:

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

User action

  1. Visualizzare l'istruzione che determina la ricompilazione mediante l'esecuzione della query seguente. Replace the sql_handle, starting_offset, ending_offset, and plan_handle placeholders with the values specified in the error message. Le database_name colonne e object_name sono NULL per istruzioni ad hoc e preparate 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. In base alla descrizione del codice motivo, modificare l'istruzione, il batch o la procedura per evitare ricompilazioni. Ad esempio, una stored procedure può contenere una o più SET istruzioni. Queste istruzioni devono essere rimosse dalla procedura.

    Per altri esempi di cause e risoluzioni della ricompilazione, vedere Compilazione batch, ricompilazione e problemi di memorizzazione nella cache dei piani in SQL Server 2005. Per altre informazioni sulle ricompilazione, vedere Ricompilare i piani di esecuzione.

  3. Se il problema persiste, contattare il Servizio Supporto Tecnico Clienti Microsoft.