查找具有很长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)