关于数据:详解GaussDBDWS-explain分布式执行计划

4次阅读

共计 4249 个字符,预计需要花费 11 分钟才能阅读完成。

摘要:本文次要介绍如何具体解读 GaussDB(DWS)产生的分布式执行打算,从打算中发现性能调长处。

前言

执行打算 (又称解释打算) 是数据库执行 SQL 语句的具体步骤,例如通过索引还是全表扫描拜访表中的数据,连贯查问的实现形式和连贯的程序等。如果 SQL 语句性能不够现实,咱们首先应该查看它的执行打算。本文次要介绍如何具体解读 GaussDB(DWS)产生的分布式执行打算,从打算中发现性能调长处。

1、执行算子介绍

要读懂执行打算,首先要晓得数据库执行算子的概念:

上面重点介绍下基于 sharing nothing 的分布式打算中最重要的一类算子——STREAM 算子

三种类型的 stream 算子

1) Gather Stream (N:1) – 每个源结点都将其数据发送给指标结点

2) Redistribute Stream (N:N) – 每个源节点将其数据依据连贯条件计算 Hash 值,依据从新计算的 Hash 值进行散布,发给对应的指标节点

3) Broadcast Stream (1:N) – 由一个源节点将其数据发给 N 个指标节点

其中 1)次要用于 CN 与 DN 间的数据交换,2)与 3)次要用于 DN 间的数据交换

2、EXPLAIN 用法

SQL 执行打算是一个节点数,显示执一条 SQL 语句执行时的具体步骤。每一个步骤是一个数据库运算符,也叫作一个执行算子。应用 explain 命令能够查看优化器为每个查问生成的具体执行打算。

1) EXPLAIN 的语法

其中,option 中 COSTS 与 NODES 的默认值为 ON,其余参数默认为 OFF。

阐明:

a) EXPLAIN + QUERY 并不会真正执行,只会将打算打印进去,指定 option 中的 ANALYZE 能够进行理论执行

b) PERFORMANCE 选项默认会将所有的选项置为 ON,即显示所有的执行信息。

c) CPU/BUFFER/DETAIL 选项依赖于 ANALYZE,只有 ANALYZE 置为 ON 的时候,能力应用这几个选项。

d) DETAIL 选项用来管制输入,DETAIL 置为 ON 时,会显示各个 DN 上具体的执行信息;DATAIL 置为 OFF 时,显示所有 DN 的汇总信息,即最大最小值信息。

2) EXPLAIN 显示格局

GaussDB 中提供了两种显示格局(normal/pretty),通过设置参数 explain_perf_mode 进行管制。其中,normal 格局为默认的显示格局。

normal 格局如下:

pretty 格局如下:

改良后的显示格局,档次清晰,打算蕴含了 plan node id,性能剖析会更加简略间接。

应用之前能够应用 show explain_perf_mode; 来查看以后数据库应用的显示格调。

同时能够应用 set explain_perf_mode=pretty/normal; 来设置输入的格局。

3、示例打算解读(每个算子资源耗费、耗时等等)

1)四中常见类型打算

建表语句:

a) FQS 打算,齐全下推,下发 query

两表 JOIN,且其连贯条件为各表的散布列,在敞开 stream 算子的状况下,CN 会间接将该语句发送至各 DN 执行,最初后果在 CN 汇总。

b) 非 FQS 打算,局部语句下推

两表 JOIN,且连贯条件中蕴含非散布列,此时在敞开 stream 算子的状况下,CN 会将基表扫描语句下发至各 DN,而后在 CN 上进行 JOIN。

c) Stream 打算,DN 之间无数据交换

两表 JOIN,且连贯条件为各表的散布列,因而各 DN 无需数据交换。CN 生成 stream 打算后,将除 Gather Stream 的打算下发给 DN 执行,在各个 DN 上进行基表 扫描,并进行哈希连贯后,发送给 CN。

d) Stream 打算,DN 之间存在数据交换

两表 JOIN,且连贯条件蕴含非散布列,在开启 stream 算子的状况下,会生成 stream 打算,其 DN 间存在数据交换。此时对于 tt02 表,会在各 DN 进行基表扫描,扫描后会通过 Redistribute Stream 算子,依照 JOIN 条件中的 tt02.c1 进行哈希计算后从新发送给各 DN,而后在各 DN 上做 JOIN,最初汇总到 CN。

2) explain performance 详解

a) 执行打算

•id:执行算子节点编号。

•operation:具体的执行节点算子名称。

•A-time: 各 DN 相应算子执行工夫,[]中左侧为最小值,右侧为最大值,包含上层算子执行工夫。

•A-rows:相应算子输入的全局总行数。

•E-rows:每个算子估算的输入行数。

•Peak Memory:各 DN 相应算子耗费内存峰值,[]中左侧为最小值,右侧为最大值。

•E-memory:DN 上每个算子估算的内存使用量,只有 DN 上执行的算子会显示。某些场景会在估算的内存使用量后应用括号显示该算子在内存源短缺下能够主动扩大的内存下限。

•E-width:每个算子输入元组的估算宽度。

•E-costs:每个算子估算的执行代价。

b) 谓词过滤

显示对应执行算子节点的过滤条件

c) 内存应用

次要显示 CN 的最大内存用量、DN 最大内存用量、各算子的最大内存用量、各算子预估内存用量、Stream 线程的启动以及收发工夫。

d) Targetlist Information

