以秒为单位收集 SQL Server 查询执行时间

wil*_*345 4 sql-server sql-server-2016

我试图找到一种方法来收集过去两天的 SQL 服务器查询响应时间。有没有办法实现这一目标?我知道 DMV 有查询统计数据,但我似乎没有达到我的要求。我无权访问查询存储,因此目前也无法使用它。

我正在寻找 SQL 服务器的查询响应时间,因为有人指责 sql 服务器,但我看不到内存压力/cpu 压力或任何瓶颈。因此,现在尝试获取针对服务器运行的查询的响应时间。

谢谢

For*_*est 6

确实有多种方法。

查询存储

既然你有 SQL Server 2016,我可以推荐查询存储吗?您可以从 SSMS 的“属性”菜单中为每个数据库启用它,或者通过运行类似于以下脚本的内容:

USE [master]
GO
ALTER DATABASE [TestDB] SET QUERY_STORE = ON
GO
ALTER DATABASE [TestDB] SET QUERY_STORE (OPERATION_MODE = READ_WRITE, QUERY_CAPTURE_MODE = AUTO)
GO
Run Code Online (Sandbox Code Playgroud)

开启后,您可以查看查询性能详细信息。

SSMS 视图:

陷阱: 公平警告 - 打开查询存储将清除计划缓存!查询存储作为一项较新的功能,可能有一些怪癖。我自己也遇到过好几个就性能而言,我认为它用于 20k 批次/秒和只有百分之几的 CPU 开销的环境中。

车管所

另一种选择是使用 dmvs。在这种情况下sys.dm_exec_query_stats,您正在寻找的是,特别是“elapsed_time”列。这是一个查询,用于查看最近的长时间查询。

SELECT TOP 50
st.text,
SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,  
    ((CASE statement_end_offset   
        WHEN -1 THEN DATALENGTH(st.text)  
        ELSE qs.statement_end_offset 
    END - qs.statement_start_offset)/2) + 1
) AS statement_text,
qp.query_plan,
qs.execution_count,
qs.last_execution_time,
qs.last_worker_time/1000000.0 AS last_worker_time_s, --this is CPU time
qs.last_elapsed_time/1000000.0 AS last_elapsed_time_s --this is clock time
FROM sys.dm_exec_query_stats qs  
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st 
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
WHERE last_execution_time > DATEADD(minute,-5,GETDATE()) --last 5 minutes
ORDER BY qs.last_elapsed_time DESC
Run Code Online (Sandbox Code Playgroud)

陷阱要留神与此DMV是,它不捕获RECOMPILE查询,它不捕获取消查询(这是与查询超时会发生什么从应用程序)。

安全管理系统

最后,如果您知道确切的查询,您可以在 SSMS 中运行它并查看实际的执行计划。突出显示选择,然后查看右侧的属性窗口。您将看到有关 CPU 和持续时间(以毫秒为单位)的非常有用的信息。运营商也有类似的信息。

实际计划

陷阱用此方法包括以下事实:通过SSMS提交的查询不一定反映与应用程序查询会发生什么。规范链接在这里。

总之,我强烈推荐查询存储。