Udostępnij za pomocą


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 Wykryto możliwość nieskończonej ponownej kompilacji dla SQLHANDLE %hs, PlanHandle %hs, przesunięcie początkowe %d, przesunięcie końcowe %d. Ostatnią przyczyną ponownego kompilu była %d.

Explanation

Co najmniej jedna instrukcja spowodowała ponowne skompilowania partii zapytań co najmniej 50 razy. Określona instrukcja powinna zostać poprawiona, aby uniknąć dalszych ponownych kompilacji.

W poniższej tabeli wymieniono przyczyny ponownej kompilacji.

Reason code Description
1 Schema changed
2 Statistics changed
3 Deferred compile
4 Ustawianie zmiany opcji
5 Zmieniono tabelę temp
6 Zmieniono zdalny zestaw wierszy
7 Zmieniono uprawnienia przeglądania
8 Zmieniono środowisko powiadomień o zapytaniach
9 PartitionView changed
10 Zmieniono opcje kursora
11 Żądana opcja (ponowna kompilacja)
12 Opróżniony plan sparametryzowany
13 Linearyzacja planu testowania
14 Planowanie wpływu na zmianę wersji bazy danych
15 Plan magazynu zapytań wymusza zmianę zasad
16 Wymuszenie wymuszania planu magazynu zapytań nie powiodło się
17 Brak planu magazynu zapytań
18 Przeplatane wykonanie wymagane ponownej kompilacji
19 Nie rekompiluj
20 Zmieniono wskazówki dotyczące magazynu zapytań
21 Aplikacja wskazówek dotyczących magazynu zapytań nie powiodła się
22 Ponowne komkompilowanie magazynu zapytań w celu przechwycenia zapytania kursora
23 Ponowne komponowanie w celu oczyszczenia planu dyspozytora wieloplanowego

Aby wyświetlić wszystkie kody kompilacji, uruchom następujące dynamiczne zapytanie widoku zarządzania:

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

User action

  1. Wyświetl instrukcję powodującą ponowną kompilację, uruchamiając następujące zapytanie. Replace the sql_handle, starting_offset, ending_offset, and plan_handle placeholders with the values specified in the error message. Kolumny database_name i object_nameNULL przeznaczone dla ad hoc i przygotowane Transact-SQL instrukcji.

    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. Na podstawie opisu kodu przyczyny zmodyfikuj instrukcję, partię lub procedurę, aby uniknąć ponownej kompilacji. Na przykład procedura składowana może zawierać co najmniej jedną SET instrukcję. Te instrukcje należy usunąć z procedury.

    Aby uzyskać więcej przykładów przyczyn ponownej kompilacji i rozwiązań, zobacz Kompilacja wsadowa, Ponowne kompilowanie i Problemy z buforowaniem planu w programie SQL Server 2005. Aby uzyskać więcej informacji na temat ponownej kompilacji, zobacz Recompile execution plans (Ponowne kompilowanie planów wykonywania).

  3. Jeśli problem będzie się powtarzać, skontaktuj się z pomocą techniczną firmy Microsoft.