最近收到一SQL Server数据库服务器的告警邮件,告警内容具体如下所示:

DATE/TIME: 10/23/2018 4:30:26 PM

DESCRIPTION:  The query processor ran out of internal resources and could not produce a query plan. This is a rare event and only expected for extremely complex queries or queries that reference a very large number of tables or partitions. Please simplify the query. If you believe you have received this message in error, contact Customer Support Services for more information.

COMMENT:   (None)

JOB RUN:   (None)

关于“8623 The query processor ran out of internal resources and could not produce a query plan”这个错误,这篇文章不分析错误产生的原因以及解决方案。这里仅仅介绍如何捕获产生这个错误的SQL语句。因为出现这个错误,具体对应的SQL语句不会写入到错误日志。不能定位到具体SQL语句,很难解决这错误。所以解决问题的前提是先定位SQL语句。我们可以通过扩展事件或服务器端跟踪两种方式来定位SQL语句。

扩展事件(Extended Events)捕获

如下所示,脚本只需根据实际情况修改filename、metadatafile参数对应的值。就会创建扩展事件(Extented Events)overly_complex_queries

CREATE EVENT SESSION

overly_complex_queries

ON SERVER

ADD EVENT sqlserver.error_reported

(

ACTION (sqlserver.sql_text, sqlserver.tsql_stack, sqlserver.database_id, sqlserver.username)

WHERE ([severity] = 16

AND [error_number] = 8623)

)

ADD TARGET package0.asynchronous_file_target

(set filename = 'D:\DB_BACKUP\overly_complex_queries.xel' ,

metadatafile = 'D:\DB_BACKUP\overly_complex_queries.xem',

max_file_size = 10,

max_rollover_files = 5)

WITH (MAX_DISPATCH_LATENCY = 5SECONDS)

GO

-- Start the session

ALTER EVENT SESSION overly_complex_queries

ON SERVER STATE = START

GO

然后我们测试,使用网上一个脚本测试验证,如下所示,执行这个脚本就会报“8623 The query processor ran out of internal resources and could not produce a query plan”错误,如下所示:

选中扩展事件(Extented Events)overly_complex_queries,单击右键“Watch Live Data"就能查看是那个SQL语句出现这个错误(sql_text),当然,也可以通过选项“View Target Data”查看所有捕获的数据。

 

注意:这个扩展事件只能运行在SQL Server 2012及后续版本,如果是SQL Server 2008的相关版本部署,就会报下面错误:

Msg 25706, Level 16, State 8, Line 1

The event attribute or predicate source, "error_number", could not be found.

Msg 15151, Level 16, State 1, Line 18

Cannot alter the event session 'overly_complex_queries', because it does not exist or you do not have permission.

 

服务器端跟踪(Server Side Trace)捕获

如上所示,刚好我们这台数据库服务器的版本为SQL Server 2008 R2,我们只能采取Server Side Trace来捕获这个错误的SQL语句。设置Server Side Trace脚本如下(相关参数需根据实际情况等设定):

-- 定义参数  

declare @rc int  

declare @TraceID int  

declare @maxfilesize bigint  

set @maxfilesize = 1024   

 

-- 初始化跟踪  

exec @rc = sp_trace_create @TraceID output, 0, N'D:\SQLScript\trace_error_8623', @maxfilesize, NULL   

--此处的D:\SQLScript\trace_error_8623是文件名(可自行修改),SQL会自动在后面加上.trc的扩展名  

if (@rc != 0) goto error  

 

-- 设置跟踪事件  

declare @on bit  

set @on = 1  

 

 

--trace_event_id=13  SQL:BatchStarting   trace_event_id=22 ErrorLog

exec sp_trace_setevent @TraceID, 13, 1,  @on    

exec sp_trace_setevent @TraceID, 13, 3,  @on  

exec sp_trace_setevent @TraceID, 13, 6,  @on  

exec sp_trace_setevent @TraceID, 13, 7,  @on  

exec sp_trace_setevent @TraceID, 13, 8,  @on  

exec sp_trace_setevent @TraceID, 13, 11, @on  

exec sp_trace_setevent @TraceID, 13, 12, @on 

exec sp_trace_setevent @TraceID, 13, 14, @on 

exec sp_trace_setevent @TraceID, 13, 15, @on 

