GPDB EXPLAIN ANALYZ比直接执行SQL慢?

server/2024/12/5 3:43:25/

自从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.ppmy.cn/server/147456.html

相关文章

DVWA靶场文件包含(File Inclusion)通关教程(high级别)

目录 DVWA 靶场建立闯关 DVWA 靶场建立 需要的东西: phpStudy: 链接: phpStudy 提取码:0278 DVWA-master 链接: DVWA靶场 提取码:0278 建议在虚拟机中操作,以防数据库冲突,下面有…

量化交易系统开发-实时行情自动化交易-8.8.同花顺 SuperMind 平台

19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。 接下来会对于同花顺 SuperMind 平台介绍…

Git中HEAD、工作树和索引的区别

在Git版本控制系统中,HEAD、工作树(Working Tree)和索引(Index)是三个非常重要的概念,它们分别代表了不同的状态或区域,下面我将对这三个概念进行详细的解释。 HEAD 定义:HEAD是一…

KubeBlocks v0.9.2发布啦!支持容器镜像滚动更新、MySQL支持Jemalloc...快来升级体验更多新功能!

KubeBlocks v0.9.2 正式发布啦!本次发布包含了一些新功能、关键的错误修复以及各种改进。以下是详细的更新内容。 升级文档 v0.9.2 升级方式与 v0.9.1 相同,替换版本即可哦~ https://kubeblocks.io/docs/release-0.9/user_docs/upgrade/up…

第八章:标准库和工具 2.开发工具 --Go 语言轻松入门

第八章:标准库和工具 2.开发工具 --Go 语言轻松入门 Go 语言(也称为 Golang)是一种由 Google 开发的开源编程语言,它以其简洁、高效和并发支持而闻名。开发 Go 语言应用程序时,有许多工具和集成开发环境(I…

【C++】入门【五】

本节目标 一、C/C内存分布 二、C语言中动态内存管理方式 三、C中动态内存管理 四、operator new与operator delete函数 五、new和delete的实现原理 六、定位new表达式(placement-new) 七、常见面试题 一、C/C内存分布 一个程序占用的内存主要有以下几部分栈区(stac…

[Redis#9] stream | geospatial | HyperLogLog | bitmaps | bitfields

目录 1.Streams 事件驱动机制 事件 JS (做界面) 事件是干什么的? 2.geospatial 3.HyperLogLog 4.bitmaps 5.bitfields redis 常用的 data types 有 10 种,我们前面已经讲到了 5 种,这篇文章将对剩下的 5 种特殊数据结构进行讲解~ 1.…

【鸿蒙开发】第二十三章 Network 网络服务

目录​​​​​​​ 1 简介 1.1 约束与限制 2 HTTP数据请求 2.1 request 接口开发步骤 2.2 requestInStream接口开发步骤 3 WebSocket连接 3.1 开发步骤 4 Socket 连接 4.1 Socket 连接主要场景 4.1.1 TCP/UDP Socket进行数据传输 4.1.2 TCP Socket Server 进行数…