在 SQL SERVER 中监视 SQL 查询的进度
Posted
技术标签:
【中文标题】在 SQL SERVER 中监视 SQL 查询的进度【英文标题】:Monitoring the progress of an SQL query in SQL SERVER 【发布时间】:2011-03-18 09:48:45 【问题描述】:我看到了一个类似的问题,询问如何监控备份/恢复操作的进度: Is there a SQL script that I can use to determine the progress of a SQL Server backup or restore process?
我想知道是否有类似的查询/方法来查看查询还有多长时间才能结束。 例如,一个查询的经过时间通常为 5 分钟。 我想知道在查询执行期间它会结束还有多少时间。
【问题讨论】:
嗨,Roni,澄清一下,您是否希望监控正在执行备份/恢复的查询的进度?还是一般的查询? 【参考方案1】:没有办法知道还剩多少时间。查询的运行时间取决于实际查询本身之外的许多因素:其他查询的锁定/阻塞、其他进程消耗资源(CPU/磁盘使用情况)、操作系统、网络等。如果您的 5 分钟查询正在运行怎么办?其他人开始了大型报告,您的查询现在可能会在 5:30 运行。如果有人开始下载一个大文件并占用所有网络带宽怎么办?如果操作系统决定在后台做某事等等。在返回所有行之前,查询不会完成,但它可以在可变的时间范围内运行。
【讨论】:
确实如此。在某些(配置不当/过载)系统上,单个密集查询可以锁定关键表 - 突然之间,通常在第二次运行后完成数十分钟的查询。您可以查看查询时间并提供猜测 - “平均而言,此查询在 5:41 完成,现在已经运行了 3:15”,但这只是:猜测(甚至不是估计)。 我见过在生产数据库盒上运行的 3D 渲染屏幕保护程序! 以Oracle为例,我们有视图v$session_longops,它显示操作的状态。 download.oracle.com/docs/cd/B19306_01/server.102/b14237/…我确定在 SQL SERVER 中没有类似的东西吗?罗尼。 @Roni Vered,有很多方法可以从 SQL Server 获取有关运行查询的信息,但没有“TIME_RAMINING”值。您也许可以根据之前的运行计算平均值,请参阅:***.com/questions/617170/… 唯一没有预期时间估计会根据服务器负载波动的人确实对计算机非常陌生。接受时间估计是估计,然后尝试SELECT percent_complete FROM sys.dm_exec_requests
,然后可以使用它来估计查询应该完成的时间。【参考方案2】:
你想要的是Live Query Statistics。
您可以在最新版本的 SSMS 中使用提供正常查询计划的按钮旁边的按钮激活它:
这会给你一个实时查询计划:
在底部您可以看到总进度:
【讨论】:
我觉得这可能会对查询性能产生负面影响。我的意思是 - 为什么不启用实时查询计划就无法获得进度信息?编辑:原来live query stats documentation 上有一个很大的警告标签。事实上,它确实会对性能产生负面影响。谨慎使用!【参考方案3】:是的,您可以知道预计经过的时间,除非有一些意外情况影响流程的执行。
Select total_elapsed_time,
* from sys.dm_exec_sessions where session_id="your Id here"
【讨论】:
【参考方案4】:sys.dm_exec_requests
有该信息,因此类似的内容将为您提供进度:
SELECT
percent_complete
FROM sys.dm_exec_requests
--where session_id=51 or command like 'restore%'
【讨论】:
此查询仅在您具有 VIEW SERVER STATE 权限时才有用。如果不这样做,您只会看到刚刚提交的 SELECT 语句的结果,这有点没用!要确定您是否有权限,请运行以下“SELECT * FROM fn_my_permissions(NULL, 'SERVER');” - 如果您没有看到权限名称为“查看服务器状态”的条目,那么您没有权限。 此外,此信息仅在执行特定命令时提供。例如,ROLLBACK
、RECOVERY
或 BACKUP DATABASE
。以上是关于在 SQL SERVER 中监视 SQL 查询的进度的主要内容,如果未能解决你的问题,请参考以下文章
利用SQL活动和监视器找出耗时与占用CPU较高的不良SQL语句