SQL Server 2008 R2执行存储过程sp_MailItemResultSets引起大量PREEMPTIVE_OS_WAITFORSINGLEOBJEC等待
从监控工具DPA中发现一个数据库(SQL Server 2008 R2)的等待事件突然彪增,下钻分析发现数据库执行存储过程sp_MailItemResultSets时,引起了非常严重的等待(High Wait),而主要的等待事件为PREEMPTIVE_OS_WAITFORSINGLEOBJEC。 如下截图所示:

查询正在执行的SQL,发现会话正在执行下面SQL(存储过程sp_MailItemResultSets中的一个SQL语句),等待事件为ASYNC_NETWORK_IO。
USE msdb;
go
SELECT
mi.mailitem_id,
mi.profile_id,
(SELECT name FROM msdb.dbo.sysmail_profile p WHERE p.profile_id = mi.profile_id) as 'profile_name',
mi.recipients,
mi.copy_recipients,
mi.blind_copy_recipients,
mi.subject,
mi.body,
mi.body_format,
mi.importance,
mi.sensitivity,
ISNULL(sr.send_attempts, 0) as retry_attempt,
ISNULL(mi.from_address, '') as from_address,
ISNULL(mi.reply_to, '') as reply_to
FROM sysmail_mailitems as mi
LEFT JOIN sysmail_send_retries as sr
ON sr.mailitem_id = mi.mailitem_id
WHERE mi.mailitem_id = @mailitem_id
关于ASYNC_NETWORK_IO与PREEMPTIVE_OS_WAITFORSINGLEOBJEC的关系如下:
这个等待事件表示一个线程正在向外部客户端进程同步某个对象的数据,因此出现此种等待。而且通常和ASYNC_NETWORK_IO等待事件同时出现。根据我的观察,查询正在执行的SQL,等待事件为”ASYNC_NETWORK_IO“而并非”PREEMPTIVE_OS_WAITFORSINGLEOBJEC“
关于这个等待事件的更多详细信息,具体见链接“PREEMPTIVE_OS_WAITFORSINGLEOBJECT”,当前数据库版本为SQL Server 2008R2
Description:
This wait type is when a thread is calling the Windows WaitForSingleObject function for synchronization with an external client process that is communicating using that object.
Other information:
This wait type is commonly seen in conjunction(同时出现) with ASYNC_NETWORK_IO, depending on the network transport used to communicate with the client, so to troubleshoot, follow the same steps as for ASYNC_NETWORK_IO.
Note that when a thread calls out to Windows, the thread changes from non-preemptive (SQL Server controls the thread) to preemptive (Windows controls the thread) mode. The thread’s state will be listed as RUNNING, as SQL Server doesn’t know what Windows is doing with the thread.
确实是一个非常奇怪的现象,然后我又去检查系统的应用日志,结果发现大量的错误:

错误信息比较奇怪,让人摸不着头脑,也没有看到有相关资料介绍,主要有下面两种错误:
1:Database Engine Instance=xxxxx;Mail PID=7248;Error Message:The connection is not open.
2: Database Engine Instance=xxxxx;Mail PID=7248;Error Message:Exception of type 'System.OutOfMemoryException' was thrown.
验证SQL语句性能, 发现SQL语句的确非常慢,从执行计划来看,没有什么异常情况,而且这个也是系统数据库,不应该存在一些索引问题。

但是检查dbo.sysmail_mailitems表,发现此表记录数为2722,但是表的大小接近8G了。非常不正常。对比了其它几个数据库服务器,发现这个表非常小。检查邮件记录里面是否有大量附件。也没有发现有大量附件。
处理问题的时候,没去定位是那条或那些记录占用了大量空间。急着解决问题,放弃分析这些情况了。可惜了!


官方也没有相关资料,只能猜测是因为dbo.sysmail_mailitems的大小引起了性能问题,然后我尝试用下面SQL清理这个表的记录
/******************************************************************************************************
Script Function : 以下示例删除数据库邮件日志中所有失败的电子邮件
*******************************************************************************************************/
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
@sent_status = 'failed' ;
GO
/******************************************************************************************************
Script Function : 以下示例删除数据库邮件系统中的所有电子邮件
*******************************************************************************************************/
DECLARE @GETDATE datetime
SET @GETDATE = GETDATE();
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp @sent_before = @GETDATE;
GO
最后清理过后验证发现,这个存储过程的确非常快了,数据库中该等待事件直接消失了。系统应用日志中关于Mail PID的错误也消失了。后续观察发现,这个表也变得特别小了,完全没有之前那么大了。

