我最初在 Twitter #sqlhelp 中将此作为一个不同的问题发布,但想以不同的方式发布在这里。
我正在尝试使用 DMV dm_exec_query_stats、dm_exec_cached_plans和dm_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) 我有一项工作每 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)