识别SQL Server性能问题

识别SQL Server性能问题

Identifying SQL Server Performance Problems

我们的SQL Server 2005群集上有零星的随机查询超时。 我拥有一些使用它的应用程序,因此在调查中提供了帮助。 在常规Perfmon中观看%CPU时间时,您肯定可以看到它固定不变。 但是,SQL活动监视器仅提供进程使用的累积CPU和IO时间,而不提供当时或在特定时间范围内正在使用的时间。 也许我可以使用探查器并进行跟踪,但是该群集使用率很高,恐怕我会在大海捞针中寻找针头。 我在树错树上吠叫吗?

在这种环境下,没有人有一些好的方法来跟踪昂贵的查询/过程吗?


这将按平均CPU时间为您提供前50条语句,请在此处查看其他脚本:http://www.microsoft.com/technet/scriptcenter/scripts/sql/sql2005/default.mspx?mfr=true

1
2
3
4
5
6
7
8
9
10
11
12
13
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


我发现效果仪表板报告非常有用。它们是Microsoft提供的一组自定义RS报告。您只需要在客户端PC上运行安装程序,然后在SQL Server实例上运行setup.sql。

之后,右键单击SSMS中的数据库(无关紧要),然后转到"报告"->"自定义报告"。导航至默认情况下位于\ Program Files \ Microsoft SQL Server \ 90 \ Tools \ PerformanceDashboard文件夹中的performance_dashboard_main.rdl并选择它。您只需要执行一次。第一次之后,它将显示在报告列表中。

仪表板主视图将显示一段时间内的CPU利用率等信息。您可以偶尔刷新它。当您看到峰值时,只需单击图形中的条以获取其背后的详细数据。


正如Yaakov所说,在典型负载下运行Profiler几分钟,然后将结果保存到表中,这将使您可以针对结果运行查询,从而更容易发现任何占用资源的查询。


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


Erland Sommarskog的此实用程序非常有用。

这是一个添加到数据库的存储过程。每当您想查看哪些查询处于活动状态并获得有关锁,块等的清晰图像时,都应运行它。当事情看起来很混乱时,我会定期使用它。


运行Profiler并筛选查询次数超过一定数目的查询。对于我处理过的应用程序,任何花费超过5000次读取的非报告查询都值得一看。您的应用可能有不同的阈值,但想法是相同的。


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


推荐阅读