云数据库 GAUSSDB-详解:执行计划
执行计划
以如下SQL语句为例:
1 2 3 4 5 |
select cjxh, count(1) from dwcjk group by cjxh; |
执行EXPLAIN的输出为:
执行计划字段解读(横向):
- id:执行算子节点编号。
- operation:具体的执行节点算子名称。
Vector前缀的算子是指向量化执行引擎算子,一般出现含有列存表的Query中。
Streaming是一个特殊的算子,它实现了分布式架构的核心数据shuffle功能,Streaming共有三种形态,分别对应了分布式结构下不同的数据shuffle功能:- Streaming (type: GATHER):作用是coordinator从DN收集数据。
- Streaming(type: REDISTRIBUTE):作用是DN根据选定的列把数据重分布到所有的DN。
- Streaming(type: BROADCAST):作用是把当前DN的数据广播给其他所有的DN
- E-rows:每个算子估算的输出行数。
- E-memory:DN上每个算子估算的内存使用量,只有DN上执行的算子会显示。某些场景会在估算的内存使用量后使用括号显示该算子在内存资源充足下可以自动扩展的内存上限。
- E-width:每个算子输出元组的估算宽度。
- E-costs:每个算子估算的执行代价。
- E-costs是优化器根据成本参数定义的单位来衡量的,习惯上以磁盘页面抓取为1个单位, 其它开销参数将参照它来设置。
- 每个节点的开销(E-costs值)包括它的所有子节点的开销。
- 开销只反映了优化器关心的东西,并没有把结果行传递给客户端的时间考虑进去。虽然这个时间可能在实际的总时间里占据相当重要的分量,但是被优化器忽略了,因为它无法通过修改规划来改变。
执行计划层级解读(纵向):
- 第一层: CS tore Scan on dwcjk
表扫描算子,用CStore Scan的方式扫描表dwcjk。这一层的作用是把表dwcjk的数据从buffer或者磁盘上读上来输送给上层节点参与计算。
- 第二层:Vector Hash Aggregate
- 第三层:Vector Streaming (type: GATHER)
- 第四层:Row Adapter
需要注意的是最顶层算子为Data Node Scan时,需要设置enable_fast_query_shipping为off才能看到具体的执行计划,如下面这个计划:
1 2 3 4 5 6 |
openGauss=# explain select cjxh, count(1) from dwcjk group by cjxh; QUERY PLAN -------------------------------------------------- Data Node Scan (cost=0.00..0.00 rows=0 width=0) Node/s: All datanodes (2 rows) |
设置enable_fast_query_shipping参数之后,执行计划显示如下:
执行计划中的关键字说明:
- 表访问方式
- Seq Scan
- Index Scan
优化器决定使用两步的规划:最底层的规划节点访问一个索引,找出匹配索引条件的行的位置,然后上层规划节点真实地从表中抓取出那些行。独立地抓取数据行比顺序地读取它们的开销高很多,但是因为并非所有表的页面都被访问了,这么做实际上仍然比一次顺序扫描开销要少。使用两层规划的原因是,上层规划节点在读取索引标识出来的行位置之前,会先将它们按照物理位置排序,这样可以最小化独立抓取的开销。
如果在WHERE里面使用的好几个字段上都有索引,那么优化器可能会使用索引的AND或OR的组合。但是这么做要求访问两个索引,因此与只使用一个索引,而把另外一个条件只当作过滤器相比,这个方法未必是更优。
索引扫描可以分为以下几类,他们之间的差异在于索引的排序机制。
- 表连接方式
- Nested Loop
嵌套循环,适用于被连接的数据子集较小的查询。在嵌套循环中,外表驱动内表,外表返回的每一行都要在内表中检索找到它匹配的行,因此整个查询返回的结果集不能太大(不能大于10000),要把返回子集较小的表作为外表,而且在内表的连接字段上建议要有索引。
- (Sonic) Hash Join
哈希连接,适用于数据量大的表的连接方式。优化器使用两个表中较小的表,利用连接键在内存中建立hash表,然后扫描较大的表并探测散列,找到与散列匹配的行。Sonic和非Sonic的Hash Join的区别在于所使用hash表结构不同,不影响执行的结果集。
- Merge Join
归并连接,通常情况下执行性能差于哈希连接。如果源数据已经被排序过,在执行融合连接时,并不需要再排序,此时融合连接的性能优于哈希连接。
- Nested Loop
- 运算符
- GaussDB培训_GaussDB教程_高斯数据库培训-华为云
- GaussDB数据库云备份_华为GaussDB_高斯数据库云备份
- GaussDB案例指南_高斯数据库函数_高斯数据库案例指南_华为云
- GaussDB TP_GaussDB和MySQL区别_高斯数据库TP_华为云
- GaussDB视频教程_gaussdb查看表结构语句_高斯数据库视频教程_华为云
- GaussDB性能怎么调_华为gaussdb_gaussdb性能_gaussdb学习
- CDN 服务器_CDN哪家好_CDN详解
- GaussDB发展_gaussdb数据库_高斯数据库发展_华为云
- GaussDB性能_Gaussdb数据库性能_高斯数据库性能-华为云
- GaussDB数据库登录_Gaussdb登录管理控制台_高斯数据库登录-华为云