我使用下面的语句来监视 SQL Server 中的活动(这不是书)
SELECT
des.session_id ,
des.status ,
des.login_name ,
des.[HOST_NAME] ,
der.blocking_session_id ,
DB_NAME(der.database_id) AS database_name ,
der.command ,
des.cpu_time ,
des.reads ,
des.writes ,
dec.last_write ,
des.[program_name] ,
der.wait_type ,
der.wait_time ,
der.last_wait_type ,
der.wait_resource ,
CASE des.transaction_isolation_level
WHEN 0 THEN 'Unspecified'
WHEN 1 THEN 'ReadUncommitted'
WHEN 2 THEN 'ReadCommitted'
WHEN 3 THEN 'Repeatable'
WHEN 4 THEN 'Serializable'
WHEN 5 THEN 'Snapshot'
END AS transaction_isolation_level ,
OBJECT_NAME(dest.objectid, der.database_id) AS OBJECT_NAME ,
SUBSTRING(dest.text, der.statement_start_offset / 2,
( CASE WHEN der.statement_end_offset = -1
THEN DATALENGTH(dest.text) ELSE der.statement_end_offset
END - der.statement_start_offset ) / 2 + 1)
AS [executing statement] ,
deqp.query_plan
FROM sys.dm_exec_sessions des
LEFT JOIN sys.dm_exec_requests der
ON des.session_id = der.session_id
LEFT JOIN sys.dm_exec_connections dec
ON des.session_id = dec.session_id
CROSS APPLY sys.dm_exec_sql_text(der.sql_handle) dest
CROSS APPLY sys.dm_exec_query_plan(der.plan_handle) deqp
WHERE des.session_id <> @@SPID
ORDER BY 3
此处未显示一些活动:创建索引、更改表...
如何监控 SQL Server 中的所有活动?(Activity Monitor/Profiler 是没有选项 - 只有普通的 T-SQL,没有系统管理员 - 只查看服务器状态)
以下是一些流行的方法:
sp_WhoIsActive
几乎是 Adam Machanic 的行业标准工具。从WhoIsActive.com下载它,将其安装在主数据库中(这样您就可以从任何地方调用它),然后在您想知道现在正在运行什么时运行它。这是它的样子:
查询从运行时间最长到最短排序。您可以单击 sql_text 或 query_plan 来查看这些内容(请注意,后者仅在您使用 @get_plans = 1 运行时才包含在内)。它还会向您显示谁在阻止谁、查询来自哪台机器等等。
它是免费的,并且适用于所有当前支持的 SQL Server 版本。它被全世界数以千计的数据库专业人员使用。我自己在生产中使用过它,从来没有遇到过问题。
sp_BlitzWho
Erik Darling 之所以写这篇文章,是因为他真的很喜欢查询调优,而且他希望看到比 sp_WhoIsActive 提供的更多的细节。从 SQL Server 2012 开始,Microsoft 已经添加了大量很酷的 DMV 信息,例如内存授权利用率,而 Adam 并没有更新 sp_WhoIsActive 来利用它。您可以从公共 Github存储库或我们的 First Responder Kit获取 sp_BlitzWho 。这是它的样子:
起初,它基本上看起来像 sp_WhoIsActive,但下面是它显示的一些附加列:
数据可能非常庞大 - 有很多 - 所以从 Adam 的 sp_WhoIsActive 开始,如果需要进行实时查询调优,只有升级到 sp_BlitzWho。
sp_BlitzFirst
我写了 sp_BlitzFirst 来更深入地问,“为什么服务器现在很慢?” 它拍摄一堆动态管理对象的快照,等待 5 秒,拍摄另一个快照,然后比较两者之间的差异,以了解现在发生了什么。您可以从我们的网站或公共 Github 存储库获取它。这是它的样子:
它为您提供服务器问题的优先列表,以及复制/粘贴到浏览器中的 URL,以了解有关每个问题的更多信息。例如,在上面的屏幕截图中,服务器变慢了,因为一些肉丸正在运行备份。你可以点击“ClickToSeeDetails”这一行,看看,呃,细节:
这样,您可以将此工具提供给像您的服务台这样经验不足的人,并让他们进行一些初步分类。
并非所有行动都有执行计划;将 cross apply 更改为 external apply 将允许您查看这些其他项目。
或者,我建议查看 Adam Machanic 的sp_whoisactive,它是一个存储过程,提供大量信息,包括执行长度、计划、当前等待的任务(内容和持续时间)