- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章详解GaussDB(DWS) explain分布式执行计划的示例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
摘要:本文主要介绍如何详细解读gaussdb(dws)产生的分布式执行计划,从计划中发现性能调优点。前言 。
执行计划(又称解释计划)是数据库执行sql语句的具体步骤,例如通过索引还是全表扫描访问表中的数据,连接查询的实现方式和连接的顺序等。如果 sql 语句性能不够理想,我们首先应该查看它的执行计划。本文主要介绍如何详细解读gaussdb(dws)产生的分布式执行计划,从计划中发现性能调优点.
。
要读懂执行计划,首先要知道数据库执行算子的概念:
下面重点介绍下基于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间的数据交换 。
。
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;来设置输出的格式.
。
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 表示具体执行的节点信息,括号中的信息是实际的执行信息actualtime=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结合使用找出执行的最佳路径,也可以定位倾斜程度等等.
到此这篇关于详解gaussdb(dws) explain分布式执行计划的文章就介绍到这了,更多相关gaussdb(dws)分布式执行计划内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://www.cnblogs.com/huaweiyun/p/13846981.html 。
最后此篇关于详解GaussDB(DWS) explain分布式执行计划的示例的文章就讲到这里了,如果你想了解更多关于详解GaussDB(DWS) explain分布式执行计划的示例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
全称“Java Virtual Machine statistics monitoring tool”(statistics 统计;monitoring 监控;tool 工具) 用于监控虚拟机的各种运
主要是讲下Mongodb的索引的查看、创建、删除、类型说明,还有就是Explain执行计划的解释说明。 可以转载,但请注明出处。  
1>单线程或者单进程 相当于短链接,当accept之后,就开始数据的接收和数据的发送,不接受新的连接,即一个server,一个client 不存在并发。 2>循环服务器和并发服务器
详解 linux中的关机和重启命令 一 shutdown命令 shutdown [选项] 时间 选项: ?
首先,将json串转为一个JObject对象: ? 1
matplotlib官网 matplotlib库默认英文字体 添加黑体(‘SimHei')为绘图字体 代码: plt.rcParams['font.sans-serif']=['SimHei'
在并发编程中,synchronized关键字是常出现的角色。之前我们都称呼synchronized关键字为重量锁,但是在jdk1.6中对synchronized进行了优化,引入了偏向锁、轻量锁。本篇
一般我们的项目中会使用1到2个数据库连接配置,同程艺龙的数据库连接配置被收拢到统一的配置中心,由DBA统一配置和维护,业务方通过某个字符串配置拿到的是Connection对象。  
实例如下: ? 1
1. MemoryCahe NetCore中的缓存和System.Runtime.Caching很相似,但是在功能上做了增强,缓存的key支持object类型;提供了泛型支持;可以读缓存和单个缓存
argument是javascript中函数的一个特殊参数,例如下文,利用argument访问函数参数,判断函数是否执行 复制代码 代码如下: <script
一不小心装了一个Redis服务,开了一个全网的默认端口,一开始以为这台服务器没有公网ip,结果发现之后悔之莫及啊 某天发现cpu load高的出奇,发现一个minerd进程 占了大量cpu,googl
今天写这个是为了 提醒自己 编程过程 不仅要有逻辑 思想 还有要规范 代码 这样可读性 1、PHP 编程规范与编码习惯最主要的有以下几点: 1 文件说明 2 funct
摘要:虚拟机安装时一般都采用最小化安装,默认没有lspci工具。一台测试虚拟网卡性能的虚拟机,需要lspci工具来查看网卡的类型。本文描述了在一个虚拟机中安装lspci工具的具体步骤。 由于要测试
1、修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统
目录 算术运算符 基本四则运算符 增量赋值运算符 自增/自减运算符 关系运算符 逻
如下所示: ? 1
MapperScannerConfigurer之sqlSessionFactory注入方式讲解 首先,Mybatis中的有一段配置非常方便,省去我们去写DaoImpl(Dao层实现类)的时间,这个
Linux的网络虚拟化是LXC项目中的一个子项目,LXC包括文件系统虚拟化,进程空间虚拟化,用户虚拟化,网络虚拟化,等等,这里使用LXC的网络虚拟化来模拟多个网络环境。 本文从基本的网络设备讲
? 1
我是一名优秀的程序员,十分优秀!