Management Studio 和探查器中的查询执行时间。它测量什么?

问题描述 投票:0回答:3

我的生产 SQL Server 位于远程数据中心(并且 Web 服务器位于同一数据中心)。在开发过程中,我们观察到一个特定的视图需要在本地开发 SQL Server 中执行很长时间(大约 60-80 秒),我们对此表示满意。它被提升到生产环境,当我在生产数据库上运行相同的查询时(位于数据中心)从我本地的 Management Studio 中我看到查询运行大约需要 7 分钟 17 秒(可在 Management Studio 的右下角找到)。当我运行探查器时,我看到所花费的时间执行该查询需要 437101 微秒毫秒,尽管它在管理工作室中显示为 7:17。 ,实际上约为 437101 毫秒。我的 DBA 说,在产品中,视图只需要大约 60 到 80 秒,尽管我从 Profiler 和 Management Studio 看到不同的数字。有人可以告诉我这些持续时间在 Profiler 和 Management Studio 中意味着什么吗?

我的猜测:发送最后一个请求字节和从服务器接收最后一个响应字节之间的持续时间。客户统计如下: 客户端处理时间:90393 总执行时间:92221 服务器回复等待时间:1828

我对探查器上“持续时间”含义的最佳猜测是“SQL Server(优化引擎解析查询、生成查询计划或使用现有查询计划+从不同页面获取记录)生成结果所花费的时间设置不包括数据通过线路传输到客户端所花费的时间”

编辑:我发现这两个时间大致相同(管理工作室与分析器)。它们与我在客户统计数据中看到的时间有何关系?

有人能对这些有更多的了解吗?

sql-server-2008 profiling performance ssms
3个回答
9
投票

如果我正确理解您的问题,您首先会质疑Profiler报告的持续时间与SSMS中显示的统计数据之间的差异(一般时间在右下角和/或通过SET STATISTICS TIME ON)。除此之外,您似乎不相信生产 DBA 的评论,即视图在大约 60 秒的预期持续时间内执行。

首先,从在线图书中,SSMS 将通过 SET STATISTICS TIME ON 报告回来的统计数据:

“显示毫秒数 需要解析、编译和 执行每条语句。”

你非常适合这一点。至于Profiler中的Duration,描述为:

“持续时间(以微秒为单位) 事件。”

从我的角度来看,这两者在功能上应该是等效的(而且,我相信您已经注意到,如果您违反 SQL 2005 或更高版本,Profiler 将以微秒为单位进行报告)。我这样说是因为这种情况下的“事件”(关于 Profiler 中的持续时间)是选择的执行,其中包括交付给客户端;这在两种情况下都是一致的。

您似乎怀疑地理位置是远程执行查询时持续时间较长的罪魁祸首。这很可能是。您可以通过在一个查询窗口中的视图上执行选择,然后生成另一个查询窗口并检查查询的等待类型来测试这一点:

select
    a.session_id
    ,a.start_time
    ,a.status
    ,a.command
    ,db_name(a.database_id) as database_name
    ,a.blocking_session_id
    ,a.wait_type
    ,a.wait_time
    ,a.cpu_time
    ,a.total_elapsed_time
    ,b.text
from sys.dm_exec_requests a
    cross apply sys.dm_exec_sql_text(a.sql_handle) b
where a.session_id != @@spid;

我怀疑如果地理位置是问题的话,您会看到类似 ASYNC_NETWORK_IO 的等待类型 - 否则,请检查会发生什么。如果您正在分析远程执行的查询,则持续时间将反映您在 SSMS 中看到的时间统计信息。然而,如果您使用 Profiler 并发现该查询的持续时间当从与 SQL Server 位于同一数据中心的其中一个 Web 服务器执行时 仍然需要 7 分钟,那么 DBA 就是一个大问题,胖骗子:)。我会使用 Profiler 记录耗时超过 1 分钟的查询,尝试筛选您的视图并取平均值来查看您是否达到了性能目标。

因为没有发布其他答案,所以我担心我在这里偏离了基地 - 但已经晚了,而且我对此很陌生,所以我想我应该尝试一下!


1
投票

如果您打开查询的属性选项卡,您可能会发现一些神奇的“经过时间”,这可能会给您一些执行时间...

此信息也可能有帮助:

http://blog.sqlauthority.com/2009/10/01/sql-server-sql-server-management-studio-and-client-statistics/


0
投票

试试这个:

DECLARE @time AS DATETIME = CURRENT_TIMESTAMP

-- Your Query

SELECT CAST(DATEDIFF(SECOND, @time, CURRENT_TIMESTAMP) AS VARCHAR)
    + ','
    + CAST(DATEDIFF(MICROSECOND, @time, CURRENT_TIMESTAMP) AS VARCHAR)
    AS 'Execution Time'
© www.soinside.com 2019 - 2024. All rights reserved.