暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL Server 数据库邮件超时语句 sp_readrequest

SQLServer 2021-10-08
1231


当数据库使用邮件时,使用 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


              文章转载自SQLServer,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论