Partager 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 Recompilation infinie détectée pour SQLHANDLE %hs, PlanHandle %hs, décalage de début %d, décalage de fin %d. Dernière raison de la recompilation : %d.

Explanation

Une ou plusieurs instructions ont provoqué la recompilation du lot de requêtes au moins 50 fois. L'instruction spécifiée doit être corrigée pour éviter d'autres recompilations.

Le tableau suivant répertorie les raisons de la recompilation.

Reason code Description
1 Schema changed
2 Statistics changed
3 Deferred compile
4 Définir la modification de l’option
5 Table temporaire modifiée
6 Ensemble de lignes à distance modifié
7 Pour les autorisations de navigation modifiées
8 Environnement de notification de requête modifié
9 PartitionView changed
10 Options de curseur modifiées
11 Option (recompilation) demandée.
12 Plan paramétré vidé
13 Linéarisation du plan de test
14 Plan affectant la version de la base de données modifiée
15 Stratégie de forçage du plan du Magasin des requêtes modifiée
16 Échec du forçage du plan du Magasin des requêtes
17 Magasin des requêtes manquant dans le plan
18 Recompilation requise pour l’exécution entrelacée
19 Pas de recompilation
20 Indicateurs du Magasin des requêtes modifiés
21 Échec de l’application indicateurs du Magasin des requêtes
22 Recompilation du magasin de requêtes pour capturer la requête de curseur
23 Recompilation pour nettoyer le plan de répartiteur multiplan

Pour afficher tous les codes de compilation, exécutez la requête de vue de gestion dynamique suivante :

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

User action

  1. Affichez l'instruction qui engendre la recompilation en exécutant la requête suivante. Replace the sql_handle, starting_offset, ending_offset, and plan_handle placeholders with the values specified in the error message. Les database_name colonnes et object_name les colonnes sont destinées NULL aux instructions Transact-SQL ad hoc et préparées.

    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. En fonction de la description du code de la raison, modifiez l'instruction, le lot ou la procédure pour éviter les recompilations. Par exemple, une procédure stockée peut contenir une ou plusieurs SET instructions. Ces instructions doivent être supprimées de la procédure.

    Pour plus d’exemples de causes et de résolutions de recompilation, consultez Compilation par lots, Recompilation et Problèmes de mise en cache de plan dans SQL Server 2005. Pour plus d’informations sur les recompilations, consultez Recompiler les plans d’exécution.

  3. Si le problème persiste, contactez les services d'assistance Microsoft.