You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何识别Azure Premium P2数据库中消耗DTU最多的查询?

定位Azure SQL数据库DTU居高不下的排查步骤

针对你遇到的Premium P2数据库DTU居高不下,但性能概览未发现明显问题的情况,可以通过以下步骤逐步定位原因:

  • 实时排查当前运行的高消耗会话
    由于sys.dm_db_resource_stats是5分钟粒度的聚合数据,可能无法捕捉瞬时高消耗的任务,用以下查询查看当前正在运行的会话,按CPU消耗排序:

    SELECT 
        r.session_id,
        r.status,
        r.command,
        r.cpu_time,
        r.total_elapsed_time,
        r.reads,
        r.writes,
        r.logical_reads,
        s.text AS query_text
    FROM sys.dm_exec_requests r
    CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) s
    WHERE r.session_id <> @@SPID
    ORDER BY r.cpu_time DESC;
    

    重点关注cpu_time、logical_reads数值高的会话,对应的query_text就是当前消耗资源的语句。

  • 分析历史高消耗查询
    查看历史执行的查询中,总CPU、IO消耗最高的语句,即使这些查询当前未运行,也可能是高频或单次消耗过大导致DTU持续高位:

    SELECT 
        TOP 20
        SUBSTRING(s.text, (qs.statement_start_offset/2)+1, 
            ((CASE qs.statement_end_offset 
              WHEN -1 THEN DATALENGTH(s.text) 
              ELSE qs.statement_end_offset 
             END - qs.statement_start_offset)/2)+1) AS query_text,
        qs.total_worker_time AS total_cpu_time,
        qs.total_worker_time/qs.execution_count AS avg_cpu_time,
        qs.total_elapsed_time/qs.execution_count AS avg_duration,
        qs.total_logical_reads/qs.execution_count AS avg_logical_reads,
        qs.execution_count
    FROM sys.dm_exec_query_stats qs
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) s
    ORDER BY qs.total_worker_time DESC;
    

    通过total_cpu_time和execution_count判断是单次高消耗还是高频低消耗的查询导致的资源占用。

  • 通过等待类型定位瓶颈类型
    数据库的等待类型能直接反映资源瓶颈的本质,用以下查询过滤掉无意义的等待类型,聚焦关键等待:

    SELECT 
        wait_type,
        wait_time_ms,
        signal_wait_time_ms,
        wait_time_ms - signal_wait_time_ms AS resource_wait_time_ms,
        waiting_tasks_count
    FROM sys.dm_db_wait_stats
    WHERE wait_type NOT IN ('SLEEP_TASK', 'WAITFOR', 'LOGMGR_QUEUE', 'CHECKPOINT_QUEUE', 'LAZYWRITER_SLEEP')
    ORDER BY wait_time_ms DESC;
    

    例如:

    • PAGEIOLATCH_*类等待说明数据IO是瓶颈;
    • CXPACKET等待可能是并行查询的协调问题;
    • RESOURCE_SEMAPHORE等待表示内存资源不足;
    • WRITELOG等待说明日志写入压力大。
  • 检查后台系统维护任务
    自动索引重建、统计信息更新、数据库备份等后台任务也会占用大量DTU,尤其是在业务高峰期运行时:

    SELECT 
        session_id,
        command,
        cpu_time,
        reads,
        writes,
        total_elapsed_time,
        text AS query_text
    FROM sys.dm_exec_requests
    WHERE command IN ('ALTER INDEX', 'UPDATE STATISTICS', 'BACKUP DATABASE')
    ORDER BY cpu_time DESC;
    

    如果发现这类任务在高峰时段运行,建议调整维护窗口到业务低峰期。

  • 细化DTU瓶颈指标
    DTU是CPU、数据IO、日志写入三个指标的最大值,用以下查询查看每个时间点哪个指标是DTU的主要消耗项:

    SELECT 
        end_time,
        avg_cpu_percent,
        avg_data_io_percent,
        avg_log_write_percent,
        avg_memory_usage_percent,
        dtu_limit,
        (SELECT MAX(v) FROM (VALUES (avg_cpu_percent), (avg_data_io_percent), (avg_log_write_percent)) AS value(v)) AS max_dtu_used
    FROM sys.dm_db_resource_stats
    ORDER BY end_time DESC;
    

    找到持续接近100%的指标,就能确定DTU居高不下的核心原因。

内容的提问来源于stack exchange,提问作者markzzz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 04:21:24