Freigeben über


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 Es wurde ein mögliche unbegrenzte Neukompilierung für SQLHANDLE %hs, PlanHandle %hs, Startoffset %d, Endoffset %d erkannt. Die letzte Ursache für die Neukompilierung war %d.

Explanation

Eine oder mehrere Anweisungen haben bewirkt, dass der Abfragebatch mindestens 50 Mal neu kompiliert wurde. Die angegebene Anweisung sollte korrigiert werden, um weitere Neukompilierungen zu vermeiden.

In der folgenden Tabelle werden die Ursachen für die Neukompilierung aufgelistet.

Reason code Description
1 Schema changed
2 Statistics changed
3 Deferred compile
4 Festlegen der Optionsänderung
5 Temp. Tabelle geändert
6 Remote-Rowset geändert
7 Zum Ändern der Berechtigungen für "Durchsuchen"
8 Abfragebenachrichtigungsumgebung geändert
9 PartitionView changed
10 Cursoroptionen geändert
11 Option (Neukompilierung) angefordert
12 Parametrisierter Plan geleert
13 Linearisierung des Testplans
14 Plan, der sich auf die geänderte Datenbankversion auswirkt
15 Abfragespeicherplan zum Erzwingen von Richtlinienänderung
16 Fehler beim Erzwingen des Abfragespeicherplans
17 Abfragespeicher, der den Plan fehlt
18 Interleavierte Ausführung erforderlich neu kompiliert
19 Kein erneutes Kompilieren
20 Abfragespeicherhinweise geändert
21 Fehler bei der Abfragespeicherhinweisanwendung
22 Erneutes Kompilieren des Abfragespeichers zum Erfassen der Cursorabfrage
23 Neukompilieren zum Bereinigen des Multiplan-Verteilerplans

Führen Sie zum Anzeigen aller Kompilierungscodes die folgende Dynamische Verwaltungsansichtsabfrage aus:

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

User action

  1. Zeigen Sie die Anweisung an, die die Neukompilierung verursacht, indem Sie die folgende Abfrage ausführen. Replace the sql_handle, starting_offset, ending_offset, and plan_handle placeholders with the values specified in the error message. Die database_name spalten sind object_nameNULL für Ad-hoc-Anweisungen und vorbereitete Transact-SQL Anweisungen.

    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. Ändern Sie auf Grundlage der Beschreibung des Ursachencodes die Anweisung, den Batch oder die Prozedur, um Neukompilierungen zu vermeiden. Eine gespeicherte Prozedur kann z. B. eine oder SET mehrere Anweisungen enthalten. Diese Anweisungen sollten aus der Prozedur entfernt werden.

    Weitere Beispiele für Neukompilierungsursachen und -auflösungen finden Sie unter Batchkompilierung, Neukompilierung und Planen von Zwischenspeicherungsproblemen in SQL Server 2005. Weitere Informationen zu Neukompilierungen finden Sie unter Recompilile-Ausführungspläne.

  3. Wenn das Problem wiederholt auftritt, wenden Sie sich an den Microsoft-Kundendienst.