是否存在平均执行时间的SQL Server性能计数器?

时间:2008-10-02 19:35:42

标签: sql-server performance

我想调整生产SQL服务器。在进行调整(例如更改并行度)之后,我想知道它是否有助于或损害查询执行时间。

这似乎是一个明显的性能计数器,但是在过去的半小时里我一直在搜索Google和perfmon中的计数器列表,我无法找到SQL服务器的性能计数器来给我平均执行所有查询命中服务器的时间。 SQL Server等效于ASP.NET请求执行时间。

我缺少一个人吗?是否有另一种有效的方法来监控服务器的平均查询时间?

9 个答案:

答案 0 :(得分:4)

我不相信有一个PerfMon,但SQL Server Management Studio中有一个报告:

右键单击数据库,选择报告>标准报告>对象执行统计。这将为您提供几个非常好的统计数据,包括数据库中正在运行的内容,需要多长时间,需要多少内存/ io处理等等。

您也可以在所有数据库的服务器级别上运行它。

答案 1 :(得分:1)

您可以使用查询分析器(这是SQL Server的工具之一),看看它们是如何在内部执行的,这样您就可以优化索引等。这不会告诉您平均值,或往返回到客户。要做到这一点,你必须在客户端登录并自己分析数据。

答案 2 :(得分:1)

我设法通过将Trace保存到SQL来实现。当迹线打开时

File> Save As> Trace Table

选择SQL,并在导入后运行

select avg(duration) from dbo.[YourTableImportName] 

您可以非常轻松地执行其他统计数据,最大值,最小值,计数等...更好的查询跟踪结果的方法

答案 3 :(得分:0)

平均时间和查询次数?你需要进一步用“平均”来定义你的意思,或者它没有意义,这可能就是为什么它不是一个简单的性能计数器。

您可以通过运行跟踪捕获此信息,将其捕获到表中,然后您可以通过多种方式之一对执行时间进行切片和切块。

答案 4 :(得分:0)

它并未准确提供您所需的内容,但我强烈建议您尝试下载here的SQL Server 2005 Performance Dashboard Reports。它包括前20个查询的报告及其平均执行时间以及许多其他有用的查询(IO的最高查询,等待统计等)。如果您确实安装了它,请务必记下它的安装位置,并按照“附加信息”部分中的说明进行操作。

答案 5 :(得分:0)

分析器将为您提供有关服务器上查询执行时间和活动的统计信息。如果不将它们与特定的作业和查询计划联系起来,总体查询时间可能会或可能不会非常重要。

性能瓶颈的其他指标是资源争用计数器(一般统计,锁存器,锁)。您可以通过性能计数器查看这些内容同时查找大量的表扫描或其他不使用索引的操作可以指示可能需要建立索引。

在加载的服务器上,增加并行性不太可能对性能产生重大影响,因为在任何给定时间已经有许多查询处于活动状态。并行性可以让您赢得大量不经常运行的批处理作业,例如ETL进程。如果你需要减少这样一个进程的运行时间,那么并行性可能是一个好看的地方。在繁忙的服务器上为许多用户执行事务工作负载时,系统资源将忙于工作负载,因此并行性不太可能是一个巨大的胜利。

答案 6 :(得分:0)

您可以使用活动监视器。它内置于SSMS中。它可以让您实时跟踪服务器上所有当前昂贵的查询。

打开活动监视器

  1. 在Sql Server Management Studio(SSMS)中,右键单击服务器并选择活动监视器
  2. 打开最近的昂贵查询以查看CPU使用率,平均查询时间等。
  3. 希望有所帮助。

答案 7 :(得分:0)

“ SQL Server:批处理响应统计信息”组中有计数器,它们可以跟踪SQL批处理响应时间。根据响应时间间隔对计数器进行划分,例如,从0 ms到1 ms,...,从10 ms到20 ms,...,从1000 ms到2000 ms,依此类推,因此可以选择合适的计数器在所需的时间间隔内。

希望有帮助。

答案 8 :(得分:0)

另一种解决方案是多次运行查询并获取平均查询时间:

DO $proc$
DECLARE
    StartTime timestamptz;
    EndTime timestamptz;
    Delta double precision;
BEGIN
    StartTime := clock_timestamp();
    FOR i IN 1..100 LOOP
        PERFORM * FROM table_name;
    END LOOP;
    EndTime := clock_timestamp();
    Delta := 1000 * (extract(epoch FROM EndTime) - extract(epoch FROM StartTime)) / 100;
    RAISE NOTICE 'Average duration in ms = %', Delta;
END;
$proc$;

在此运行100次查询:

PERFORM * FROM table_name;

只需将SELECT替换为PERFORM