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
通过运行以下查询查看导致重新编译的语句。 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 */根据原因代码说明,修改相应语句、批处理或过程以避免重新编译。 例如,存储过程可能包含一个或多个
SET语句。 应从此过程中删除这些语句。有关重新编译原因和解决方法的更多示例,请参阅 SQL Server 2005 中的批处理编译、重新编译和计划缓存问题。 有关重新编译的详细信息,请参阅 重新编译执行计划。
如果问题仍然存在,请与 Microsoft 客户支持服务部门联系。