9

我们的 SQL Server 2005 群集上出现零星的随机查询超时。我拥有一些使用它的应用程序,所以我正在帮助调查。在常规的 ol' Perfmon 中查看 % CPU 时间时,您当然可以看到它的变化。但是,SQL 活动监视器只给出一个进程使用的累积 CPU 和 IO 时间,而不是它当时正在使用的时间,或者在特定时间范围内使用的时间。也许我可以使用分析器并运行跟踪,但是这个集群被大量使用,我担心我会在大海捞针。我在吠叫错误的树吗?

有没有人有一些好的方法可以在这种环境中追踪昂贵的查询/流程?

4

7 回答 7

12

这将为您提供平均 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
于 2008-08-18T15:09:27.683 回答
4

我发现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 利用率等。您可以不时刷新它。当您看到峰值时,只需单击图表中的条形即可获取其背后的详细数据。

于 2008-08-18T16:34:43.987 回答
3

我们使用 Quest 的Spotlight产品。显然这是对时间和金钱的投资,所以它可能在短期内对您没有帮助,但如果您有一个大型 SQL 环境,它非常有用。

于 2008-08-18T15:01:41.693 回答
3

正如 Yaakov 所说,在典型负载下运行分析器几分钟并将结果保存到一个表中,这将允许您对结果运行查询,从而更容易发现任何占用资源的查询。

于 2008-08-18T15:13:47.503 回答
2

Profiler 可能看起来像是“大海捞针”的方法,但它可能会发现一些有用的东西。尝试在数据库处于典型负载下时运行几分钟,看看是否有任何查询突出显示占用太多时间或以某种方式占用资源。虽然这样的情况可能指向一些一般性问题,但它也可能与一个或两个站点的某些特定问题有关,在某些情况下,这些问题足以导致整体性能非常差。

于 2008-08-18T14:47:52.907 回答
2

运行 Profiler 并过滤读取次数超过一定次数的查询。对于我处理的应用程序,任何超过 5000 次读取的非报告查询都值得重新审视。你的应用可能有不同的阈值,但想法是一样的。

于 2008-08-18T15:24:17.123 回答
2

Erland Sommarskog 的这个实用程序非常有用。

这是您添加到数据库中的存储过程。每当您想查看哪些查询处于活动状态并获得锁、块等的良好图片时运行它。当事情看起来很糟糕时,我经常使用它。

于 2008-08-18T16:27:51.037 回答