我想知道有哪些方法可以监视哪些存储过程和SQL查询在各种组件(CPU周期,扫描时间等)上花费的时间比已设置的阈值要多。
我希望它也被记录下来。 每当任何用户使用我的网站并调用某个程序时,我想记录超过我的阈值的所有程序。
是否可以使用SQL查询或过程来执行此操作。我们有一些程序吗? 任何SQL工具或任何外部工具都可以支付(试用)或免费。我想在我的数据库上试一试。
答案 0 :(得分:13)
您应该能够使用Dynamic Management Views(DMV)执行此操作,特别是您可能对exec_query_stats视图最感兴趣,该视图维护所有查询的执行统计信息(CPU时间,物理/逻辑读取等...)按执行计划分组。
另见这篇优秀的文章,其中包含查看计划统计数据的示例查询,并详细介绍了该主题:
最后,如果要跟踪/记录过度长时间运行的查询,那么您可能需要考虑让SQL Server Profiler跟踪始终运行,并将执行时的过滤器设置为某些高数字(例如> 1000毫秒)。您可以使用SQL Server Profiler窗口应用程序,也可以使用T-SQL创建跟踪,而不是将其记录到数据库中的表中:
这样做的好处是可以准确地告诉您查询究竟花了多长时间,以及该查询的参数是什么(神圣的SQL蝙蝠侠!)
在加载的数据库上运行此跟踪的性能影响实际上非常小 - 我知道令人惊讶的批评应用程序,这些跟踪作为例行程序运行,以便能够快速诊断性能问题(它确实有帮助很多)。关键在于选择一个“大”的执行时间,这个时间足够大,不会淹没日志,但又要小到足以获得足够长时间运行的查询才有用。
过去在遇到性能问题时使用的另一个技巧是在加载的SQL服务器上保持一段未经过滤的SQL服务器跟踪在短时间内(大约1分钟)运行(它实际上确实产生了惊人的影响) ,你只是淹没了日志)
我也衷心地推荐关于这个主题的Microsoft SQL Server internals书籍 - 这是非常技术性的,但它很棒,因为它不仅涵盖了这些类型的诊断工具,还涵盖了它们的所有内容>实际意味着
答案 1 :(得分:4)
如果你有SQL 2005 +,你可以在管理报告中运行标准报告右键单击管理工作室中的数据库并选择对象执行统计 - 这仅在上次重启后才有效。您也可以使用DMV的sys.dm_exec_query_stats
进行查询如果您使用的是旧版本的SQL,请使用SQL Server Profiler,这将显示执行时间,读取,CPU,写入,您可以过滤任何这些的阈值。
答案 2 :(得分:3)
这些是我通常使用的。我不记得我从哪里得到它们,但它们是一种享受。这是最长时间运行的查询:
SELECT TOP 100
qs.total_elapsed_time / qs.execution_count / 1000000.0 AS average_seconds,
qs.total_elapsed_time / 1000000.0 AS total_seconds,
qs.execution_count,
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 individual_query,
o.name AS object_name,
DB_NAME(qt.dbid) AS database_name
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt
LEFT OUTER JOIN sys.objects o ON qt.objectid = o.object_id
WHERE qt.dbid = DB_ID()
ORDER BY average_seconds DESC;
...并且这个提供了使用最多I / O的查询列表:
SELECT TOP 100
(total_logical_reads + total_logical_writes) / qs.execution_count AS average_IO,
(total_logical_reads + total_logical_writes) AS total_IO,
qs.execution_count AS execution_count,
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 individual_query,
o.name AS object_name,
DB_NAME(qt.dbid) AS database_name
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt
LEFT OUTER JOIN sys.objects o ON qt.objectid = o.object_id
WHERE qt.dbid = DB_ID()
ORDER BY average_IO DESC;
希望这些有所帮助!
答案 3 :(得分:2)
您可以使用SQL Server Profiler:
注意:
答案 4 :(得分:1)
在付费工具方面,我强烈推荐来自Ignite for SQL Server的Confio Software。您可以下载免费试用版并将其转为旋转版。我们已经使用它大约2年了,对结果非常满意。在我们的案例中,我们选择了几个“低挂水果”存储过程,我们在运行演示时优化了快速获胜。这足以让我们相信这是一项有价值的投资。
答案 5 :(得分:1)
从获胜的答案a recent SO question,这将为您提供前50个最常用的过程和过程中的陈述。您可以将TOP 50更改为TOP 1或您想要查看的任何其他数字。
SELECT TOP 50 *
FROM ( SELECT COALESCE(OBJECT_NAME(s2.objectid), 'Ad-Hoc') AS ProcName
,execution_count
,s2.objectid
,( SELECT TOP 1 SUBSTRING(s2.text,
statement_start_offset / 2 + 1,
( ( CASE WHEN statement_end_offset = -1
THEN ( LEN(CONVERT(NVARCHAR(MAX), s2.text))
* 2 )
ELSE statement_end_offset
END ) - statement_start_offset )
/ 2 + 1)
) AS sql_statement
,last_execution_time
FROM sys.dm_exec_query_stats AS s1
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS s2
) x
WHERE sql_statement NOT LIKE 'SELECT * FROM(SELECT coalesce(object_name(s2.objectid)%'
AND OBJECTPROPERTYEX(x.objectid, 'IsProcedure') = 1
AND EXISTS ( SELECT 1
FROM sys.procedures s
WHERE s.is_ms_shipped = 0
AND s.name = x.ProcName )
ORDER BY execution_count DESC
您可以定期运行此功能以查看随时间的变化。 将其放入存储过程并将结果插入日志表中。设置计划作业以固定间隔运行该sproc。
答案 6 :(得分:1)
另请注意,在SQL 2008中,有一个专门用于过程的新DMV:sys.dm_exec_procedure_stats。此视图将为您提供整个过程的累积统计信息,包括执行非查询相关工作所花费的时间和CPU,如WAITFOR,函数调用和条件逻辑。
请务必在生产服务器上运行探查器跟踪。跟踪会在服务器上引入开销,甚至是最小的跟踪。根据服务器的繁忙程度,这实际上可能会很明显。向跟踪定义添加过滤器不会减少此开销,SQL Server仍需要处理每个触发的事件以确定它是否满足过滤条件。过滤仅用于减少跟踪文件的大小。
如果您正在处理SQL 2008,您可能想要查看的另一个工具是Data Collector和Management Data Warehouse。这是一个随SQL Server一起提供的工具(无需额外费用),它允许您定期收集查询统计信息并将其上载到数据仓库。它内置的收集器和报告非常全面,可满足最常见的监控需求。
http://msdn.microsoft.com/en-us/library/dd939169(SQL.100).aspx
在上面提到的所有事情中,我认为你最好的选择是sys.dm_exec_query_stats,因为它是低开销,免费的,并且在SQL 2005和SQL 2008上都可用。
答案 7 :(得分:0)
如果您使用的是SQL Server 2008,则可以尝试使用资源调控器,它可以限制和监控CPU和内存工作负载。
出于记录目的,您可以使用Data Collection。您可以创建自定义集合集,从任何DMV收集快照并将其上载到性能数据仓库。
Idera具有显示每个查询的资源消耗的图表工具。我认为它也允许用户设置阈值和电子邮件警报。