SQL Server 2008 R2执行存储过程sp_MailItemResultSets引起大量PREEMPTIVE_OS_WAITFORSINGLEOBJEC等待的更多相关文章
- SQL Server 2008 R2——T-SQL 存储过程 返回表
==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...
- SQL Server 2008 r2 中 SQL语句提示“对象名无效”,但可执行
[问题描述]在使用 SQL Server 2008 r2 时,有时在完成SQL书写后,会提示“对象名无效”,而SQL语句可正常执行. [原因]缓存相关. [解决方法]ctrl+shift+R 刷新下, ...
- SQL Server 2008 R2——学习/练习/错误/总结/搜集
==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...
- SQL Server 2008 R2 跟踪标志
原文:SQL Server 2008 R2 跟踪标志 跟踪标志用于临时设置特定服务器的特征或关闭特定行为.例如,如果启动 SQL Server 的一个实例时设置了跟踪标志 3205,将禁用磁带机的硬件 ...
- SQL Server 2008 R2 性能计数器详细列表(三)
原文:SQL Server 2008 R2 性能计数器详细列表(三) SQL Server,Deprecated Features 对象: 监视指定为不推荐使用的功能: SQL Server Depr ...
- SQL Server 2008 R2 性能计数器详细列表(四)
原文:SQL Server 2008 R2 性能计数器详细列表(四) SQL Server Latches 对象: 监视称为闩锁的内部 SQL Server 资源锁.通过监视闩锁来确定用户活动和资源使 ...
- 利用SQL Server 2008 R2创建自动备份计划
本文主要利用SQL Server 2008 R2自带的"维护计划"创建一个自动备份数据的任务. 首先,启动 Sql Management studio,确保"SQL Se ...
- SQL Server 2000向SQL Server 2008 R2推送数据
[文章摘要]最近做的一个项目要获取存在于其他服务器的一些数据,为了安全起见,采用由其他“服务器”向我们服务器推送的方式实现.我们服务器使用的是SQL Server 2008 R2,其他“服务器”使用的 ...
- SQL Server 2008 R2 升级到 Service Pack 3后Report Builder启动不了
一同事将测试服务器从SQL Server 2008 R2 SP2升级到了SQL Server 2008 R2 SP3后发现Report Service的报表编辑时启动不了Report Builder, ...
随机推荐
- springboot2整合activiti7具体步骤
写在前面 需要提前了解的内容有 springboot.springSecurity.activiti基本使用 关于activiti Activiti项目是一项新的基于Apache许可的开源BPM平台, ...
- 2019年达内云PS淘宝美工平面UI/UX/UE/UED影视后期交互设计师视频
2019年达内云PS淘宝美工平面UI/UX/UE/UED影视后期交互设计师视频 百度网盘链接一 百度网盘链接二
- RabbitMQ高级之如何保证消息可靠性?
人生终将是场单人旅途,孤独之前是迷茫,孤独过后是成长. 楔子 本篇是消息队列RabbitMQ的第四弹. RabbitMQ我已经写了三篇了,基础的收发消息和基础的概念我都已经写了,学任何东西都是这样,先 ...
- 区块链入门到实战(29)之Solidity – 环境搭建
在线开发环境Remix(推荐) 学习Solidity推荐使用在线开发环境Remix,本教程的例子将使用Remix开发运行. 安装本地编译器 安装 nodejs / npm node官方网站下载node ...
- superslide滚动插件使用记录-产品滚动-图片滚动
在用wordpress制作一个企业网站时,用到了这个superslide的滚动插件,用于案例.证书等滚动效果.该插件网站在这里:http://www.superslide2.com/ 我所使用的wor ...
- soso官方:基于相关排序的判断
http://www.wocaoseo.com/thread-186-1-1.html 议程 概述 检索词 用户的信息需求 网页的自有信息 网页的附属信息 相关性的计算框架 概述 相关性的表象 检索词 ...
- Mac本地生成SSHKey的方法
1. 查看秘钥是否存在 打开终端查看是否已经存在SSH密钥:cd ~/.ssh 如果没有密钥则不会有此文件夹,有则备份删除, 也可以直接删除, 2.生成新的秘钥, 命令如下 $ssh-keygen ...
- 【平台开发】— 8.前端-从[项目管理]来看vue
现在要来实现[项目管理]这个功能了. 想象一下页面,元素大概就是:列表页.查询框.新增按钮.编辑.mock入口按钮. 那先来实现列表和新建,也顺带着整理一下用到的vue相关指令知识. 一.后端 后端就 ...
- [01] C#网络编程的最佳实践
网络框架的选择 C++语言里面有asio和libuv等网络库, 可以方便的进行各种高效编程. 但是C#里面, 情况不太一样, C#自带的网络API有多种. 例如: Socket TcpStream(同 ...
- Linux下 ls 命令的高级用法8例
Linux下 ls 命令的高级用法8例 在Linux下,ls这个命令大家肯定太熟悉了,良许相信只要是Linux工程师,每天都会离不开这个命令,而且一天会使用个几百次.但是,除了 ls -l 以外,你还 ...