查找长期运行存储过程 SQL Server 的原因

pex*_*xxy 4 sql-server profiler sql-server-2008-r2

我有一个存储过程,它每 2.5 秒被一个程序 24-7 调用一次。此过程通常在 10 毫秒内运行。一天几次(3 -5 次)运行大约需要 42953 毫秒(总是在 42950 和 42959 毫秒之间)。

我如何找到或描述为什么需要这么长时间的原因?

更新: Sql 服务器版本 2008 R2

程序:

select 
    [view_EventsToRaise].EventId,
    [view_EventsToRaise].EventStatus,
    [view_EventsToRaise].Tag,
    [view_EventsToRaise].SessieGebruikerId,
    Postbus.Persoon_Id_afz      as PersoonIdAfz,
    Postbus.Persoon_Id_adr      as PersoonIdAdr,
    Postbus.Persoon_Id_derde    as PersoonIdDerde,
    Postbus.Locatie_Id          as LocatieId,
    Postbus.Artikel_Id          as ArtikelId,
    Postbus.Onderwerp_Id        as OnderwerpId,
    Postbus.Bedrijf_Id_afz      as BedrijfIdAfz,
    Postbus.Bedrijf_Id_adr      as BedrijfIdAdr,
    Postbus.Bedrijf_Id_derde    as BedrijfIdDerde,
    Postbus.Document_Id         as DocumentId,      
    Postbus.Document            as Document,        
    DataKenmerk.Code            as PostbusDataCode,
    PostbusData.Inhoud          as PostbusDataInhoud,
    SimObj.Id                   as SimObjId,
    Eventsoort.Code             as Eventsoort
from 
    [view_EventsToRaise]
    left outer join Postbus
        left outer join PostbusData
            inner join DataKenmerk
            on PostbusData.DataKenmerk_id = DataKenmerk.id
        on PostbusData.Postbus_Id = Postbus.id
    on Postbus.Id = [view_EventsToRaise].PostbusId
    left outer join SimObjEvent                         
        inner join eventsoort
        on eventsoort.id = SimObjEvent.eventsoort_id
    on [view_EventsToRaise].SimObjEventId = SimObjEvent.Id
    left outer join SimObj
    on SimObj.Id = SimObjEvent.SimObj_Id
order by
    [view_EventsToRaise].Tijd,
    [view_EventsToRaise].EventId
Run Code Online (Sandbox Code Playgroud)

2014 年 9 月 29 日更新: 当上述情况发生时,查看分析器,以下引起了我的注意:注册 RPC:Completed 事件时,starttime 是日志时刻的当前系统时间,但 endtime是未来的值(当前系统时间加上持续时间,未来大约 43 秒)。

endtime 列的值是如何确定的?这是预测吗?

Rem*_*anu 5

这可能是由阻塞进程引起的。每天 3-5 次,这被一些更新或其他需要大约 40 秒的写入阻止。您的 SELECT 会阻塞,直到它可以继续。如果情况确实如此,则可以使用Blocked Process Report Event来识别问题。您必须启用此事件并将阈值设置为 ~35 秒。请参阅阻止进程阈值服务器配置选项。显然,该事件也可能因其他查询而触发,但有争议的这些问题也需要解决。

阻塞的一个简单解决方法是使用行版本隔离级别。阅读了解基于行版本控制的隔离级别

否则,您需要将此作为性能问题进行调查。阅读如何分析 SQL Server 性能