查找导致等待的查询

Kyl*_*ndt 35 sql-server-2008 waits

给定某种等待,您如何在生产 SQL 2008 R2 服务器上安全地找到导致这些等待的查询?

在这种特殊情况下,我想知道async_network_io.

Bre*_*zar 33

我最喜欢的检查这些的方法是使用 Adam Machanic 出色的 sp_WhoIsActive 存储过程。这是有关如何使用它的视频以及下载代码的链接:

http://www.brentozar.com/archive/2010/09/sql-server-dba-scripts-how-to-find-slow-sql-server-queries/

问题是您必须定期运行它以检查结果。如果您希望定期收集这些数据,请查看 Kendra Little 的关于将 sp_WhoIsActive 结果捕获到表的教程:

http://www.littlekendra.com/2011/02/01/whoisactive/

最后,如果您希望在查询等待 async_network_io 时触发某些内容,您可以使用名为 Extended Events 的新工具。这就像 SQL Server 引擎中的调试点,您可以在其中创造奇迹。坦白说,现在在 2008 年用起来有点痛苦。


Eri*_*elp 14

'async_wait_io' 不是等待类型。可能的 ASYNC% 等待类型有:

  • ASYNC_IO_COMPLETION
  • ASYNC_NETWORK_IO
  • ASYNC_DISKPOOL_LOCK

等待类型的一些好的链接:

我去查询查找当前等待:

SELECT  req.session_id
       ,blocking_session_id
       ,ses.host_name
       ,DB_NAME(req.database_id) AS DB_NAME
       ,ses.login_name
       ,req.status
       ,req.command
       ,req.start_time
       ,req.cpu_time
       ,req.total_elapsed_time / 1000.0 AS total_elapsed_time
       ,req.command
       ,req.wait_type
       ,sqltext.text
FROM    sys.dm_exec_requests req
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS sqltext
JOIN    sys.dm_exec_sessions ses
        ON ses.session_id = req.session_id
WHERE req.wait_type IS NOT NULL
--WHERE req.wait_type = '?'
Run Code Online (Sandbox Code Playgroud)