SQLServer 使用数据库邮件时常看到超时语句 sp_readrequest
发布时间:2020-12-12 13:45:43 所属栏目:MsSql教程 来源:网络整理
导读:当数据库使用邮件时,使用 trace 或 profiler 跟踪慢查询语句时,发现有一个语句出现频率较多: exec sp_readrequest @receive_timeout=600000 既然是慢查询,是否需要优化呢? 对这个存储工程 sp_readrequest , 网上资料太少。 查看存储过程定义: use msd
当数据库使用邮件时,使用 trace 或 profiler 跟踪慢查询语句时,发现有一个语句出现频率较多:
exec sp_readrequest @receive_timeout=600000 既然是慢查询,是否需要优化呢? 对这个存储工程 sp_readrequest , 网上资料太少。 查看存储过程定义:
use msdb go sp_helptext sp_readrequest go -- sp_readrequest : Reads a request from the the queue and returns its contents. CREATE PROCEDURE sp_readrequest @receive_timeout INT -- the max time this read will wait for new message AS BEGIN SET NOCOUNT ON --略………… 可以看到存储过程的功能说明:从消息队列中读取请求并返回内容 参数声明:此次读请求等待新消息的最大时间,这个时间可以从邮件参数中配置。
select * from msdb.dbo.sysmail_configuration 首选说该存储过程?sp_readrequest ?,该存储过程执行时根据上面给定的时间,不断地尝试接收消息,也就是存储过程在这段时间内是一直运行的。
WAITFOR(RECEIVE conversation_handle,service_contract_name,message_type_name,message_body FROM ExternalMailQueue INTO @msgs),TIMEOUT @rec_timeout 查看当前系统运行了什么语句,可以看到该存储过程正在运行中,处于挂起状态(suspended) 上面看到其等待类型为:BROKER_RECEIVE_WAITFOR
select * from sys .dm_os_wait_stats where wait_type='BROKER_RECEIVE_WAITFOR' 其实存储过程虽然占用着一个连接,但是并没有在运行操作,因此也不消耗IO、CPU等资源,不占用资源,不堵塞其他进程。虽然慢查询跟踪到了该语句,其实没必要优化,着只是一个邮件参数的设置,存储过程对其他没影响。 若更改时间,可在参数界面中更改,或者以下脚本更改,如:
--方法一: UPDATE msdb.dbo.sysmail_configuration SET paramvalue = 60 --60 Seconds WHERE paramname = 'DatabaseMailExeMinimumLifeTime' GO --方法二: EXECUTE msdb.dbo.sysmail_configure_sp 'DatabaseMailExeMinimumLifeTime','60' GO 参考: Database Mail SQL Server: Why a Session With sp_readrequest Takes so Long to Execute SQL Server: Sess?o executando há muito tempo com o comando sp_readrequest (DatabaseMail) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |