小编Dia*_*ane的帖子

对连接到 sys.databases 的查询统计和执行计划运行针对 DMV 的查询

我最初在 Twitter #sqlhelp 中将此作为一个不同的问题发布,但想以不同的方式发布在这里。

我正在尝试使用 DMV dm_exec_query_statsdm_exec_cached_plansdm_exec_sql_text以及最初的sys.databases创建一个跟踪各种统计数据(例如读取、写入、CPU、执行计数等)性能最差的语句的作业。

发生的情况是,这个查询有时(并非总是)在繁忙的服务器上运行需要超过 8 分钟,但是一旦我删除了对sys.databases的连接,只需要 9 秒。这段时间的大部分时间是 CPU 时间,几乎没有等待,没有阻塞,没有扫描,只有 13406 次逻辑读取和 1562 次 lob 读取。

所以我想知道的是,为什么加入 sys.databases导致巨大的性能下降?为什么不一致?

发生的情况是,当我运行以下测试查询时,有时会无缘无故地花费超过 8 分钟,而其他时间则在 11 秒内完成。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET NOCOUNT ON;
DECLARE @snapshot_timeoffset AS datetimeoffset(3) = CAST(SYSDATETIMEOFFSET() AS datetimeoffset(3));

SELECT
    @snapshot_timeoffset AS [snapshot_timeoffset]
    ,db.name AS [database_name]  
    ,OBJECT_SCHEMA_NAME(st.objectid, st.dbid) [schema_name] 
    ,OBJECT_NAME(st.objectid, st.dbid) [object_name]   
    ,cp.objtype
    ,cp.usecounts
    ,cp.refcounts
    -- find the offset of the actual …
Run Code Online (Sandbox Code Playgroud)

performance sql-server execution-plan dmv query-performance

6
推荐指数
2
解决办法
539
查看次数

运行 dm_exec_query_stats 性能不佳

我有一项工作每 5 分钟执行一次,从 DMV 收集两年多没有变化的信息,通常运行时间不到一分钟。

突然从上周开始,在没有部署任何更改的情况下,该作业开始在 15 台服务器中仅 1 台上运行超过 12 分钟。查看执行计划,没有任何变化,但读取、写入、CPU 时间和行计数都变了提高了一个数量级。插入的行数也没有太大变化。

这可能是底层系统表中的错误统计信息吗?如果是这样,如何解决这个问题,因为我无法在任何 DMV 上运行 UPDATE STATISTICS,而 DMV 只提供有关对象不存在的消息。

这是有问题的代码:

SELECT
    ISNULL(DB_NAME(st.dbid), 'NULL') AS [DatabaseName]  
    ,ISNULL(OBJECT_SCHEMA_NAME(st.objectid, st.dbid), 'NULL') AS [SchemaName] 
    ,ISNULL(OBJECT_NAME(st.objectid, st.dbid), 'NULL') AS [ObjectName]   
    ,cp.objtype AS [ObjectType]
    ,qs.statement_start_offset AS [StatementStartOffset]
    ,qs.statement_end_offset AS [StatementEndOffset]
    ,qs.query_hash AS [QueryHash]
    ,qs.query_plan_hash AS [QueryPlanHash]
    ,qs.sql_handle AS [SQLHandle]
    ,qs.plan_handle AS [PlanHandle]
    ,qs.plan_generation_num AS [PlanGenerationNumber]
    ,cp.usecounts AS [UseCounts]
    ,cp.refcounts AS [RefCounts]
    -- find the offset of the actual statement being executed
    ,SUBSTRING(st.text, 
            CASE
                WHEN qs.statement_start_offset …
Run Code Online (Sandbox Code Playgroud)

performance sql-server dmv query-performance

5
推荐指数
1
解决办法
1193
查看次数