exec sp_trace_setevent @TraceID, 13, 35, @on  

exec sp_trace_setevent @TraceID, 13, 63, @on  

 

exec sp_trace_setevent @TraceID, 22, 1,  @on    

exec sp_trace_setevent @TraceID, 22, 3,  @on  

exec sp_trace_setevent @TraceID, 22, 6,  @on  

exec sp_trace_setevent @TraceID, 22, 7,  @on  

exec sp_trace_setevent @TraceID, 22, 8,  @on  

exec sp_trace_setevent @TraceID, 22, 12, @on 

exec sp_trace_setevent @TraceID, 22, 11, @on  

exec sp_trace_setevent @TraceID, 22, 14, @on 

exec sp_trace_setevent @TraceID, 22, 14, @on 

exec sp_trace_setevent @TraceID, 22, 35, @on  

exec sp_trace_setevent @TraceID, 22, 63, @on  

-- 启动跟踪  

exec sp_trace_setstatus @TraceID, 1  

 

-- 记录下跟踪ID,以备后面使用  

select TraceID = @TraceID  

goto finish  

 

error:   

select ErrorCode=@rc  

 

finish:   

GO  

 

上面SQL会生成一个服务器端跟踪事件,并返回对应的id,如下查看所示:

注意:上面捕获SQL:BatchStarting事件(trace_event_id=13),是因为捕获ErrorLog(trace_event_id=22)等事件时,都

无法捕获到对应的SQL(对应的trace column没有捕获SQL语句,暂时还没有找到一个好的解决方法)。这里也有个弊端,就是会捕获大量无关的SQL语句。

测试过后,你可以使用SQL Profile工具打开D:\SQLScript\trace_error_8623.trc找到错误信息,对应的SQL语句(在这个时间点附近的SQL语句,一般为是错误信息后面的第一个SQL语句,需要做判断),如下截图所示:

也可以使用脚本查询,如下所示,也是需要自己判断定位SQL语句,一般都是“8623 The query processor ran out of internal resources and could not produce a query plan”出现后紧接着的SQL。

SELECT StartTime,EndTime,

    TextData, ApplicationName,SPID,Duration,LoginName

FROM ::fn_trace_gettable(N'D:\SQLScript\trace_error_8623.trc',DEFAULT)

WHERE spid=64

ORDER BY StartTime

参考资料:

https://www.mssqltips.com/sqlservertip/5279/sql-server-error-query-processor-ran-out-of-internal-resources-and-could-not-produce-a-query-plan/

https://www.mssqltips.com/sqlservertip/1035/sql-server-performance-statistics-using-a-server-side-trace/

