如何使用C#在Windows窗体中显示MSSQL中由实时查询统计信息启用的执行查询百分比?
作者:互联网
在SSMS中,启用实时查询统计信息后,我可以在窗口左下方看到执行百分比.
我想在Windows窗体上向最终用户显示此递增百分比.到目前为止,我尝试使用Visual Studio上的进度条实现此功能,但结果证明直到使用数据表,这都是不可能的.
即使我可以在标签上以文本格式显示增量百分比,也不要忘记进度条-就像在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,因此无需执行任何操作.
另一个关于准确性的警告:计算是基于查询计划的estimate_row_count,因此估计可能会非常粗糙,尤其是在统计信息不是最新的情况下
标签:ssms,sql-execution-plan,c,sql-server,visual-studio 来源: https://codeday.me/bug/20191211/2106489.html