openGauss简单查询SQL的执行流程解析
目录
简单查询的执行
gdb调试
上一期酷哥分析了openGauss数据库的启动过程,包括主线程,辅助线程及业务处理线程的启动过程,这一期主要分析简单查询语句在业务处理线程Postgres上的执行流程,并介绍如何利用gdb梳理代码逻辑。
简单查询的执行
SQL引擎是数据库系统的入口,执行用户简单查询的入口函数是exec_simple_query。运行在业务处理线程Postgres。
通常可以把SQL引擎分成SQL解析和查询优化两个主要的模块,SQL引擎对输入的SQL语言进行词法分析、语法分析、语义分析,从而生成逻辑执行计划,逻辑执行计划经过代数优化和代价优化之后,产生物理执行计划。
在SQL引擎将用户的查询解析优化成可执行的计划之后,数据库进入查询执行阶段。执行器基于执行计划对相关数据进行提取、运算、更新、删除等操作,以达到用户查询想要实现的目的。
exec_simple_query
1.start_xact_command():开始一个事务
2.pg_parse_query():对查询语句进行词法和语法分析,生成一个或者多个初始的语法分析树
3. 进入foreach (parsetree_item, parsetree_list)循环,对每个语法分析树执行查询
4. pg_analyze_and_rewrite():根据语法分析树生成基于Query数据结构的逻辑查询树,并进行重写等操作
5. pg_plan_queries():对逻辑查询树进行优化,生成查询计划
6. CreatePortal():创建Portal, Portal是执行SQL语句的载体,每一条SQL对应唯一的Portal
7. PortalStart():负责进行Portal结构体初始化工作,包括执行算子初始化、内存上下文分配等
8. PortalRun():负责真正的执行和运算,它是执行器的核心
9. PortalDrop():负责最后的清理工作,主要是数据结构、缓存的清理
10. finish_xact_command():完成事务提交
11. EndCommand():通知客户端查询执行完成
gdb调试
调试需要用到符号信息,configure使用如下命令
./configure --gcc-version=7.3.0 CC=g++ CFLAGS='-O0' --prefix=$GAUSSHOME --3rd=$BINARYLIBS --enable-debug --enable-cassert --enable-thread-safety --with-readline --without-zlib
gdb attach 进程号,这里进程号为17012
gdb attach 17012
info threads查看所有线程,t 线程号切换线程,bt可以查看线程调用栈
也可以使用linux工具gstack 打印函数调用栈
以调试select语句为例,gdb attach 进程号,在exec_simple_query打上断点,执行select语句即可开始调试
openGauss简单查询SQL的执行流程解析相关推荐
- 面试官:说说一条查询sql的执行流程和底层原理?
作者:孤独烟,资深后端工程师,业内知名原创作者 一条查询SQL执行流程图如下 本文改编自<高性能Mysql>,烟哥用小说的形式来讲这个内容. 序章 自我介绍 我是一条sql,就是一条长长的 ...
- 一文读懂查询sql的执行流程和底层原理
前言 天天和数据库打交道,一天能写上几十条SQL语句,但你知道我们的系统是如何和数据库交互的吗?MySQL如何帮我们存储数据.又是如何帮我们管理事务?-是不是感觉真的除了写几个「select * fr ...
- SQL优化之SQL查询语句的执行顺序解析
SQL语句执行顺序 SQL语句执行顺序 结合上图,整理出如下伪SQL查询语句. SQL语句执行顺序 从这个顺序中我们可以发现,所有的查询语句都是从 FROM 开始执行的.在实际执行过程中,每个步骤都会 ...
- 详解MySQL的逻辑架构和SQL语句执行流程
文章目录 1. 逻辑架构 1.1 连接层 1.2 服务层 1.3 引擎层 1.3.1 InnoDB 存储引擎 1.3.2 MyISAM 存储引擎 1.3.3 其他存储引擎 1.4 存储层 3. SQL ...
- Oracle SQL语句执行流程与顺序原理详解
以前读的文章,保存到本地了,忘记来源了,分享一下,本地存着怕丢了 Oracle SQL语句执行流程与顺序原理详解 第一步:客户端把语句发给服务器端执行 当我们在客户端执行SQL语句时,客户端会把这条S ...
- mysql查看执行计划_MySql中如何使用 explain 查询 SQL 的执行计划
explain命令是查看查询优化器如何决定执行查询的主要方法. 这个功能有局限性,并不总会说出真相,但它的输出是可以获取的最好信息,值得花时间去了解,因为可以学习到查询是如何执行的. 1.什么是MyS ...
- explain如何查看mysql_MySql中如何使用 explain 查询 SQL 的执行计划
explain命令是查看查询优化器如何决定执行查询的主要方法. 这个功能有局限性,并不总会说出真相,但它的输出是可以获取的最好信息,值得花时间去了解,因为可以学习到查询是如何执行的. 1.什么是MyS ...
- SpringMVC 执行流程解析
SpringMVC 执行流程解析 注:SpringMVC 版本 5.2.15 上面这张图许多人都看过,本文试图从源码的角度带大家分析一下该过程. 1. ContextLoaderListener 首先 ...
- Postgresql源码(66)insert on conflict语法介绍与内核执行流程解析
相关: <Postgresql源码(66)insert on conflict语法介绍与内核执行流程解析>) <Postgresql源码(70)逻辑复制DecodeXLOG主要流程和 ...
最新文章
- 读《高效程序员的45个习惯——敏捷开发修炼之道》
- 亿级Web系统搭建――单机到分布式集群 转载
- asin c语言中 返回值范围_asin()_C语言asin()详解:反正弦函数,求反正弦值
- 《设计模式》3.结构型模式
- 慧联A8最新检测使用教程V2.0.3
- no suitable driver found for jdbc:mysql//localhost:3306/..
- Spring boot Scheduled 配置
- 安卓linux终端 计算,5种在Linux终端中进行算术运算的方法
- Java-GuardedBlocks与BusyWaitting忙等待
- 从源码解析 Spring JDBC 异常抽象
- 初识DOM(文档对象模型)
- Python输出语句
- C语言编程练习,猜数字游戏实现
- 《21天学通Java(第6版)》—— 2.11 练习
- 基于服务的多源异构数据整合平台解决方案
- buuctf--CrackRTF
- PHP面试经常被问到的问题(附答案)
- macOS Monterey系列原版光盘镜像文件制作
- appium+python 自动化测试:解决安卓系统双击问题——获取微信聊天内容
- 拼团模式--社交电商的常见营销手法
热门文章
- Damn Vulnerable DeFi靶场实战(6-10)
- 深度学习AI美颜系列---AutoRetouch端到端美颜方案
- uniapp前端用forEach循环遍历数组
- Apollo 2.0 框架及源码分析(一) | 软硬件框架
- Barsetto百胜图美式便携咖啡机,总有这杯在身边
- ios 打印html文件分页,iOS 高效的分页加载
- .ren走进家谱界——shenshi.ren带你追溯“”申氏家族人
- 各种系统的iso镜像(百度网盘提取)
- iFaith 教程
- 30岁测试开发年薪不足80万,还要被面试官diss混得太差?