Поделиться через


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 Обнаружена возможная бесконечная перекомпиляция для SQLHANDLE %hs, PlanHandle %hs, от смещения %d до смещения %d. Причиной последней перекомпиляции было %d.

Explanation

Одна или несколько инструкций вызвали перекомпиляцию пакета запросов по крайней мере 50 раз. Необходимо исправить указанную инструкцию, чтобы избежать дальнейшей перекомпиляции.

В следующей таблице приводятся причины перекомпиляции.

Reason code Description
1 Schema changed
2 Statistics changed
3 Deferred compile
4 Изменение параметра "Задать"
5 Изменение временной таблицы
6 Изменение удаленного набора строк
7 Изменение разрешений на просмотр
8 Изменение среды уведомлений о запросах
9 PartitionView changed
10 Изменение параметров курсора
11 Запрошено OPTION (RECOMPILE)
12 Очистка параметризованного плана
13 Линейная схема тестирования
14 Изменение версии базы данных, влияющее на план
15 Изменение политики форсирования плана для хранилища запросов
16 Сбой форсирования плана для хранилища запросов
17 Отсутствие плана для хранилища запросов
18 Перекомпиляция выполнения, требуемая перекомпиляция
19 Не перекомпилировать
20 Изменены указания хранилища запросов
21 Сбой приложения с указанием хранилища запросов
22 Перекомпилирование хранилища запросов для записи запроса курсора
23 Повторная компиляция для очистки плана многопланового диспетчера

Чтобы просмотреть все коды компиляции, выполните следующий динамический запрос управления:

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

User action

  1. Просмотрите инструкцию, вызывающую перекомпиляцию, запустив следующий запрос. Replace the sql_handle, starting_offset, ending_offset, and plan_handle placeholders with the values specified in the error message. Столбцы database_name предназначены NULL для нерегламентированных и object_name подготовленных 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. В зависимости от описания кода причины измените инструкцию, пакет или процедуру, чтобы избежать перекомпиляции. Например, хранимая процедура может содержать одну или несколько SET инструкций. Эти инструкции должны быть удалены из процедуры.

    Дополнительные примеры причин повторной компиляции и устранения см. в статье "Компиляция пакетной службы", "Перекомпиляция" и "Планирование кэширования" в SQL Server 2005. Дополнительные сведения о перекомпиляции см. в разделе "Планы выполнения recompile".

  3. Если ошибка повторится, обратитесь в службу поддержки пользователей Майкрософт.