本文介绍EMR Serverless StarRocks提供的业务洞察内容,并通过示例阐明其潜在的应用场景。该业务洞察提供了前一天(T+1)的数据,并包括查询洞察、导入洞察、数据洞察、Compaction洞察以及缓存洞察。
查看业务洞察
-
进入EMR Serverless StarRocks实例列表页面。
-
在左侧导航栏,选择。
-
在顶部菜单栏处,根据实际情况选择地域。
单击目标实例ID。
单击业务洞察页签。
在业务洞察页面,您可以查看查询洞察、导入洞察、数据洞察、Compaction洞察以及缓存洞察。
查询洞察
该页面展示了查询耗时、DB Lock、SQL查询分析和参数化SQL分析部分内容。您可以通过选择特定的日期、SQL类型和数据库目录,来查看TOP SQL指标。
支持以下SQL类型:
DML:用于数据的查询和变更操作。例如,SELECT、UPDATE、DELETE等语句。
DDL:用于定义和修改数据结构的语句。例如,CREATE、ALTER等。
其他:包括非DML和DDL类的SQL命令。例如,SHOW等辅助命令语句。
查询耗时
查询耗时数据是基于每日审计数据进行统计分析。
以P99查询耗时(Query Latency P99)为例,这是性能监控中的一个重要指标,用于衡量系统响应时间的分布情况。具体而言,P99表示99%的请求能够在该时间内得到响应。此指标对于评估服务质量和用户体验至关重要。
通过监控P99耗时,可以深入了解大多数用户实际体验到的服务响应速度。如果发现P99耗时过高,则可能需要增加计算资源或优化查询逻辑,以提升处理效率。
通过展示最近七天的查询耗时数据,能够提前识别实例潜在的性能风险,从而避免对服务造成重大影响。

