当前位置: 首页 > article >正文

GPDB EXPLAIN ANALYZ比直接执行SQL慢?

自从GPDB闭源后,HashData接手举起了GPDB开源的大旗,由GPDB衍生而来的CloudberryDB于近期加入了Apache软件基金会孵化器,给GPDB开源社区带来了热度和活力。

昨天在CC群里看到GPDB中EXPLAIN ANALYZ比直接执行SQL慢的讨论。一般情况下,EXPLAIN ANALYZE由于不会向客户端输出元组,没有网络传输代价和IO转换代价(除非指定了SERIALIZE)所以比直接执行SQL快。但是EXPLAIN ANALYZE调用了gettimeofday()系统调用,在比较慢的机器上,这个代价就有点大了,可能会冲掉EXPLAIN ANALYZE上面省掉的动作节省的时间。在GPDB中还有另外一种场景导致EXPLAIN ANALYZE执行很慢:比如GPDB集群数据很不均衡,执行加了limit的SQL。

原因:在GPDB中执行explain analyze时,master执行了ExecutorRun后会等所有QE结束后才继续向下执行ExecutorEnd;而SQL正常执行时,一旦有的SEGMENT数据比较少执行的比较快,将数据发送给master后,master发现数据量够了,就会在ExecutorEnd中向SEGMENT发送消息,终止没有执行玩完的SEGMENT。

接下来,我们看下执行的流程,来充分理解下。

1、explain analyze流程

a55169d3a0d66f3cf7efff2d1292007e.png

1)Explain analyze流程中,master执行ExecutorRun函数开始执行计划的执行

2)然后master就会通过函数cdbdisp_checkDispatchResult函数等待所有QE执行完。注意这里waitMode入参为DISPATCH_WAIT_NONE

3)2)中的执行函数指针为cdbdisp_checkDispatchResult_async,它调用函数checkDispatchResult,注意它的入参timeout_sec为-1

4)checkDispatchResult函数中当timeout_sec为-1,且waiMode为DISPATCH_WAIT_NONE时,poll的超时时间为DISPATCH_WAIT_TIMEOUT_MSEC。

5)checkDispatchResult函数的循环中,需要接收到所有QE完成后,才会退出循环

由此,了解到Explain analyze会等待所有QE完成。

2、SQL正常执行流程

SQL正常执行时,走的是执行器三部曲:ExecutorStart-ExecutorRun-ExecutorEnd

ca5fcc8bbcd1b39139c0c5f5b5fd7a90.png

1)master不用等所有QE全部执行完,它得到需要行数的元组后,就可以执行到ExecutorEnd

2)ExecutorEnd通过ExecSquelchNode告诉子节点,通过ExecSquelchMotion通知QE不用执行了

3)Master然后进入checkDispatchResult等待QE反馈消息,注意他这里的timeout_sec为-1,waitMode为DISPATCH_WAIT_FINISH,由此poll的超时时间为DISPATCH_WAIT_CANCEL_TIMEOUT_MSEC

由此,正常执行时,master不用等待所有QE结束,它得到需要的行数后就可以进入ExecutorEnd,向QE发送终止执行命令,然后结束。

3、参考

https://www.postgresql.org/docs/current/using-explain.html#USING-EXPLAIN-ANALYZE

https://www.postgresql.org/docs/current/sql-explain.html


http://www.kler.cn/a/420430.html

相关文章:

  • Centos7安装MySQL8.0详细教程(压缩包安装方式)
  • 音视频入门基础:MPEG2-TS专题(9)——FFmpeg源码中,解码TS Header的实现
  • 动态规划-----路径问题
  • 【AI系统】昇腾异构计算架构 CANN
  • 【ONE·基础算法 || 动态规划(三)】
  • BWO-CNN-BiGRU-Attention白鲸优化算法优化卷积神经网络结合双向门控循环单元时间序列预测,含优化前后对比
  • MATLAB基础应用精讲-【数模应用】基于Elman神经网络预测股价(附MATLAB和python代码实现)
  • 【0347】Postgres内核 startup XLOG 之 核实 pg_wal 、 pg_wal/archive_status (1)
  • Vue2 常见知识点(二)
  • unity3d———xml 存储数据例子
  • MySQL的Json类型数据操作方法
  • LeetCode 129.求根节点到叶节点数字之和
  • VBA数据库解决方案第十七讲:Recordset对象记录位置的定位方法
  • 你还没有将 Siri 接入GPT对话功能吗?
  • 在线影视播放网站PHP电影网站源码自动采集MKCMS升级版米酷模板含WAP手机版附三套模板
  • Y20030017php+mysql小型宠物服务平台的设计与实现 源码 文档 PPT
  • java单例设计
  • 在树莓派上使用自带的摄像头采集视频
  • 深度探索Spring Context:框架式的Bean访问与企业级功能
  • Day2 生信新手笔记: Linux基础
  • 鸿蒙与Linux内核的关系
  • java Stream 详解
  • 嵌入式Linux无窗口系统下搭建 Qt 开发环境
  • redis针对hash的命令 及 使用场景
  • 电机驱动MCU介绍
  • 理解 Python PIL库中的 convert(‘RGB‘) 方法:为何及如何将图像转换为RGB模式