拉取 Top 查询在查询计划和 sql 文本中返回 NULL

Kri*_*yer 4 sql-server dmv top

我正在使用以下代码来提取前 20 个查询(按 CPU 排序):

SELECT TOP 20 qs.sql_handle
    ,qs.execution_count
    ,qs.total_worker_time AS [Total CPU]
    ,qs.total_worker_time / 1000000 AS [Total CPU in Seconds]
    ,(qs.total_worker_time / 1000000) / qs.execution_count AS [Average CPU in Seconds]
    ,qs.total_elapsed_time
    ,qs.total_elapsed_time / 1000000 AS [Total Elapsed Time in Seconds]
    ,st.TEXT
    ,qp.query_plan
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp
ORDER BY qs.total_worker_time DESC
Run Code Online (Sandbox Code Playgroud)

但是,我看到的是: 在此处输入图片说明

任何人都可以解释为什么查询计划和 SQL 文本显示为 NULL?它们是某种系统进程还是外部应用程序?我们正在运行 SQL 2008 R2。

谢谢大家,一如既往!

Kin*_*hah 6

使用时有限制 sys.dm_exec_query_plan

5.4 何时以及如何使用 Sys.dm_exec_text_query_plan

sys.dm_exec_query_plan 返回的 query_plan 列的类型为 XML,并且受到数据类型的固有限制,即嵌套级别不能大于或等于 128。在 SQL Server 2005 RTM 和 SP1 中,如果 query_plan 的深度大于或等于 128大于或等于 128 个级别,这将阻止查询返回。第二个限制是,在不解析从 sys.dm_exec_query_plan 返回的查询计划 XML 的情况下,直接从 DMV 获取批处理中特定语句的查询计划并不容易。

为了解决这两个限制,我们在 SQL Server 2005 SP2 中引入了sys.dm_exec_text_query_plan. Sys.dm_exec_text_query_plan 是一个 TVF,它带有 3 个参数:plan_handle、statement_start_offset 和 statement_end_offset。它以文本格式返回批处理或批处理中特定语句的显示计划。

最好不要重新发明轮子,最好使用Brent 的 - sp_BlitzCacheGlenn 的诊断查询亚伦在这里的回答

使用 DMV 的 SQL Server 查询性能分析

-- Which Queries are taking the most time/cpu to execute
SELECT TOP 20
    total_worker_time, total_elapsed_time,
    total_worker_time/execution_count AS avg_cpu_cost, execution_count,
    (SELECT DB_NAME(dbid) + ISNULL('..' + OBJECT_NAME(objectid), '')
        FROM sys.dm_exec_sql_text([sql_handle])) AS query_database,
    (SELECT SUBSTRING(est.[text], statement_start_offset/2 + 1,
        (CASE WHEN statement_end_offset = -1
            THEN LEN(CONVERT(nvarchar(max), est.[text])) * 2
            ELSE statement_end_offset
            END - statement_start_offset) / 2
        )
        FROM sys.dm_exec_sql_text([sql_handle]) AS est) AS query_text,
    total_logical_reads/execution_count AS avg_logical_reads,
    total_logical_writes/execution_count AS avg_logical_writes,
    last_worker_time, min_worker_time, max_worker_time,
    last_elapsed_time, min_elapsed_time, max_elapsed_time,
    plan_generation_num, qp.query_plan
FROM sys.dm_exec_query_stats
    OUTER APPLY sys.dm_exec_query_plan([plan_handle]) AS qp
WHERE [dbid] >= 5 AND DB_NAME(dbid) IS NOT NULL
  AND (total_worker_time/execution_count) > 100
--ORDER BY avg_cpu_cost DESC;
--ORDER BY execution_count DESC;
ORDER BY total_worker_time DESC;
Run Code Online (Sandbox Code Playgroud)


Mar*_*son 6

就语句文本而言NULL,当从中选择文本时sys.dm_exec_sql_text加密对象text值为NULL

从 中检查encrypted记录的值sys.dm_exec_sql_text