识别SQL Server性能问题

9
我们的SQL Server 2005集群出现了零散、随机的查询超时问题。我拥有几个使用它的应用程序,因此我正在协助调查。当在常规的Perfmon中观察% CPU时间时,您肯定会看到它达到了峰值。然而,SQL活动监视器只提供了一个进程使用的累计CPU和IO时间,而不是它正在使用的时间或特定时间段内的时间。也许我可以使用分析器并运行跟踪,但这个集群被广泛使用,我担心我会在大海捞针。我是否走错了路?
在这种环境中,有没有一些追踪昂贵查询/进程的好方法呢?
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

4
我发现 性能仪表板报告非常有用。这些都是由Microsoft提供的一组自定义RS报告。您只需在客户端PC上运行安装程序,然后在SQL Server实例上运行setup.sql即可。
之后,在SSMS中右键单击任意一个数据库(无论哪个),转到报告 -> 自定义报告。默认情况下,导航到并选择位于\Program Files\Microsoft SQL Server\90\Tools\PerformanceDashboard文件夹中的performance_dashboard_main.rdl文件。您只需要执行一次此操作。第一次之后,它将出现在报告列表中。
主要的仪表板视图将显示随时间变化的CPU利用率等信息。您可以偶尔刷新它。当您看到一个峰值时,只需单击图表中的条形以获取其背后的详细数据。

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

3
如Yaakov所说,运行一段时间的分析器以获取典型负载下的结果,并将其保存到一个表中,这将使您能够针对结果运行查询,从而更容易地发现任何占用资源的查询。

2

Profiler可能看起来是一种“大海捞针”的方法,但它可能会找出一些有用的东西。在数据库处于典型负载状态下运行它几分钟,并查看是否有查询需要花费太长时间或以某种方式独占资源。虽然这种情况可能指向一些通用问题,但也可能与某个或两个站点相关的特定问题有关,在某些情况下足以在整个系统中导致非常糟糕的性能。


2

运行 Profiler 并过滤那些读取次数超过一定数量的查询。 对于我所工作的应用程序而言,任何非报告类查询如果超过 5000 次读取就值得再仔细检查。你的应用可能有不同的阈值,但思路是相同的。


2
这个由Erland Sommarskog开发的工具非常有用。
它是一个存储过程,可以添加到您的数据库中。每当您想查看活动查询并获得锁定、阻塞等情况的全面图片时,请运行它。当事情似乎变得复杂时,我经常使用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接