我们的SQL Server 2005群集上存在零星的随机查询超时。我拥有一些使用它的应用程序,所以我正在帮助调查。在常规ol'Perfmon中观察%CPU时间时,你当然可以看到它盯住了。但是,SQL活动监视器仅提供进程使用的累积CPU和IO时间,而不是当时使用的或在特定时间范围内使用的累积CPU和IO时间。也许我可以使用分析器并运行跟踪,但是这个集群使用非常频繁,我担心我会在大海捞针中寻找针。我吠叫错了树吗?
有没有人有一些很好的方法可以在这种环境中追踪昂贵的查询/流程?
答案 0 :(得分: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
答案 1 :(得分:4)
我发现Performance Dashboard Reports非常有帮助。它们是Microsoft提供的一组自定义RS报告。您只需在客户端PC上运行安装程序,然后在SQL Server实例上运行setup.sql。
之后,右键单击SSMS中的数据库(无关紧要)并转到报告 - >自定义报告。导航到并选择默认情况下位于\ Program Files \ Microsoft SQL Server \ 90 \ Tools \ PerformanceDashboard文件夹中的performance_dashboard_main.rdl。你只需要这样做一次。第一次之后,它将显示在报告列表中。
主仪表板视图将显示随时间推移的CPU利用率等。你可以偶尔刷新它。当您看到尖峰时,只需单击图形中的条形图即可获得其背后的详细数据。
答案 2 :(得分:3)
我们使用Quest的Spotlight产品。显然,这是对时间和金钱的投入,所以它可能在短期内帮助你,但如果你有一个庞大的SQL环境,它就非常有用。
答案 3 :(得分:3)
正如Yaakov所说,在典型负载下运行探查器几分钟,并将结果保存到一个表中,这将允许您对结果运行查询,从而更容易发现任何资源占用查询。
答案 4 :(得分:2)
Profiler可能看起来像是“大海捞针”的方法,但它可能会变成有用的东西。尝试运行它几分钟,同时数据库处于典型负载状态,并查看是否有任何疑问因为花费太多时间或以某种方式占用资源而脱颖而出。虽然这种情况可能会指出一些普遍的问题,但它也可能与一个或两个网站的某些特定问题有关,这在某些情况下会使问题变得非常糟糕,导致整个问题的表现非常糟糕。
答案 5 :(得分:2)
运行Profiler并过滤超过一定读数的查询。对于我所使用的应用程序,任何超过5000次读取的非报告查询都值得再次查看。您的应用可能有不同的阈值,但想法是一样的。
答案 6 :(得分:2)
This utility非常有用。
这是您添加到数据库的存储过程。每当你想看看哪些查询是活跃的时候运行它,并获得锁,块等的良好画面。当事情看起来很糟糕的时候我经常使用它。