有关SQL Server 2008 R2中长期运行的查询或死锁的通知?


15

我想知道是否可以通过死锁发送通知吗?如果是这样,将需要什么查询。我知道SQL Server可以处理死锁,我只想了解有关查询的信息。

我发现以下内容可确定长时间运行的查询:

SELECT 
    creation_time
    ,last_execution_time
    ,total_physical_reads
    ,total_logical_reads
    ,total_logical_writes
    , execution_count
    , total_worker_time
    , total_elapsed_time
    , total_elapsed_time / execution_count avg_elapsed_time
    ,SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
    ((CASE statement_end_offset
        WHEN -1 THEN DATALENGTH(st.text)
        ELSE qs.statement_end_offset END
    - qs.statement_start_offset)/2) + 1) AS statement_text
FROM sys.dm_exec_query_stats AS qs
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st  
where total_elapsed_time >= 300000000 --5 min
ORDER BY total_elapsed_time / execution_count DESC; 

我想知道上述方法是否正确,或者是否有更好的方法来确定是否有一个查询花费的时间超过特定间隔,例如所示的5分钟?

谢谢

Answers:


8

借助SQL 2008,您可以将新功能用于死锁和长时间运行的查询:扩展事件。扩展事件是低级对象,并且比其他方法(如概要分析/跟踪,警报等)消耗的资源少得多。

有关使用扩展事件的信息,deadlocks请查看SQL Server MVP Jonathan Kehayias的这篇文章

要使用扩展事件查找long running queries,请查看另一个SQL Server MVP Pinal Dave撰写的这篇详细文章


10

您可以使用SQL Agent为这两种配置警报。创建一个新的警报,然后选择类型“ SQL Server性能状况警报”

对于长时间运行的查询,请选择“ MSSQL $ InstanceName:Transactions”对象和“计数器:最长事务运行时间”。配置值和警报通知选项,一切顺利。

对于死锁,对象为“ MSSQL $ InstanceName:Locks”,而计数器为“死锁数/秒”

如果要对死锁通知进行更精细的控制,请查看以下内容:http : //www.sqlservercentral.com/articles/Administration/3243/


我尝试按照您的建议设置警报,但是只有在定义了步骤的情况下,作业才能运行。是否可以在不定义作业步骤的情况下设置警报?
Hasanain

4

如果您有SQL2008,我希望@StanleyJohns建议。扩展事件值得您作为诊断工具来熟悉,Jonathon的An XEvent a Day系列是一个很好的起点。

死锁的替代方法是启用跟踪标志1204和1222,它们将死锁信息转储到SQL错误日志中。同时启用两者,则可以两种不同的格式获取信息,从而可以更轻松地理解复杂的死锁链。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.