DBLOG
» WTF
Toggle navigation
DBLOG
主页
OCM
1、概览
2、数据导入导出
3、GaussDB(DWS)数据库管理
4、数据库调优与开发实践
5、湖仓一体
6、开发应用
7、集群管理
8、巡检和维运维
About Me
归档
标签
1、SQL执行计划解析
无
2025-05-22 15:09:02
0
0
0
admin
# Explain 执行 `EXPLAIN VERBOSE` 命令可以收集 SQL 语句(如 SELECT/UPDATE/INSERT/DELETE/MERGE INTO/CREATE TABLE AS)的详细计划信息(语句不会真正执行)。 ```sql EXPLAIN VERBOSE SELECT sum(l_extendedprice * (1 - l_discount)) AS revenue FROM orders INNER JOIN lineitem ON l_orderkey = o_orderkey WHERE o_orderdate >= '1994-01-01'::date AND o_orderdate < '1994-01-01'::date + interval '1 year'; ``` 执行 `EXPLAIN PERFORMANCE` 命令可以收集 SQL 语句(如 SELECT/UPDATE/INSERT/DELETE/MERGE INTO/CREATE TABLE AS)的详细执行信息。 ```sql EXPLAIN PERFORMANCE SELECT sum(l_extendedprice * (1 - l_discount)) AS revenue FROM orders INNER JOIN lineitem ON l_orderkey = o_orderkey WHERE o_orderdate >= '1994-01-01'::date AND o_orderdate < '1994-01-01'::date + interval '1 year'; ``` --- # Explain 执行计划 - VERBOSE 信息 `VERBOSE` 选项会打印详细的计划信息,其中 Plan Information 包含以下信息: - **E-rows** 算子估算的输出行数。 - **E-distinct** 表示单 DN 上算子的 distinct 估计值。 - **E-memory** DN 上每个算子估算的内存使用量,只有 DN 上执行的算子会显示。某些场景会在估算的内存使用量后使用括号显示该算子在内存资源充足下可以自动扩展的内存上限。 - **E-width** 每个算子输出元组的估算宽度。 - **E-costs** 每个算子估算的执行代价。 ---  --- # Explain 执行计划 - PERFORMANCE 信息 (1) **PERFORMANCE** 选项可以打印执行中的所有相关信息,包括: - **Plan Information** 以表格形式显示整个执行过程中每个算子的执行概要信息。 - **SQL Diagnostic Information** SQL 自诊断信息。 - **Predicate Information** 算子计算信息,如 scan 的 filter 条件,join 的 join 条件。 - **Memory Information** 算子计算过程中内存消耗信息。 - **Targetlist Information** 算子输出列信息。 - **Datanode Information** 算子在每个 DN 上执行的详细信息。 - **User Define Profiling** 性能 Profile 信息。 - **Query Summary** 查询执行的概要信息。 **性能分析主要关注以下四部分信息**: Plan Information / SQL Diagnostic Information / Datanode Information / Predicate Information 在大型集群下,对于复杂 SQL,建议使用 `EXPLAIN ANALYZE` 打印概要的实际执行信息,以避免打印各节点信息过多导致执行计划过长。 --- # Explain 执行计划 - PERFORMANCE 信息 (2) **Plan Information** 相比 `VERBOSE` 选项生成的执行计划,新增实际执行的相关信息: - **A-time** 算子的实际执行时间,在 DN 上的输出由 [] 括起来,包含逗号分割的两个值,分别表示此算子在不同 DN 上执行的最短时间和最长时间。 - **A-row** 算子的实际输出的元组数,为各个 DN 上算子输出的元组数的总和。 - **Peak Memory** 算子运行过程中消耗的内存峰值,在 DN 上的输出由 [] 括起来,包含逗号分割的两个值,分别表示此算子在不同 DN 上执行的最小内存消耗和最大内存消耗。 - **A-width** 算子每行元组的实际宽度,仅涉及重内存使用算子。 ---  --- # Explain 执行计划 - PERFORMANCE 信息 (3) 三种计划类型: - **FQS(fast query shipping)计划** CN 直接将原语句下发到 DN,各 DN 单独执行,并将执行结果在 CN 上进行汇总。 - **Stream 计划** CN 根据原语句生成计划并将计划下发给 DN 进行执行,各 DN 执行过程中使用 Stream 算子进行数据交互。 - **Remote Query 计划** CN 生成计划后,将部分原语句下发到 DN,各 DN 单独执行,执行后将结果发送给 CN,CN 执行剩余计划。 **示例**: ```sql CREATE TABLE tt01(c1 int, c2 int) DISTRIBUTE BY hash(c1); CREATE TABLE tt02(c1 int, c2 int) DISTRIBUTE BY hash(c2); CREATE FUNCTION unship_func(integer, integer) returns integer AS 'SELECT $1+$2;' LANGUAGE SQL volatile returns null on null input; -- ① FQS EXPLAIN (VERBOSE OFF) SELECT * FROM tt01, tt02 WHERE tt01.c1 = tt02.c2; -- ② Stream EXPLAIN (COSTS OFF) SELECT * FROM tt01, tt02 WHERE tt01.c1 = tt02.c1; -- ③ Remote Query EXPLAIN (COSTS OFF) SELECT unship_func(tt01.c2, tt02.c2) FROM tt01, tt02 WHERE tt01.c1 = tt02.c1; ``` --- # Explain 执行计划 - PERFORMANCE 信息 (4)  --- # Explain 执行计划 - PERFORMANCE 信息 (5) **DataNode Information** 描述算子在各 DN 的执行时间、CPU、Buffer 的使用情况: - **执行时间 (actual time)** 如果这个值在各个 DN 上存在较大差异,可初步判断存在计算倾斜(各个 DN 上承担的计算量差异过大)。 - **输出元组数 (rows)** 结合执行时间进一步佐证是否存在计算倾斜。 - **Buffer 命中率 (hit)** 主要针对 Scan 算子作数据扫描时。从性能角度来说,buffer 命中率越高越好,需要增大集群的 `shared_buffers`(行存)、`cstore_buffers`(列存)配置参数的取值。 - **CPU 的执行 cycle** 在算子执行期间,执行所消耗的 CPU cycle。 --- # Explain 执行计划 - PERFORMANCE 信息 (6) **User Define Information** 描述算子执行中关键动作的性能打桩信息: - **Coordinate get datanode connection** CN 和 DN 建立连接,Streaming Gather 算子。 - **Datanode build connection** DN 和 DN 建立连接,非 Local Streaming 算子。 - **列存单元元数据加载** - **列存数据加载** - **列存数据解压** - **列存的 min/max check** - **列存场景的 Batch 加载** - **列存算子上的投影和过滤计算** - 低效自定义函数会导致这一步耗时过长。 --- # Explain 执行计划 - PERFORMANCE 信息 (7) **Memory Information**,内存使用信息这部分显示的是整个计划中会将内存的使用情况打印出来的算子的内存使用信息: - **内存信息** - 算子峰值内存(peak memory) - 优化器预估的内存(estimate memory) - 控制内存(control memory) - 估算内存使用(operator memory) - 执行时实际宽度(width) - 内存使用自动扩展次数(auto spread num) - **下盘信息** - 是否提前下盘(early spilled) - 重复下盘次数(spill Time(s)) - 内外表下盘分区数(inner/outer partition spill num) - 下盘文件数(temp file num) - 下盘数据量及最小和最大分区的下盘数据量(written disk IO [min, max]) --- # Explain 执行计划 - PERFORMANCE 信息 (8) **Query Summary**,这一部分主要打印总的执行时间和网络流量,包括: - 执行器初始化/执行/结束运行时间(CN/DN executor start/run/end time) - CN 接收结果等待时间(Remote query poll time) - 反序列化时间(Deserialize time) - 系统可用内存(System available mem) - 查询最大内存(Query Max mem) - 查询预估内存(Query estimated mem) - 排队时间(Enqueue time) - 解析器运行时间(Parser/Planner runtime) - 查询 ID(Query Id) - 约束 SQL ID(Unique SQL Id) - 约束 SQL HASH(Unique SQL Hash) **SMP 信息**: 1. CPU util: 最大 CPU 数 2. Active statement: 当前语句生成计划时,GaussDB(DWS) 上正在运行的其它语句数 3. Query estimated cpu: 计划的 CPU 使用估计 4. Mem allowed dop: 内存允许的 dop 限制 5. Min non-spill dop: dop 不能超过此限制 6. Initial dop: 初始 dop 7. Final dop: 最终 dop --- # Explain 执行计划 - PERFORMANCE 信息 (9) ```sql EXPLAIN [ ( option [, ...] ) ] statement ``` 其中 option 选项包括: - **ANALYZE [ boolean ] | ANALYSE [ boolean ]** 显示实际运行时间和其他统计数据。 - **VERBOSE [ boolean ]** 显示有关计划的额外信息,例如输出列信息。 - **COSTS [ boolean ]** 包括每个规划节点的估计总成本,以及估计的行数和每行的宽度。 - **CPU [ boolean ]** 打印 CPU 的使用情况的信息。 - **DETAIL [ boolean ]** 打印 DN 上的信息。 - **NODES [ boolean ]** 打印查询执行的节点信息。 - **NUM_NODES [ boolean ]** 打印执行中的节点的个数信息。 - **BUFFERS [ boolean ]** 包括缓冲区的使用情况的信息。 - **TIMING [ boolean ]** 包括实际的启动时间和花费在输出节点上的时间信息。 - **PLAN [ boolean ]** 是否将执行计划存储在 plan_table 中。 - **FORMAT { TEXT | XML | JSON | YAML }** 指定输出格式。 - **GENERIC [ boolean ]** 显示将语句中的常数替换为参数后生成的 generic 计划。
上一篇:
1、DWS驱动介绍及ODBC/JDBC开发
下一篇:
1、各种架构
0
赞
1 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网