SQL Server捕获发生The query processor ran out of internal resources and could not produce a query plan...错误的SQL语句的更多相关文章

  1. 捕获和记录SQL Server中发生的死锁

    经带在论坛上看到有人在问怎么捕获和记录死锁信息,在这里,我将自己的一些心得贡献出来,与大家分享,也请各位指正. 我们知道,可以使用SQL Server自带的Profiler工具来跟踪死锁信息.但这种方 ...

  2. (4.7)怎么捕获和记录SQL Server中发生的死锁?

    转自:https://blog.csdn.net/c_enhui/article/details/19498327 怎么捕获和记录SQL Server中发生的死锁? 关键词:死锁记录,死锁捕获 sql ...

  3. 怎么捕获和记录SQL Server中发生的死锁

    我们知道,可以使用SQL Server自带的Profiler工具来跟踪死锁信息.但这种方式有一个很大的敝端,就是消耗很大.据国外某大神测试,profiler甚至可以占到服 务器总带宽的35%,所以,在 ...

  4. SQL SERVER数据库备份时出现“操作系统错误5(拒绝访问)。BACKUP DATABASE 正在异常终止。”错误的解决办法

    一般备份文件选择的目录为磁盘根目录或备份所选分区未授予sqlserver用户读写权限时会出现此错误. 解决办法就是给sqlserver用户授予权限: 选择要备份的文件夹 ,右键-->属性--&g ...

  5. SQL Server 之 在与SQLServer建立连接时出现与网络相关的或特定于实例的错误

    背景:在用数据库时,打开SQL Server 2008 R2 的 SQL Server Management Studio,输入sa的密码发现,无法登陆数据库,提示信息如上: 解决方案: 1.打开Sq ...

  6. 解决SQL SERVER数据库备份时出现“操作系统错误5(拒绝访问)。BACKUP DATABASE 正在异常终止。”错误的解决办法

    SQL SERVER数据库进行备份时出现“操作系统错误5(拒绝访问).BACKUP DATABASE 正在异常终止.”错误.我们应该如何解决这个问题?小编今天为大家推荐一个解决办法. 一般备份文件选择 ...

  7. sql server 2005/2008R2 报“红叉”错,即“不允许所请求的注册表访问权”的错误

    一.使用报错展示:           1.红叉错: 2.报错文字信息: 解决办法:可以鼠标右键,以管理员的身份运行即可,但这治标不治本,按如下方法可以彻底解决:把“以管理员身份运行此程序”勾上,即可

  8. sql server报【从varchar数据类型到datetime数据类型的转换产生一个超出范围的值】错误的解决办法

    产生这个错误的原因是在使用convert函数将给定的日期字符串转换为日期类型的时候,因为datetime这个数据类型有时间数值的范围限定,当超出时间范围时就抛出这个错误. 如果类型是[datetime ...

  9. Microsoft SQL Server Version List [sqlserver 7.0-------sql server 2016]

    http://sqlserverbuilds.blogspot.jp/   What version of SQL Server do I have? This unofficial build ch ...

随机推荐

  1. [Swift]LeetCode766. 托普利茨矩阵 | Toeplitz Matrix

    A matrix is Toeplitz if every diagonal from top-left to bottom-right has the same element. Now given ...

  2. mybatis-generator XML Parser Error on line 38: 必须为元素类型 "table" 声明属性 "enableInsertByPrimaryKey"。

    1. 解决方法 在 table 元素中删除属性 enableInsertByPrimaryKey 即可.就是这么神奇... 2. 情景重现 使用 mybatis-generator 插件生成代码时报错 ...

  3. Java高级特性--自定义一个StringBuilder的类

    案例讲解--自定义一个StringBuilder的类 一:案例设计介绍 自义一个M定yStringBuilder来实现StringBuilder的功能 二:案例设计 实现append()方法追加字符串 ...

  4. 机器学习入门18 - 生产机器学习系统(Production ML Systems)

    除了实现机器学习算法之外,机器学习还包含许多其他内容.生产环境机器学习系统包含大量组件.无需自行构建所有内容,而是应该尽可能重复使用常规机器学习系统组件.通过了解机器学习系统的一些范例及其要求,可以明 ...

  5. 目标文件去除header一行开头的#号

    请按照如下步骤进行配置: --> 打开session的Config Object选项卡,并编辑Custom Properties选项 -->  编辑Custom Properties项目 ...

  6. 面试中程序员常见的Redis"刁难"问题,值得一读!

    导读 在程序员面试过程中Redis相关的知识是常被问到的话题.作为一名在互联网技术行业打击过成百上千名的资深技术面试官,总结了面试过程中经常问到的问题.十分值得一读. Redis有哪些数据结构? 字符 ...

  7. Spring中bean实例化的三种方式

    之前我已经有好几篇博客介绍Spring框架了,不过当时我们都是使用注解来完成注入的,具体小伙伴可以参考这几篇博客(Spring&SpringMVC框架案例).那么今天我想来说说如何通过xml配 ...

  8. HUSTOJ:5500 && 洛谷:P1412:经营与开发

    题目描述 4X概念体系,是指在PC战略游戏中一种相当普及和成熟的系统概念,得名自4个同样以“EX”为开头的英语单词.eXplore(探索)eXpand(拓张与发展)eXploit(经营与开发)eXte ...

  9. Classifying with k-Nearest Neighbors(k近邻)

    终于要开始写自己的第一篇博客啦,真有点小激动(手足无措 =.=!).因为最近正在琢磨机器学习,第一篇博客就从学的第一个算法开始:k-nearest neighbors algorithm即k近邻算法. ...

  10. 【Java基础】【09面向对象_多态&抽象类&接口】

    09.01_面向对象(多态的概述及其代码体现) A:多态(polymorphic)概述 事物存在的多种形态 B:多态前提 a:要有继承关系. b:要有方法重写. c:要有父类引用指向子类对象. C:案 ...