DMV sys.dm_exec_requests 中的 total_elapsed_time 是否完全不准确?

Joe*_*ias 13 sql-server dmv sql-server-2012

我正在运行 SQL Server 2012 并尝试将一些查询放在一起以使用 DMV 进行监控。但是,当查看DMV中的total_elapsed_time字段时sys.dm_exec_requests,这些数字看起来相差甚远。下面是一个例子:

SELECT
  session_id, RunTime = CURRENT_TIMESTAMP,
  start_time, total_elapsed_time
FROM sys.dm_exec_requests
WHERE session_id = 284;

session_id  RunTime                 start_time              total_elapsed_time
284         2016-04-07 16:14:03.690 2016-04-07 16:08:14.587 1419976
Run Code Online (Sandbox Code Playgroud)

根据我的计算*,经过的时间应该在 349,103 左右——而不是 1,419,976。这减少了超过 4 倍。

* 从当前时间和start_time之间的差异,以毫秒为单位,即
SELECT DATEDIFF(MILLISECOND, '2016-04-07T16:08:14.587', '2016-04-07T16:14:03.690');

这是服务器信息:

SELECT @@VERSION;

Microsoft SQL Server 2012 - 11.0.5592.0 (X64) 
    Apr 17 2015 15:18:46 
    Copyright (c) Microsoft Corporation
    Enterprise Edition: Core-based Licensing (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
Run Code Online (Sandbox Code Playgroud)

任何想法可能导致这种差异?

Cha*_*tox 11

有一个错误会在并行操作中聚合时间。这是在 2014 年修复的。

对于批处理中的特定并行查询,total_elapsed_time将是正确的,直到它移动到批处理中的下一个语句,然后total_elapsed_time将被 DOP 爆炸。

例子

在一个查询窗口中运行:

USE AdventureWorks2012
GO
SELECT *
FROM Sales.SalesOrderDetail sod
JOIN Production.Product p ON sod.ProductID = p.ProductID
ORDER BY Style 

waitfor delay '00:00:15'
Run Code Online (Sandbox Code Playgroud)

立即运行:

select 
    DATEDIFF(ms, start_time, getdate()) ActualElapsedTime,
    total_elapsed_time from sys.dm_exec_requests
where session_id = <your session_id for the above batch>
Run Code Online (Sandbox Code Playgroud)

在 SQL Server 移动到WAITFORDELAY语句之前,这两个值将接近相同,然后您应该看到total_elapsed_time爆炸(假设第一个查询具有与我的服务器上一样的并行计划)。

我记得几年前为一个客户做这件事。在内部数据库中发现了错误(我是 Microsoft Premier 开发顾问),但没有公开参考。


Jam*_*oat 7

看起来它也可能是 DMV 的错误/问题。有一个连接错误报告在这里这种相同的不准确的。建议的解决方法是使用

GETDATE() - sys.dm_exec_requests.start_time
Run Code Online (Sandbox Code Playgroud)

而不是total_elapsed_time。该问题已在 SQL Server 2014 中解决。引用“Nathan (MSFT)”对 Connect 项的评论:

sys.dm_exec_requests.total_elapsed_time的问题并非特定于RESTORE操作;它也被观察到UPDATE STATISTICS。此问题不会在 SQL Server 2008 R2 中解决。[...] 该问题已在 SQL Server 2014 中解决。