vlambda博客
学习文章列表

数据库查询原来长这样!| Greenplum新功能—可视化执行计划

Greenplum Command Center 4.2中首次推出了全新的beta功能——可视化执行计划。 这一业界领先的最新功能提供了全新的查询计划的展示方式,目标是通过图形化的手段展示Query查询计划的每个步骤和执行进度,从而使得我们能够更加直观方便的了解查询执行计划的细节。 这一全新功能就位于Query详情页中的“Plan & Progress”选项卡中。



注意:这篇文章不会详细解释每个步骤的意义,也不会分辨这个计划是否有问题,你可以从这里(https://www.linkedin.com/pulse/analyzing-query-execution-plans-greenplum-sandeep-katta-/),这里(https://gpdb.docs.pivotal.io/5100/ref_guide/sql_commands/EXPLAIN.html)或这里(https://gpdb.docs.pivotal.io/580/best_practices/tuning_queries.html)了解与此相关的知识。相反,我们将仅限于揭示可视化计划和文本计划之间的关系。


理解两种类型计划之间的关系


“文本执行计划”和“可视化执行计划”是帮助我们深入研究某个查询语句的利器。前者能够让我们直接查看每个步骤的细节,并且由于其信息是通过文本展示的,通过关键字搜索特定信息非常方便;而最新的“可视化计划”则使得我们能够实时了解计划执行进度,分析性能,同时对于复杂的大型查询语句,可视化的展示方式对于深入理解其执行过程大有裨益。


接下来,我们会具体介绍这两种不同计划展示方式分别是如何展现查询计划中两个重要概念:执行顺序和切片(Slice)。


计划步骤的顺序


在文本执行计划中,最先需要完成的是最下面被缩进最多的步骤。随着第一个被缩进最多的步骤的缩进,所有步骤也同时在缩进。


数据库查询原来长这样!| Greenplum新功能—可视化执行计划


我们可以这样理解上图所示的文本执行计划:


  1. nation表上的Seq Scan会是起始步骤,接着是Broadcast Motion, 然后是Hash。

  2. supplier表上的Seq Scan将会和nation表中的操作并行执行。

  3. 1和2的结果会在Hash Join(第二行)处合并,并且只有1,2的操作都完成后Hash Join才会完成。


这里需要特别强调:所有步骤是同时开始的。但每个步骤的完成时间则是取决于其具体所执行的动作完成的时间,比如收到上一步提供的数据并完成动作的执行的时间。


在“可视化执行计划”中,我们将计划展示为一棵树,这棵树的阅读顺序同样是自底向上的。“文本执行计划”中的缩进表现为树中的分支,而缩进最多的步骤,就变成计划树的叶子节点。


数据库查询原来长这样!| Greenplum新功能—可视化执行计划

数据库查询原来长这样!| Greenplum新功能—可视化执行计划


切片(Slice)


切片是查询计划在不同segment间并行执行的单元。


Greenplum是一个大规模并行处理(MPP)且Shared Nothing的数据管理系统。也就是说,一个表会被分成更小的完全分解子集,并散布于数据集群的不同segment上。这就使得一个查询能够在多个Segment上并行执行,从而大大提高了查询速度。


在执行查询时,我们经常需要将数据元组(Tuple)从一个Segment移动到另一个上,或者从所有Segment上归集结果。为了实现这一过程,GPDB引入了Motion的概念。Motion节点共有三种类型:收集(Gather),重分布(Redistribution),广播(Broadcast)。当你在查询计划中看到一个Motion节点,就可以当做是一个Slice的开始。点击这里(https://gpdb.docs.pivotal.io/580/admin_guide/query/topics/parallel-proc.html)了解更多相关内容。


下图是一个查询计划全景图,为了方便理解,我们将不同的切片(Slice)用不同颜色标记出来。


数据库查询原来长这样!| Greenplum新功能—可视化执行计划


如上图所示, 切片(Slice)并不一定与执行计划文本的结构相一致,而且会出现类似Slice 4这种同一切片(Slice)分布于不只一处的情况。因此,在“文本执行计划”中,划分和了解不同切片(Slice)之间的关系会比较困难。而在最新的“可视化执行计划”中,这一难题迎刃而解。


数据库查询原来长这样!| Greenplum新功能—可视化执行计划

在上图的“可视化执行计划”中,我们可以清晰的看到步骤之间的互相关系,了解数据是如何从一个节点流向另一个节点,而切片(Slice)的划分方式也会更容易理解。


那么通过“文本执行计划”和“可视化执行计划”了解查询执行步骤和切片(Slice),对我们究竟有何意义呢?当GPDB收到一个查询请求时,会按照一定的步骤执行:首先优化器(optimizer)会将其解释为若干步骤,并确定最佳执行序列;紧接着,这些步骤被划分入不同的切片(Slice)中,使其能够被高效的并行执行;除此之外,优化器还将估算每个步骤中处理的元组(Tuple)数量;之后,一个查询才会开始执行。而通过Greenplum Command Center提供的“可视化”和“文本”两种不同的查询执行计划,我们可以深入了解一个查询的具体执行步骤,以帮助我们确定查询的性能瓶颈,从而为查询语句的优化提供思路和支持。有关优化查询的更多信息,请查看优化Greenplum性能(https://greenplum.org/optimizing-greenplum-performance-2018/)和调整Greenplum数据库(https://www.linkedin.com/pulse/tuning-greenplum-database-sandeep-katta-/)。


总结


“文本执行计划”和“可视化执行计划”是两种不同的展示查询执行计划的方式。其中,“可视化执行计划”让我们能够实时查看查询执行进度,了解每个步骤的活跃时长;而通过“文本执行计划”则可以了解每个步骤的具体开销和所处理的数据行数。充分利用这两项功能,将帮助我们更好地理解和分析每个查询。


我们会在后续Greenplum Command Center版本中持续改进“可视化执行计划”,提供包括“切片可视化”在内的更多功能,以期帮助用户更好地理解GPDB中查询计划的细节。敬请关注!

点击下方“阅读原文”查看英文博客