DB Lock
DB Lock功能用于监控和分析数据库访问过程中出现的锁竞争状况,特别是在多个事务尝试同时访问或修改同一数据资源时。为了确保数据的一致性和完整性,数据库会采用锁机制来控制对特定数据行或表的并发访问。如果某事务长时间等待获取锁,则会影响整体系统的响应速度和服务质量。通过DB Lock数据,可以辅助分析性能问题。
SQL查询分析
该部分内容是对StarRocks执行的SQL语句的查询时间、CPU消耗以及内存消耗等维度进行排序,从而获取TOP SQL并展现相应的执行指标。您可以基于这些指标对潜在的性能问题进行优化。 例如,可以从慢SQL Top10中查看指定日期执行时间最长的10条SQL语句。然后,根据Profile查询分析提供的详细信息来优化这些慢执行的SQL语句,Profile分析详情请参见Query Profile介绍。
报表主要字段说明如下。
字段名称 | 说明 |
查询ID | StarRocks中每次SQL执行产生的唯一标识符。每一次SQL执行都会生成新的ID。 |
用户 | 执行SQL的StarRocks数据库用户。 |
查询时间 | SQL执行过程中消耗的时间。单位:ms。 |
CPU执行时间 | SQL执行过程中消耗的CPU时间,是所有参与执行的CPU核数的CPU时间汇总。单位:ns。 |
内存占用 | SQL执行过程中消耗的内存。单位:bytes。 |
扫描字节数 | SQL执行过程中访问的数据量大小。单位:bytes。 |
扫描行数 | SQL执行过程中访问的数据行数。 |
返回行数 | SQL执行后返回的结果行数。 |
SQL语句 | 被执行的具体SQL语句。 |
参数化SQL分析
参数化SQL是指将SQL语句中的常量替换成?参数,同时保留原有语法结构,并删除注释、调整空格,生成新的SQL语句。参数化SQL将原始SQL的语法结构映射成相同的参数化SQL语句,有助于对同类型的SQL进行综合分析。
例如,对于以下两个SQL语句,当它们经过参数化处理后,它们属于同一类SQL。
原始SQL
SELECT * FROM orders WHERE customer_id=10 AND quantity>20 SELECT * FROM orders WHERE customer_id=20 AND quantity>100参数化后SQL
SELECT * FROM orders WHERE customer_id=? AND quantity>?
参数化SQL分析从SQL执行频次、SQL执行总耗时、SQL耗时离散度、SQL CPU资源总消耗、SQL内存资源总消耗、SQL执行失败频次等维度进行排序,获取相应的TOP SQL并展现相关指标。
通过参数化SQL分析,您可以:
获取StarRocks数据库整体的SQL执行情况。
通过优化执行次数较多、执行时间较长以及CPU和内存消耗较多的SQL,以获取更大的优化收益。
通过查询时间变异系数来衡量SQL执行的时间稳定性,可以发现潜在的性能问题。例如,同类SQL执行时间变长可能是由于数据倾斜、资源不足导致的pending等原因。
涉及字段说明如下。
字段
说明
参数化SQL ID
参数化SQL的哈希值,用于标记参数化SQL。
查询时间变异系数
SQL查询执行时间标准差与其平均值的比值。通常变异系数越大,代表同类SQL每次执行的时间差别越大。
执行次数
参数化SQL的总执行次数。
参数化SQL语句
参数化后的SQL语句。
通过执行失败次数查找对应的SQL失败原因,来发现潜在的问题。
涉及字段说明如下。
字段
说明
参数化SQL ID
参数化SQL的哈希值,用于标记参数化SQL。
执行失败次数
参数化SQL执行失败的次数。
执行次数
参数化SQL的执行总次数。
参数化SQL语句
参数化后的SQL语句。
导入洞察
该页面展示导入任务的统计信息,并从多个角度对导入任务进行分析。
目前系统仅能支持统计和分析存算一体实例下的导入任务情况。
Too many versions场景
导入频率过高的数据是基于“too many versions”日志的统计分析得出的。当Compaction Score超过1000时,系统将会报告错误,StarRocks会提示“Too many versions”。为了解决此问题,您可以降低导入的并发量和频率。
Top分析
Top导入热表潜在小文件分析
针对表级别的数据导入情况,系统将会对每个表的所有导入任务生成的数据文件进行深入分析,以评估其潜在的小文件问题严重程度,并据此计算出一个影响得分。根据该得分从高至低排序,选出Top 20个受小文件问题影响最大的表。小文件问题的存在可能导致查询性能下降以及Compaction操作效率降低。针对此问题,建议您:
结合表的实际数据规模,科学合理地选择分区与分桶的数量,以有效避免小文件问题的发生。
通过适度增大批量处理的规模,可以在提高整体数据处理吞吐量的同时,有效减少对象存储中的小文件数量。
虽然Compaction能够整合数据文件、提升系统性能,但其运行过程中会占用一定的系统资源。因此,在资源较为紧张的情况下,建议适当调整Compaction频率以平衡资源使用效率。
以下是用于评估小文件影响得分的具体算法:
主键表:计算公式为
写入文件总数÷写入文件的平均大小。若平均文件大小较小,同时文件数量较多,则表明此类表的小文件问题潜在影响也越大。非主键表:计算公式改为
写入文件总数平均÷写入单个文件所需时间。当平均写入文件耗时较短,同时文件数量较大时,此类表的小文件问题潜在影响也越大。
通过上述算法,我们可以量化表的小文件问题,从而有针对性地对Top 20的表进行优化处理,以改善整体集群性能。
主要字段说明如下。
字段 | 说明 |
表集合 | 记录导入任务可能同时写入的所有相关表信息,表现为一个包含多个表的集合。 |
表类型 | 用于区分不同类型的表,主要分为主键表和非主键表两类。非主键表包括明细表、聚合表和更新表。 |
小文件影响得分 | 通过算法评估潜在小文件问题的影响得分,评分值越高代表潜在的小文件问题越严重。 |
更新的数据分桶数 | 统计在导入任务过程中涉及到的需要更新的Tablet的总量。 |
写入文件数 | 写入的Segment文件的总数量。 |
平均写文件大小 | 总写入数据大小除以写入文件总数,用以表示每个文件的平均写入数据量。 |
平均写文件耗时 | 文件写入总耗时除以文件总数,反映了每次文件写入操作的平均所需时间。 |
Top导入热表分析
按表粒度对导入任务数量进行排序并选取Top 20的表,这些表的导入任务执行最为频繁且涉及的数据导入事务最多。
导入热节点分析
可以通过对各节点的统计数据进行导入,来分析数据的均衡度。例如,您可以从写入总大小指标分析各个broker的写入是否均衡。
数据洞察
该页面展示数据表的查询热度、查询SQL类型、数据分布均衡度和近期90天未访问的表等相关的指标,为优化数据表提供判断依据。主要指标如下表所示。
指标 | 说明 |
SQL执行次数 | 是指包含这张表的SQL的总执行次数。通常表的执行次数越多,越需要对表设计进行精心的优化,以改善Starrocks实例的使用。 |
关联的参数化SQL个数 | 这里指的是这张表关联了几个参数化SQL。您可以分析表的查询SQL类型模式来优化表的设计。更进一步的,您可以从不同的查询类型中识别共性,看是否需要创建物化视图来加速对这张表中数据的查询。 |
Tablet数据大小变异系数 | 是指同一个分区内的tablet数据大小变异系数,代表了一个表的数据的tablet分布均衡程度。计算方式为:同一个分区内tablet数据大小的标准差除以平均值。一般来说,变异系数越大,这个分区越有可能存在数据倾斜的情况。 |
缓存洞察
本文说明缓存洞察中 DataCache 相关指标的统计口径。缓存洞察基于 Query Profile 解析得到内表和外表的扫描指标,并在此基础上计算缓存读取量、逻辑远程读取量、物理远程读取量,以及对应的缓存命中率。
该功能暂不适用于存算一体版实例。
基础 Profile 指标
内表指标
内表指 StarRocks 存算分离内表。一次扫描会先访问 PageCache 内存缓存,PageCache 未命中后再访问 DataCache 本地磁盘缓存,DataCache 未命中后读取 OSS。
Profile 指标 | 含义 |
| PageCache 命中的 page 数。 |
| 本次 scan 访问的总 page 数。 |
| PageCache 未命中后,BE 向 DataCache 请求读取的压缩 page 逻辑字节数。 |
|
|
| DataCache 未命中后,从 OSS 远端存储实际读取的字节数。 |
PageCache 命中字节计算如下:
指标 | 计算公式 |
| 64KB × |
外表指标
外表指 Hive、Iceberg、Hudi 等外部表扫描。外表使用 DataCache 作为本地缓存。
Profile 指标 | 含义 |
| 应用层 scan 读取的总字节数,可理解为外表扫描需要的数据量。 |
| 从 DataCache 本地缓存读取的字节数。 |
| 从底层文件系统或远端存储读取的字节数。 |
逻辑读取与物理读取
读取远端存储时可能存在读放大。例如查询只需要读取较小的数据范围,但底层文件格式、缓存填充、block 对齐或预读等机制可能导致实际向远端存储发起的读取量更大。因此缓存洞察同时展示两类远程读取量:
口径 | 含义 | 用途 |
逻辑远程读取量 | 按扫描实际需要的数据口径计算的缓存未命中量。 | 用于衡量从查询视角看还有多少数据没有被缓存命中。 |
物理远程读取量 | 实际从 OSS 等远端存储读取的字节数。 | 用于衡量真实远端 IO 和远端存储访问成本。 |
命中率计算
内表
内表缓存读取量同时包含 PageCache 命中和 DataCache 本地盘命中:
指标 | 计算公式 |
缓存读取量 |
|
逻辑远程读取量 |
|
物理远程读取量 |
|
逻辑命中率 | 缓存读取量 / (缓存读取量 + 逻辑远程读取量) |
物理命中率 | 缓存读取量 / (缓存读取量 + 物理远程读取量) |
外表
外表使用 DataCache 作为本地缓存,计算公式如下:
指标 | 计算公式 |
缓存读取量 |
|
逻辑远程读取量 |
|
物理远程读取量 |
|
逻辑命中率 | 缓存读取量 / (缓存读取量 + 逻辑远程读取量) |
物理命中率 | 缓存读取量 / (缓存读取量 + 物理远程读取量) |
看板展示
卡片
卡片用于展示当天核心指标,以及相比昨天的变化。内表和外表分别展示:
指标 | 含义 |
缓存读取数据量 | 命中本地缓存的数据量。内表包含 PageCache 命中量和 DataCache 本地盘命中量;外表为 DataCache 命中量。 |
逻辑远端读取数据量 | 按扫描逻辑需要口径计算的远端未命中数据量。 |
物理远端读取数据量 | 实际从 OSS 等远端存储读取的数据量。 |
逻辑命中率 | 基于缓存读取量和逻辑远端读取量计算。 |
物理命中率 | 基于缓存读取量和物理远端读取量计算。 |
命中率较昨日提升 | 当天命中率与昨天命中率的差值。逻辑命中率和物理命中率分别计算。 |
趋势图
趋势图用于观察缓存效果随时间变化,支持最近 30 天、最近 7 天和最近 24 小时等时间范围。图中包含:
指标 | 含义 |
内表缓存读取数据量 | 内表 PageCache 命中量 + DataCache 本地盘命中量。 |
内表远端读取数据量 | 内表逻辑远程读取量和物理远程读取量。 |
外表缓存读取数据量 | 外表 DataCache 命中量。 |
外表远端读取数据量 | 外表逻辑远程读取量和物理远程读取量。 |
内表命中率 | 内表按逻辑口径和物理口径分别计算的命中率。 |
外表命中率 | 外表按逻辑口径和物理口径分别计算的命中率。 |
明细分析
表维度
表维度展示每张表的缓存访问情况,用于定位远端读取量最高或缓存命中率较低的表。
字段 | 含义 |
表类型 | 内表或外表。 |
数据目录 | 被扫描的数据表的数据目录。 |
数据库 | 被扫描的数据表。 |
数据表 | 被扫描的数据表。 |
缓存读取总量 | 该表命中缓存的数据量。 |
逻辑远程读取总量 | 该表按逻辑口径计算的远端读取量。 |
物理远程读取总量 | 该表实际从 OSS 等远端读取的数据量。 |
访问次数 | 该表被扫描的次数。 |
表远端读取量 Top100 按物理远程读取量排序,同时展示逻辑远程读取量和物理远程读取量。内表 Top100 和外表 Top100 分开统计。
SQL 维度
SQL 维度展示单条 SQL 的缓存访问情况,用于定位远端读取量较高的具体查询。
字段 | 含义 |
SQL ID | 查询标识。 |
SQL 语句 | 原始 SQL。 |
缓存读取总量 | 该 SQL 命中缓存的数据量。 |
逻辑远程读取总量 | 该 SQL 按逻辑口径计算的远端读取量。 |
物理远程读取总量 | 该 SQL 实际从 OSS 等远端读取的数据量。 |
查询时长 | 该 SQL 的执行时长。 |
表名 | 该 SQL 查询的所有底表表名。 |
SQL 远端读取量 Top100 按物理远程读取量排序,同时展示逻辑远程读取量和物理远程读取量。
参数化 SQL 维度
参数化 SQL 维度会将相同结构、不同参数值的 SQL 聚合到同一个指纹下,用于发现稳定重复出现的远端读取热点。
字段 | 含义 |
SQL 指纹 | 参数化后的 SQL 标识。 |
参数化 SQL | 去除具体参数后的 SQL 模板。 |
缓存读取总量 | 该 SQL 指纹命中缓存的数据量。 |
逻辑远程读取总量 | 该 SQL 指纹按逻辑口径计算的远端读取量。 |
物理远程读取总量 | 该 SQL 指纹实际从 OSS 等远端读取的数据量。 |
查询次数 | 该 SQL 指纹对应的 SQL 数量。 |
总查询时长 | 该 SQL 指纹的对应 SQL 总执行时长。 |
表名 | 该 SQL 指纹查询的所有底表表名。 |
参数化 SQL 远端读取量 Top100 按物理远程读取量排序,同时展示逻辑远程读取量和物理远程读取量。
字段口径对照
展示字段 | 内表口径 | 外表口径 |
缓存读取量 |
|
|
逻辑远程读取量 |
|
|
物理远程读取量 |
|
|
逻辑命中率 | 缓存读取量 / (缓存读取量 + 逻辑远程读取量) | 缓存读取量 / (缓存读取量 + 逻辑远程读取量) |
物理命中率 | 缓存读取量 / (缓存读取量 + 物理远程读取量) | 缓存读取量 / (缓存读取量 + 物理远程读取量) |
注意事项
compressedBytesReadRemote和FSIOBytesRead反映实际远端读取量,可能受到 block 填充、对齐和预读影响,通常适合用于分析远程读取成本。逻辑远程读取量更接近查询实际需要但未命中缓存的数据量,适合用于分析缓存效果。