摘要:本文次要介绍如何具体解读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联合应用找出执行的最佳门路,也能够定位歪斜水平等等。
点击关注,第一工夫理解华为云陈腐技术~