SQL Server 2008 R2 ejecutar un procedimiento almacenado sp_MailItemResultSets causa mucha espera PREEMPTIVE_OS_WAITFORSINGLEOBJEC


 

Encontrado una base de datos (SQL Server 2008 R2) eventos de espera de repente aumento Biao, análisis de exploración encontró que el procedimiento almacenado se ejecuta la base de datos sp_MailItemResultSets de herramientas de monitoreo DPA, causando espera muy grave (alta Espere), y el principal de espera para los eventos a PREEMPTIVE_OS_WAITFORSINGLEOBJEC . Como se muestra en la pantalla de abajo:

 

clip_image001

 

consulta SQL se ejecuta, la sesión de detección está ejecutando el siguiente código SQL (procedimientos almacenados sp_MailItemResultSets en una instrucción SQL), esperando que algo ASYNC_NETWORK_IO.  

 

 
USO msdb;
Vamos
SELECCIONE 
      mi.mailitem_id,
      mi.profile_id,
      ( SELECT nombre DE msdb.dbo.sysmail_profile p DONDE p.profile_id = mi.profile_id) como  'nombre_perfil' ,
      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) como retry_attempt,
      ISNULL (mi.from_address, '' ) como from_address,
      ISNULL (mi.reply_to, '' )      como reply_to
   DE sysmail_mailitems como mi
      LEFT  JOIN sysmail_send_retries como sr
         EN sr.mailitem_id = mi.mailitem_id
   DONDE mi.mailitem_id = @mailitem_id

 

 

 

Sobre ASYNC_NETWORK_IO y PREEMPTIVE_OS_WAITFORSINGLEOBJEC relación es la siguiente:

 

Este evento indica que un hilo está esperando para sincronizar datos en un objeto al proceso de cliente externo, por lo que hay una espera de este tipo. Y por lo general esperan y eventos ASYNC_NETWORK_IO ocurren simultáneamente. Según mi observación, consultas SQL en ejecución, a la espera para que el evento " ASYNC_NETWORK_IO " en lugar de " PREEMPTIVE_OS_WAITFORSINGLEOBJEC "

 

 

A la espera de más detalles sobre este evento, consulte el enlace específico " PREEMPTIVE_OS_WAITFORSINGLEOBJECT ", la versión actual de la base de datos es SQL Server 2008R2

 

Descripción:

 

Este tipo de espera es cuando un hilo está llamando a la de Windows WaitForSingleObject función para la sincronización con un proceso de cliente externo que se está comunicando usando ese objeto.

 

Otra información:

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.

 

 

 

确实是一个非常奇怪的现象,然后我又去检查系统的应用日志,结果发现大量的错误:


clip_image002

 

错误信息比较奇怪,让人摸不着头脑,也没有看到有相关资料介绍,主要有下面两种错误:

 

1Database 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语句的确非常慢,从执行计划来看,没有什么异常情况,而且这个也是系统数据库,不应该存在一些索引问题。

 

 

clip_image003

 

但是检查dbo.sysmail_mailitems表,发现此表记录数为2722,但是表的大小接近8G了。非常不正常。对比了其它几个数据库服务器,发现这个表非常小。检查邮件记录里面是否有大量附件。也没有发现有大量附件。


处理问题的时候,没去定位是那条或那些记录占用了大量空间。急着解决问题,放弃分析这些情况了。可惜了!

 

clip_image004

 

clip_image005

 

 

官方也没有相关资料,只能猜测是因为dbo.sysmail_mailitems的大小引起了性能问题,然后我尝试用下面SQL清理这个表的记录

 

/******************************************************************************************************
    Script Function        :    以下示例删除数据库邮件日志中所有失败的电子邮件
*******************************************************************************************************/
 
 
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp   
    @sent_status = 'failed'
GO 
 
/******************************************************************************************************
    Función de script: El ejemplo siguiente elimina todos los sistemas de base de datos de mensajes de correo electrónico
************************************************** ************************************************** *** /
DECLARE @GETDATE de fecha y hora  
SET @GETDATE = GETDATE ();  
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp @sent_before = @GETDATE;  
VAMOS  
 

 

Por último, después de la limpieza de la verificación, se encontró que el procedimiento almacenado es de hecho muy rápido, la base de datos de eventos de espera que directamente desaparecieron. registro de la aplicación del sistema de correo de PID de error desapareció. Las observaciones de seguimiento, esta tabla se ha convertido en muy pequeña, y no hay ninguna es tan grande antes.

 

 

clip_image006

 

 


Supongo que te gusta

Origin www.cnblogs.com/kerrycode/p/12563252.html
Recomendado
Clasificación