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


MSSQLSERVER_2814

Область применения: SQL Server

Сведения

Атрибут Значение
Название продукта SQL Server
ИД события 2814
Источник событий MSSQLSERVER
Компонент SQLEngine
Символическое имя PR_POSSIBLE_INFINITE_RECOMPILE
Текст сообщения Обнаружена возможная бесконечная перекомпиляция для SQLHANDLE %hs, PlanHandle %hs, от смещения %d до смещения %d. Причиной последней перекомпиляции было %d.

Описание

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

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

Код основания Description
1 Изменение схемы
2 Изменение статистики
3 Отложенная компиляция
4 Изменение параметра SET
5 Изменение временной таблицы
6 Изменение удаленного набора строк
7 Изменение разрешений FOR BROWSE
8 Изменение среды уведомлений о запросах
9 Изменение секционированного представления
10 Изменение параметров курсора
11 Запрошено OPTION (RECOMPILE)

Действие пользователя

  1. Просмотрите инструкцию, вызывающую перекомпиляцию, запустив следующий запрос. Замените заполнители sql_handle, starting_offset, ending_offset и plan_handle соответствующими значениями, указанными в сообщении об ошибке. Столбцы database_name и object_name имеют значение NULL для нерегламентированных и подготовленных инструкций 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 0x06000100A27E7C1FA821B10600with actual plan_handle value*/;
    
  2. В зависимости от описания кода причины измените инструкцию, пакет или процедуру, чтобы избежать перекомпиляции. Например, хранимая процедура может содержать одну или несколько инструкций SET. Эти инструкции должны быть удалены из процедуры. Дополнительные примеры причин повторной компиляции и способов их устранения можно найти в статье Компиляция пакета, повторная компиляция и проблемы кэширования плана в SQL Server 2005.

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

См. также

Класс событий SQL:StmtRecompile