Explain Analyze
本文档介绍了如何在 StarRocks 中获取和分析基于文本的 Query Profile。 它将帮助您了解查询性能并找到优化 SQL 查询的方法。
使用 ANALYZE PROFILE 分析现有查询的 Profile
要分析集群中现有(历史或正在运行的)查询的基于文本的 Profile,您首先需要使用 SHOW PROFILELIST 语句来获取查询的摘要。 此命令列出所有已成功完成、因错误而失败以及仍在运行(超过 10 秒且尚未完成)的查询。 通过此语句,您可以获得相应的 Query ID 以供后续分析。 语法如下
SHOW PROFILELIST [LIMIT <num>];
示例
SHOW PROFILELIST;
SHOW PROFILELIST LIMIT 5;
输出
+--------------------------------------+---------------------+-------+----------+-----------------------------------------------------------------------------------------------------------------------------------+
| QueryId | StartTime | Time | State | Statement |
+--------------------------------------+---------------------+-------+----------+-----------------------------------------------------------------------------------------------------------------------------------+
| a40456b2-8428-11ee-8d02-6a32f8c68848 | 2023-11-16 10:34:18 | 21ms | Finished | SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES\n WHERE ROUTINE_TYPE="FUNCTION" AND ROUTINE_SCHEMA = "None" |
| a3fc4060-8428-11ee-8d02-6a32f8c68848 | 2023-11-16 10:34:17 | 39ms | Finished | select TABLE_NAME, COLUMN_NAME from information_schema.columns\n where table_schema = 'Non ... |
| a3f7d38d-8428-11ee-8d02-6a32f8c68848 | 2023-11-16 10:34:17 | 15ms | Finished | select connection_id() |
| a3efbd3b-8428-11ee-8d02-6a32f8c68848 | 2023-11-16 10:34:17 | 16ms | Finished | select connection_id() |
| a26ec286-8428-11ee-8d02-6a32f8c68848 | 2023-11-16 10:34:15 | 269ms | Error | EXPLAIN ANALYZE SELECT c_nation, s_nation, year(lo_orderdate) AS year , SUM(lo_revenue) AS revenue FROM lineorder_flat WHERE ... |
+--------------------------------------+---------------------+-------+----------+-----------------------------------------------------------------------------------------------------------------------------------+
获得 Query ID 后,您可以使用 ANALYZE PROFILE 语句继续进行 Query Profile 分析。 语法如下
ANALYZE PROFILE FROM '<Query_ID>' [, <Node_ID> [, ...] ]
Query_ID
: 查询对应的ID,从SHOW PROFILELIST
语句获得。Node_ID
: Profile 节点 ID。 对于指定了 ID 的节点,StarRocks 会返回这些节点的详细指标信息。 对于未指定 ID 的节点,StarRocks 仅返回摘要信息。
Profile 包括以下部分
- Summary: Profile 的摘要信息。
- QueryID
- 版本信息
- 查询状态,包括
Finished
,Error
, 和Running
。 - 总查询时间。
- 内存使用情况
- CPU 使用率最高的 Top 10 节点。
- 内存使用率最高的 Top 10 节点。
- 与默认值不同的会话变量。
- Fragments:显示每个 Fragment 中每个节点的指标。
- 每个节点的时间、内存使用情况、成本估算信息和输出行数。
- 时间使用率百分比超过 30% 的节点以红色突出显示。
- 时间使用率百分比超过 15% 且小于 30% 的节点以粉红色突出显示。
示例 1:查询 Query Profile,不指定节点 ID。
示例 2:查询 Query Profile 并将节点 ID 指定为 0
。 StarRocks 返回节点 ID 0
的所有详细指标,并突出显示高使用率的指标,以便于问题识别。
此外,以上方法还支持 Runtime Query Profile 的显示和分析,即为正在运行的查询生成的 Profile。 启用 Query Profile 功能后,您可以使用此方法获取当前运行超过 10 秒的查询的 Profile。
与已完成查询的 Profile 相比,正在运行查询的基于文本的 Query Profile 包含以下信息
-
Operator 状态
- ⏳:未启动的 Operator。 由于依赖关系,这些 Operator 可能尚未开始执行。
- 🚀:正在运行的 Operator。
- ✅:已完成执行的 Operator。
-
总体进度:根据
已完成执行的 Operator 数量 / Operator 总数
计算。 由于缺少有关数据行的详细信息,此值可能会略有失真。 -
Operator 进度:根据
已处理的行数 / 总行数
计算。 如果无法计算总行数,则进度显示为?
。
示例
使用 EXPLAIN ANALYZE 模拟查询以进行 Profile 分析
StarRocks 提供了 EXPLAIN ANALYZE 语句,允许您直接模拟和分析查询的 profile。 语法如下
EXPLAIN ANALYZE <sql_statement>
执行 EXPLAIN ANALYZE
时,StarRocks 默认会为当前会话启用 Query Profile 功能。
目前,EXPLAIN ANALYZE
支持两种类型的 SQL 语句:SELECT 语句和 INSERT INTO 语句。 您只能模拟和分析 StarRocks 默认 catalog 中内部表的 INSERT INTO 语句的 Query Profile。 请注意,在模拟和分析 INSERT INTO 语句的 Query Profile 时,不会加载实际数据。 默认情况下,将中止导入事务,以确保在分析期间不会对数据进行意外更改。
示例 1:模拟和分析 SELECT 语句。 查询结果将被丢弃。
示例 2:模拟和分析 INSERT INTO 语句。 加载事务将被中止。
局限性
EXPLAIN ANALYZE INSERT INTO
语句仅支持默认 catalog 中的表。- 为了获得更好的视觉效果,输出文本包含 ANSI 字符以提供颜色、突出显示和其他功能。 建议使用 MyCLI 客户端。 对于不支持 ANSI 功能的客户端,例如 MySQL 客户端,可能会出现一些轻微的显示错乱。 通常,它们不会影响使用。 例如