目录

简单查询的执行

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的执行流程解析相关推荐

  1. 面试官:说说一条查询sql的执行流程和底层原理?

    作者:孤独烟,资深后端工程师,业内知名原创作者 一条查询SQL执行流程图如下 本文改编自<高性能Mysql>,烟哥用小说的形式来讲这个内容. 序章 自我介绍 我是一条sql,就是一条长长的 ...

  2. 一文读懂查询sql的执行流程和底层原理

    前言 天天和数据库打交道,一天能写上几十条SQL语句,但你知道我们的系统是如何和数据库交互的吗?MySQL如何帮我们存储数据.又是如何帮我们管理事务?-是不是感觉真的除了写几个「select * fr ...

  3. SQL优化之SQL查询语句的执行顺序解析

    SQL语句执行顺序 SQL语句执行顺序 结合上图,整理出如下伪SQL查询语句. SQL语句执行顺序 从这个顺序中我们可以发现,所有的查询语句都是从 FROM 开始执行的.在实际执行过程中,每个步骤都会 ...

  4. 详解MySQL的逻辑架构和SQL语句执行流程

    文章目录 1. 逻辑架构 1.1 连接层 1.2 服务层 1.3 引擎层 1.3.1 InnoDB 存储引擎 1.3.2 MyISAM 存储引擎 1.3.3 其他存储引擎 1.4 存储层 3. SQL ...

  5. Oracle SQL语句执行流程与顺序原理详解

    以前读的文章,保存到本地了,忘记来源了,分享一下,本地存着怕丢了 Oracle SQL语句执行流程与顺序原理详解 第一步:客户端把语句发给服务器端执行 当我们在客户端执行SQL语句时,客户端会把这条S ...

  6. mysql查看执行计划_MySql中如何使用 explain 查询 SQL 的执行计划

    explain命令是查看查询优化器如何决定执行查询的主要方法. 这个功能有局限性,并不总会说出真相,但它的输出是可以获取的最好信息,值得花时间去了解,因为可以学习到查询是如何执行的. 1.什么是MyS ...

  7. explain如何查看mysql_MySql中如何使用 explain 查询 SQL 的执行计划

    explain命令是查看查询优化器如何决定执行查询的主要方法. 这个功能有局限性,并不总会说出真相,但它的输出是可以获取的最好信息,值得花时间去了解,因为可以学习到查询是如何执行的. 1.什么是MyS ...

  8. SpringMVC 执行流程解析

    SpringMVC 执行流程解析 注:SpringMVC 版本 5.2.15 上面这张图许多人都看过,本文试图从源码的角度带大家分析一下该过程. 1. ContextLoaderListener 首先 ...

  9. Postgresql源码(66)insert on conflict语法介绍与内核执行流程解析

    相关: <Postgresql源码(66)insert on conflict语法介绍与内核执行流程解析>) <Postgresql源码(70)逻辑复制DecodeXLOG主要流程和 ...

最新文章

  1. 读《高效程序员的45个习惯——敏捷开发修炼之道》
  2. 亿级Web系统搭建――单机到分布式集群 转载
  3. asin c语言中 返回值范围_asin()_C语言asin()详解:反正弦函数,求反正弦值
  4. 《设计模式》3.结构型模式
  5. 慧联A8最新检测使用教程V2.0.3
  6. no suitable driver found for jdbc:mysql//localhost:3306/..
  7. Spring boot Scheduled 配置
  8. 安卓linux终端 计算,5种在Linux终端中进行算术运算的方法
  9. Java-GuardedBlocks与BusyWaitting忙等待
  10. 从源码解析 Spring JDBC 异常抽象
  11. 初识DOM(文档对象模型)
  12. Python输出语句
  13. C语言编程练习,猜数字游戏实现
  14. 《21天学通Java(第6版)》—— 2.11 练习
  15. 基于服务的多源异构数据整合平台解决方案
  16. buuctf--CrackRTF
  17. PHP面试经常被问到的问题(附答案)
  18. macOS Monterey系列原版光盘镜像文件制作
  19. appium+python 自动化测试:解决安卓系统双击问题——获取微信聊天内容
  20. 拼团模式--社交电商的常见营销手法

热门文章

  1. Damn Vulnerable DeFi靶场实战(6-10)
  2. 深度学习AI美颜系列---AutoRetouch端到端美颜方案
  3. uniapp前端用forEach循环遍历数组
  4. Apollo 2.0 框架及源码分析(一) | 软硬件框架
  5. Barsetto百胜图美式便携咖啡机,总有这杯在身边
  6. ios 打印html文件分页,iOS 高效的分页加载
  7. .ren走进家谱界——shenshi.ren带你追溯“”申氏家族人
  8. 各种系统的iso镜像(百度网盘提取)
  9. iFaith 教程
  10. 30岁测试开发年薪不足80万,还要被面试官diss混得太差?