在SSMS,当我启动实时查询统计,我可以看到在窗口的左下角的执行率。
我想这显示比例递增到最终用户在Windows窗体上。到目前为止,我试图执行的Visual Studio中使用这个进度条,但事实证明,直到我用一个数据表,这是不可能的。
忘了进度条,即使我可以在标签上显示文本格式的增量比例 - 酷似SSMS它会做的工作。
任何建议,以实现在C#代码将是有益的。
在SQL服务器2016 SP1 +可以通过dm_exec_query_profiles完成:
-- to enable LQS infrastructure, you have to do it once, also it can be set a startup trace:
DBCC TRACEON(7412, -1)
-- Session to track:
DECLARE @YourSessin INT = 760
-- Query that track a progress
SELECT session_id ,
node_id ,
physical_operator_name ,
SUM(row_count) row_count ,
SUM(estimate_row_count) AS estimate_row_count ,
IIF(COUNT(thread_id) = 0, 1, COUNT(thread_id)) [Threads] ,
ISNULL(CAST(SUM(row_count) * 100. / NULLIF(SUM(estimate_row_count),0) AS DECIMAL(30, 2)),0) [PercentComplete] ,
CONVERT(TIME, DATEADD(ms, MAX(elapsed_time_ms), 0)) [Operator time] ,
DB_NAME(database_id) + '.' + OBJECT_SCHEMA_NAME(QP.object_id,
qp.database_id) + '.'
+ OBJECT_NAME(QP.object_id, qp.database_id) [Object Name]
FROM sys.dm_exec_query_profiles QP
WHERE QP.session_id = @YourSessin
GROUP BY session_id ,
node_id ,
physical_operator_name ,
qp.database_id ,
QP.OBJECT_ID ,
QP.index_id
ORDER BY session_id ,
node_id
和更紧凑的版本:
DBCC TRACEON(7412, -1)
DECLARE @YourSessin INT = 760
SELECT MIN( CAST(row_count * 100. / NULLIF(estimate_row_count,0) AS DECIMAL(30, 2))) [PercentComplete]
FROM sys.dm_exec_query_profiles QP
WHERE QP.session_id = @YourSessin
请注意,使LQS基础设施会增加一些开销。根据MS,如果SQL Server 2016 SP1 +是1-2%。在旧版本的它提升高达75%
在SQL Server 2019 LQS是默认启用的,所以不需要操作。
在最近的线程主题的更多信息:https://dba.stackexchange.com/questions/228957/sql-server-2014-view-any-live-execution-plan-in-activity-monitor/228958#228958
另一个警告是关于精度:计算是基于查询计划的estimate_row_count,因此估计可能是很粗糙的,特别是如果统计数据不是最新的