Chr*_*145 3 sql-server ssms t-sql
我使用以下语句来监视 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
Run Code Online (Sandbox Code Playgroud)
此处未显示某些活动:创建索引、更改表...
如何监控 SQL Server 中的所有活动?(Activity Monitor/Profiler 没有选项 - 只有普通的 T-SQL,没有系统管理员 - 只能查看服务器状态)
以下是一些流行的方法:
sp_WhoIsActive
几乎是 Adam Machanic 的行业标准工具。从WhoIsActive.com下载它,将它安装在 master 数据库中(这样你就可以从任何地方调用它),然后在你想知道现在正在运行什么时运行它。这是它的样子:
查询从最长运行到最短排序。您可以单击 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”这一行来查看,呃,详情:
Backup of StackOverflow database (93GB) is 0.896017% complete,
has been running since Sep 22 2017 5:19AM.
Login: Brent
Over the last 60 days, the full backup usually takes 4 minutes.
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您可以将此工具提供给像您的帮助台这样经验不足的人,并让他们进行一些初步分类。
并非所有行动都有执行计划;将交叉应用更改为外部应用将允许您查看这些其他项目。
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
INNER 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
OUTER APPLY sys.dm_exec_sql_text(der.sql_handle) dest
OUTER APPLY sys.dm_exec_query_plan(der.plan_handle) deqp
WHERE des.session_id <> @@SPID and des.is_user_process = 1
ORDER BY 3
Run Code Online (Sandbox Code Playgroud)
或者,我建议查看Adam Machanic 的sp_whoisactive,这是一个存储过程,它提供了一堆信息,包括执行长度、计划、当前等待的任务(什么和持续时间)
归档时间: |
|
查看次数: |
1827 次 |
最近记录: |