我们的 SQL Server 2005 群集上出现零星的随机查询超时。我拥有一些使用它的应用程序,所以我正在帮助调查。在常规的 ol' Perfmon 中查看 % CPU 时间时,您当然可以看到它的变化。但是,SQL 活动监视器只给出一个进程使用的累积 CPU 和 IO 时间,而不是它当时正在使用的时间,或者在特定时间范围内使用的时间。也许我可以使用分析器并运行跟踪,但是这个集群被大量使用,我担心我会在大海捞针。我在吠叫错误的树吗?
有没有人有一些好的方法可以在这种环境中追踪昂贵的查询/流程?
我们的 SQL Server 2005 群集上出现零星的随机查询超时。我拥有一些使用它的应用程序,所以我正在帮助调查。在常规的 ol' Perfmon 中查看 % CPU 时间时,您当然可以看到它的变化。但是,SQL 活动监视器只给出一个进程使用的累积 CPU 和 IO 时间,而不是它当时正在使用的时间,或者在特定时间范围内使用的时间。也许我可以使用分析器并运行跟踪,但是这个集群被大量使用,我担心我会在大海捞针。我在吠叫错误的树吗?
有没有人有一些好的方法可以在这种环境中追踪昂贵的查询/流程?
这将为您提供平均 CPU 时间排名前 50 的语句,请在此处查看其他脚本:http ://www.microsoft.com/technet/scriptcenter/scripts/sql/sql2005/default.mspx?mfr=true
SELECT TOP 50
qs.total_worker_time/qs.execution_count as [Avg CPU Time],
SUBSTRING(qt.text,qs.statement_start_offset/2,
(case when qs.statement_end_offset = -1
then len(convert(nvarchar(max), qt.text)) * 2
else qs.statement_end_offset end -qs.statement_start_offset)/2)
as query_text,
qt.dbid, dbname=db_name(qt.dbid),
qt.objectid
FROM sys.dm_exec_query_stats qs
cross apply sys.dm_exec_sql_text(qs.sql_handle) as qt
ORDER BY
[Avg CPU Time] DESC
我发现Performance Dashboard Reports非常有帮助。它们是 Microsoft 提供的一组自定义 RS 报告。您只需在客户端 PC 上运行安装程序,然后在 SQL Server 实例上运行 setup.sql。
之后,右键单击 SSMS 中的数据库(无论是哪个),然后转到 Reports -> Custom Reports。导航并选择默认位于 \Program Files\Microsoft SQL Server\90\Tools\PerformanceDashboard 文件夹中的 performance_dashboard_main.rdl。您只需执行一次。第一次之后,它将显示在报告列表中。
主仪表板视图将显示一段时间内的 CPU 利用率等。您可以不时刷新它。当您看到峰值时,只需单击图表中的条形即可获取其背后的详细数据。
我们使用 Quest 的Spotlight产品。显然这是对时间和金钱的投资,所以它可能在短期内对您没有帮助,但如果您有一个大型 SQL 环境,它非常有用。
正如 Yaakov 所说,在典型负载下运行分析器几分钟并将结果保存到一个表中,这将允许您对结果运行查询,从而更容易发现任何占用资源的查询。
Profiler 可能看起来像是“大海捞针”的方法,但它可能会发现一些有用的东西。尝试在数据库处于典型负载下时运行几分钟,看看是否有任何查询突出显示占用太多时间或以某种方式占用资源。虽然这样的情况可能指向一些一般性问题,但它也可能与一个或两个站点的某些特定问题有关,在某些情况下,这些问题足以导致整体性能非常差。
运行 Profiler 并过滤读取次数超过一定次数的查询。对于我处理的应用程序,任何超过 5000 次读取的非报告查询都值得重新审视。你的应用可能有不同的阈值,但想法是一样的。
Erland Sommarskog 的这个实用程序非常有用。
这是您添加到数据库中的存储过程。每当您想查看哪些查询处于活动状态并获得锁、块等的良好图片时运行它。当事情看起来很糟糕时,我经常使用它。