Delen 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 Er is een mogelijke oneindige hercompilatie gedetecteerd voor SQLHANDLE-%hs, PlanHandle-%hs, beginverschil %d, eindverschil %d. De laatste reden voor opnieuw compileren was %d.

Explanation

Een of meer instructies hebben ertoe geleid dat de querybatch minstens 50 keer opnieuw wordt gecompileerde. De opgegeven instructie moet worden gecorrigeerd om verdere hercompilaties te voorkomen.

De volgende tabel bevat de redenen voor hercompilatie.

Reason code Description
1 Schema changed
2 Statistics changed
3 Deferred compile
4 Optie wijzigen instellen
5 Tijdelijke tabel gewijzigd
6 Externe rijenset is gewijzigd
7 Bladerenmachtigingen zijn gewijzigd
8 Querymeldingsomgeving gewijzigd
9 PartitionView changed
10 Cursoropties gewijzigd
11 Optie (opnieuw compileren) aangevraagd
12 Geparameteriseerd plan leeggemaakt
13 Lineaire planning testen
14 Plan dat invloed heeft op de databaseversie gewijzigd
15 Query Store-plan dat beleid afdwingt gewijzigd
16 Het afdwingen van een Query Store-plan is mislukt
17 Query Store mist het plan
18 Vereiste hercompilatie voor interleaved-uitvoering
19 Geen hercompileren
20 Query Store-hints zijn gewijzigd
21 Query Store-hints-toepassing is mislukt
22 Query Store opnieuw compileren om cursorquery vast te leggen
23 Opnieuw compileren om het multiplan-dispatcherplan op te schonen

Als u alle compilatiecodes wilt weergeven, voert u de volgende dynamische beheerweergavequery uit:

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

User action

  1. Bekijk de instructie die de hercompilatie veroorzaakt door de volgende query uit te voeren. Replace the sql_handle, starting_offset, ending_offset, and plan_handle placeholders with the values specified in the error message. De database_name en object_name kolommen zijn NULL bedoeld voor ad-hoc en voorbereide Transact-SQL instructies.

    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. Wijzig de instructie, batch of procedure op basis van de beschrijving van de redencode om hercompilaties te voorkomen. Een opgeslagen procedure kan bijvoorbeeld een of meer SET instructies bevatten. Deze instructies moeten worden verwijderd uit de procedure.

    Zie Batch-compilatie- en hercompilatieproblemen in SQL Server 2005 voor meer voorbeelden van problemen met opnieuw compileren. Zie Uitvoeringsplannen opnieuw compileren voor meer informatie over hercompilaties.

  3. Als het probleem zich blijft voordoen, neemt u contact op met de klantenservice van Microsoft.