查询处理器耗尽内部资源,无法生成查询计划

6 sql-server-2008 sql-server

这在日志中每晚出现几次。如何找到导致问题的查询?SQL Server 2008 R2 Sp1。

Pau*_*ite 6

查找具有很长IN列表、大量UNIONs或大量嵌套子查询的查询。根据我的经验,这些是此特定错误消息的最常见原因。

有时,可以通过应用产品更新(服务包或累积更新)或启用支持的跟踪标志来解决该问题,但更常见的根本问题是某些工具或数据抽象层生成的异常 SQL。不幸的是,后者需要更改应用程序。

启用记录的跟踪标志 4102、4118、4122(或覆盖 4199)也可以避免您看到的问题。查看文档以查看它们是否解决了您案例中的根本原因:

TF 4122 的
Microsoft 知识库文章 TF 4102、4118 的
Microsoft 知识库文章 TF 4199 的 Microsoft 知识库文章


小智 -1

可能不是一个查询导致了该问题。如果您使用大量临时查询,则应谨慎启用“针对临时工作负载进行优化”。这样,SQL Server 将仅在第二次执行查询时创建计划。

您可以使用以下 SQL 进行检查(参考此处):

SELECT objtype AS [CacheType]
        , count_big(*) AS [Total Plans]
        , sum(cast(size_in_bytes as decimal(18,2)))/1024/1024 AS [Total MBs]
        , avg(usecounts) AS [Avg Use Count]
        , sum(cast((CASE WHEN usecounts = 1 THEN size_in_bytes ELSE 0 END) as decimal(18,2)))/1024/1024 AS [Total MBs - USE Count 1]
        , sum(CASE WHEN usecounts = 1 THEN 1 ELSE 0 END) AS [Total Plans - USE Count 1]
FROM sys.dm_exec_cached_plans
GROUP BY objtype
ORDER BY [Total MBs - USE Count 1] DESC
go
Run Code Online (Sandbox Code Playgroud)