Как я могу отобразить Executing Query%, который включен Live Query Statistics в MSSQL в форме окна с использованием C #? - PullRequest
0 голосов
/ 06 февраля 2019

В SSMS, когда я включаю Live Query Statistics, я вижу процент выполнения в левом нижнем углу окна.

enter image description here

Я хочу отобразить этот процент увеличенияконечному пользователю на форме окна.До сих пор я пытался реализовать это с помощью индикатора выполнения в Visual Studio, но оказывается, что пока я не использую таблицу данных, это невозможно.

enter image description here

Забудьте индикатор выполнения, даже еслиЯ мог бы отображать добавочный процент в текстовом формате на метке - точно так же, как в SSMS, он сделает свою работу.

Любые предложения по реализации кода на C # будут полезны.

1 Ответ

0 голосов
/ 06 февраля 2019

В 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

Еще одно предупреждение касается точности: расчеты основаны на показателях_оценки_плана плана запроса, поэтому оценки могут быть очень приблизительными, особенно если статистика не актуальна

...