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 已请求选项(重新编译)
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 语句 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 0x06000100A27E7C1FA821B10600 with actual plan_handle value */
    
  2. 根据原因代码说明,修改相应语句、批处理或过程以避免重新编译。 例如,存储过程可能包含一个或多个 SET 语句。 应从此过程中删除这些语句。

    有关重新编译原因和解决方法的更多示例,请参阅 SQL Server 2005 中的批处理编译、重新编译和计划缓存问题。 有关重新编译的详细信息,请参阅 重新编译执行计划

  3. 如果问题仍然存在,请与 Microsoft 客户支持服务部门联系。