如何统计Azure SQL Server及MI中用户的数据消耗/提取量?
解答Azure SQL数据消耗量相关问题
1. 如何衡量Azure SQL Server数据库中用户的数据消耗量?
要衡量用户的数据消耗量,核心是追踪用户执行的查询所读取、返回的数据量,通常可以从逻辑读取量、物理读取量、返回行数这几个关键维度评估:
- 逻辑读取:反映从内存缓存或磁盘读取的数据页总数,能体现查询实际访问的数据规模
- 物理读取:代表直接从磁盘读取的数据量,反映缓存未命中时的真实磁盘消耗
- 返回行数:就是用户实际提取、获取到的数据条数,最直接体现用户的数据提取量
这类数据主要靠SQL Server内置的动态管理视图(DMV)和监控工具来捕获统计。
2. 在Azure SQL Server MI环境下,单个用户的数据消耗/提取量查询方式
① 使用SSMS的查询语句或UI界面?
完全可以,SSMS是这类场景下的常用工具,分两种操作方式:
查询语句(更适合统计历史/批量数据)
通过组合sys.dm_exec_query_stats、sys.dm_exec_sessions、sys.dm_exec_sql_text这些DMV,能关联用户会话与执行的查询,精准统计数据消耗。比如下面的脚本可以统计指定用户的总返回行数、逻辑读取量:
SELECT s.login_name AS [用户名], SUM(qs.total_rows) AS [总返回行数], SUM(qs.total_logical_reads) AS [总逻辑读取量(数据页)], COUNT(DISTINCT qs.sql_handle) AS [执行查询总数] FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st JOIN sys.dm_exec_sessions s ON qs.session_id = s.session_id WHERE s.login_name = '你的目标用户名' -- 替换为要查询的用户 GROUP BY s.login_name ORDER BY SUM(qs.total_rows) DESC;
如果要实时追踪用户当前正在执行的查询消耗,用这个脚本:
SELECT s.login_name, r.command AS [查询类型], r.total_elapsed_time AS [已执行时长(毫秒)], r.logical_reads AS [当前逻辑读取量], r.reads AS [当前物理读取量], st.text AS [执行的SQL语句] FROM sys.dm_exec_requests r JOIN sys.dm_exec_sessions s ON r.session_id = s.session_id CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) st WHERE s.login_name = '你的目标用户名';
SSMS UI界面(适合实时快速查看)
- 右键你的Azure SQL MI服务器,打开活动监视器
- 切换到「进程」标签,在筛选框中输入目标用户名,就能看到该用户当前会话的逻辑读取、物理读取、返回行数等实时数据
- 也可以在「资源等待」标签,间接查看用户查询的资源消耗状态
不过UI仅支持实时状态查看,历史数据统计还是得靠DMV查询。
② Azure门户?
Azure门户也能实现用户级的数据消耗监控,但需要提前配置好相关诊断设置:
Azure Monitor指标面板
- 进入你的Azure SQL托管实例资源页
- 左侧菜单选择「监控→指标」
- 在指标下拉框中选择
Logical Reads、Physical Reads等指标,添加筛选器选择Login Name维度,指定目标用户名,就能查看该用户的资源消耗趋势图表
Azure Monitor日志(Log Analytics)
- 先在托管实例的「安全性→审核」中开启审核,将日志发送到Log Analytics工作区;或者在「监控→诊断设置」中开启查询存储日志收集
- 进入对应的Log Analytics工作区,用Kusto查询语言统计用户数据消耗,比如:
SQLAuditLogs where TimeGenerated > ago(7d) -- 查询近7天数据 where login_name == '你的目标用户名' summarize 总逻辑读取量 = sum(logical_reads), 总返回行数 = sum(row_count) by bin(TimeGenerated, 1h) -- 按小时聚合
内容的提问来源于stack exchange,提问作者Venkat




