在生产 SQL 服务器上,我看到数据流量出现间歇性的巨大峰值。高达 200Mbit/s,这会导致 NETWORK IO 等待,从而导致查询超时。如何找出返回大结果集的查询?
Gai*_*ius 18
你可以从DMV找到这个:
SELECT session_id, num_writes, st.text AS statement_text
FROM sys.dm_exec_connections AS ec
CROSS APPLY sys.dm_exec_sql_text(ec.most_recent_sql_handle) AS st
ORDER BY num_writes DESC
Run Code Online (Sandbox Code Playgroud)
与跟踪不同,这在生产服务器上运行应该是完全安全的。
我将使用 SQL Profiler 跟踪生产数据,并收集读取和写入次数最多的代码/批次。过滤跟踪以仅获取高读/写的过程和批次。选择一个适合您的样本:假设读取或写入超过 100 万次。
我将这些调用的样本带到开发/测试机器,并在启用了“包含客户端统计信息”选项的情况下在 Management Studio 中运行它们(在菜单查询 - 包含客户端统计信息中)。然后您将有一个单独的窗口,其中包含客户端统计信息:从客户端发送的字节数,从服务器接收的字节数。
不要在没有过滤数据的情况下在生产数据库上启用跟踪!!!过滤最可能的(通过数据库、主机名、你相信的),然后才开始跟踪。不要忘记在 :-) 之后关闭 Profiler。
PS:我记得另一个不错的选择:沿着跟踪一段时间,您还应该使用 Perfmon 保存数据(仅选择 IO 参数)。Profiler 有一个很好的功能,可以将跟踪文件和性能数据文件一起导入。当您有最大的 IO 峰值时,您可以看到那里。
PS2:我同意盖乌斯的选择更优雅。但我把我笨重的答案留给后人!:-)
如果您还没有看过它,您可能想查看 Adam Machanic 的 sp_WhoIsActive。他最近发表了一系列博客文章,解释了 sp_WhoIsActive 中内置的不同功能,其中一个是 @delta_interval。
这不仅会向您显示总体上占用最多 CPU 或 I/O 的内容,还可以显示当前占用最多 CPU 或 I/O 的内容。
查看以下博客系列以获取有关此功能的完整说明:
http://whoisactive.com/docs/01_background/
以下博客文章解释了如何对 sp_WhoIsActive 的输出进行排序并选择要显示的列:
http://whoisactive.com/docs/24_output/
这是他设置的以下更新链接上的众多帖子之一。
截至本回答发布时,11.0 版已可用,因此如果您使用的是旧版本,则可能是时候升级了:D
| 归档时间: |
|
| 查看次数: |
14148 次 |
| 最近记录: |