捕获非常昂贵的查询

u23*_*534 6 sql-server-2008 sql-server sql-server-2012

我有一个 2008/2012 年的 Sql 服务器。一些用户运行非常昂贵的查询,例如在一个事务中更新 1G 行或交叉连接几个非常大的表,它会导致服务器时常无响应。

跟踪/触发服务器以在发生时保存正在运行的查询的好方法是什么?

小智 7

您可以使用以下查询通过 DMV 识别有问题的查询:

USE [master]
GO
SELECT  session_id,
blocking_session_id,
wait_time,
wait_type,
last_wait_type,
wait_resource,
transaction_isolati,
on_level,
lock_timeout
FROM sys.dm_exec_requests
WHERE blocking_session_id <> 0
GO
Run Code Online (Sandbox Code Playgroud)

如果您想收集历史数据或自动化该过程,您应该考虑 3rd 方解决方案。我正在使用ApexSQL Monitor,但市场上还有很多其他的。WindRaven 提到了一些,但也有 Idera Diagnostic、Nagios、SQL Sentry、Quest Spotlight。


Mar*_*son 6

我建议查看 Adam Machanic 的出色免费脚本“sp_WhoIsActive”:http ://whoisactive.com

我们每两分钟在一次工作中运行它。它收集十秒钟的数据并将其记录到表中。

使用此信息,您可以轻松查看以下内容: - 长时间运行的查询 - 阻塞 - 查询成本 - 等待信息

每当我们的服务器变慢时,我们都可以从我们的工作中提取最新数据(使用 SSRS 报告),看看发生了什么,以及似乎是什么导致了变慢。此脚本改变了我们对服务器问题进行故障排除的方式。