各个算子对应的输入指标列信息。

e) DN 信息

各算子的执行工夫、Buffer、CPU 信息

f) 自定义信息

CN 与 DN 之间的建连信息、DN 与 DN 之间的建连信息。

g) 汇总信息

  • DN 执行器开始工夫,[min_node_name, max_node_name] : [min_time, max_time]
  • DN 执行器完结工夫,[min_node_name, max_node_name] : [min_time, max_time]
  • Remote query poll time:接管后果时用于 poll 期待的工夫
  • CN 执行器开始、运行及完结工夫
  • 网络流量,stream 算子发送的数据量
  • 优化器执行期工夫
  • 查问 ID
  • 总执行工夫

h) 执行工夫介绍

每个算子的执行信息都蕴含三个局部:

其中:

  • dn_6001_6002/dn_6003_6004 示意具体执行的节点信息,括号中的信息是理论的执行信息
  • actual time=0.013..2290.971 示意理论的执行工夫

第一个数字示意执行时进入以后算子到输入第一条数据所破费的工夫

第二个数字为输入所有数据的总执行工夫

留神:在整个打算中,除了叶子节点的执行工夫是算子自身的执行工夫,其余算子的执行工夫均蕴含子节点的执行工夫。

在该打算中,7 号节点和 9 号节点为叶子节点,其余节点均为非叶子简介。1 号节点时顶层节点,所以该节点的执行工夫就能够作为整个查问的执行工夫。

  • rows=2001550 示意以后算子输入数据为 2001550 行;
  • loops=1 示意以后算子的只执行了一次,而对于分区表的扫描(7 号节点)来说:

该层扫描算子的 loops 为 7,对于分区表,每一个分区表的扫描就是一次残缺的扫描操作,当切换到下一个分区的时候,又是一次新的查问操作,查问该表定义如下:

Inventory 表有 7 个分区,所以就执行了 7 次表扫描操作,因而 loops=7。

i) CPU 信息介绍

每个算子执行的过程都有 CPU 信息,其中 cyc 代表的是 CPU 的周期数,ex cyc 示意的是以后算子的周期数,不蕴含其子节点;inc cyc 是蕴含子节点的周期数;ex row 是以后算子输入的数据行数;ex c/ r 则是 ex cyc/ex row 失去的每条数据所用的均匀周期数。

j) Buffer 信息介绍

buffers 显示缓冲区信息,包含共享块和长期块的读和写。

共享块蕴含表和索引,长期块在排序和物化中应用的磁盘块。下层节点显示进去的块数据蕴含了其所有子节点应用的块数。

Buffers 波及的参数有两种,别离为:shared 和 temp,及 shared hit/read/dirtied/written 以及 temp read/write

Hit blocks:代表从磁盘外面读到的数据块数

Dirtied blocks:代表以后查问中被批改了的并且此前未被批改的数据块数

Written blocks:代表以后线程将 shared bufer 里被批改的数据写回到磁盘的块数

k) 执行内存

其中:

Peak Memory:5KB 示意以后算子理论执行时应用的峰值内存;

Estimate Memory:1024MB 示意预估的内存,为优化器给出的预估值。

l) 其余执行信息

(1)sort 算子,会显示排序信息

Sort Method 代表排序的办法,包含 quicksort(快排)和 disksort(外排)。快排即内存够用时,所有的排序操作均在内存中实现,外排阐明以后可用内存有余,须要下盘。

(2)hashjoin 算子

Buckets:代表 hash 表中理论应用的桶的个数

Batches:代表 hashjoin 中理论分块的数量。如果 Batches=1,则阐明所有的数据全在内存中,没有下盘操作;反之则阐明有下盘操作,Batches – 1 代表临时文件的个数。

Memory Usage:就是 hashjoin 中内存的应用状况

(3)hashagg 算子

如果产生数据下盘,会有 File Num:512 信息,显示临时文件的个数。

(4)stream 算子

stream 算子的会统计以后算子解决数据的字节数,其从子线程获取数据的工夫(poll time)以及解决数据的工夫(Deserialize Time)。

stream 算子的子节点会统计发送端的工夫信息,如下:

发送工夫 Send time,排队工夫 Wait Quota time,OS 发送工夫以及数据处理的工夫。

3) explain 调优示例

一个查问语句要通过多个算子步骤才会输入最终的后果。因为个别算子耗时过长导致整体查问性能降落的状况比拟常见。这些算子是整个查问的瓶颈算子。通用的优化伎俩是 EXPLAIN ANALYZE/PERFORMANCE 命令查看执行过程的瓶颈算子,而后进行针对性优化。

基表扫描时,对于点查或者范畴扫描等过滤大量数据的查问,如果应用 SeqScan 全表扫描会比拟耗时,能够在条件列上建设索引抉择 IndexScan 进行索引扫描晋升扫描效率。如下示例:

上述例子中,全表扫描返回 3360 条数据,过滤掉大量数据,在 sssolddate_sk 列上建设索引后,应用 IndexScan 扫描效率显著进步,从 960 毫秒晋升到 8 毫秒。

结语:

在调优过程中,纯熟应用 explain 并能剖析各局部数据后果是十分重要的。本文中仅仅介绍了大多数字段的含意以及依据 explain 后果进行调优的一个小示例,还能够与 plan hint 联合应用找出执行的最佳门路,也能够定位歪斜水平等等。

点击关注,第一工夫理解华为云陈腐技术~

正文完
 0