如何使用 C# 以 windows 形式显示由 MSSQL 中的实时查询统计信息启用的执行查询百分比?
How can I display the Executing Query % which is enabled by Live Query Statistics in MSSQL in a windows form using C#?
在 SSMS 中,当我启用实时查询统计信息时,我可以在 window 的左下角看到执行百分比。
我想在 windows 表单上向最终用户显示这个递增的百分比。到目前为止,我尝试使用 Visual Studio 上的进度条来实现此功能,但结果证明直到我使用数据 table,这是不可能的。
忘掉进度条,即使我可以在标签上以文本格式显示增量百分比 - 就像在 SSMS 中一样,它也能完成工作。
在 C# 中实现代码的任何建议都会有所帮助。
在 SQL Server 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,因此估计可能非常粗略,尤其是在统计数据不是最新的情况下
在 SSMS 中,当我启用实时查询统计信息时,我可以在 window 的左下角看到执行百分比。
我想在 windows 表单上向最终用户显示这个递增的百分比。到目前为止,我尝试使用 Visual Studio 上的进度条来实现此功能,但结果证明直到我使用数据 table,这是不可能的。
忘掉进度条,即使我可以在标签上以文本格式显示增量百分比 - 就像在 SSMS 中一样,它也能完成工作。
在 C# 中实现代码的任何建议都会有所帮助。
在 SQL Server 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,因此估计可能非常粗略,尤其是在统计数据不是最新的情况下