openGauss内核:简单查询的执行
摘要:本文主要分析简单查询语句在业务处理线程Postgres上的执行流程,并介绍如何利用gdb梳理代码逻辑。
本文分享自华为云社区《openGauss内核分析(二):简单查询的执行》,作者:Gauss松鼠会。
简单查询的执行
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_**yze_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内核:简单查询的执行的更多相关文章
- MySQL之单表查询 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 使用正则表达式查询
MySQL之单表查询 阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER B ...
- openGauss内核:SQL解析过程分析
摘要:在传统数据库中SQL引擎一般指对用户输入的SQL语句进行解析.优化的软件模块.SQL的解析过程主要分为:词法.语法和语义分析. 本文分享自华为云社区< openGauss内核分析(三):S ...
- Linux 内核开发—内核简单介绍
内核简单介绍 Linux 构成 Linux 为什么被划分为系统空间和内核空间 隔离核心程序和应用程序,实现对核心程序和数据的保护. 什么内核空间,用户空间 内核空间和用户空间是程序执行的两种不同的状态 ...
- 小觑数据库(SqlServer)查询语句执行过程
近年来,越来越多的NoSql产品不断的以技术革命的者的身份跳出来:“你看哥是多么的快,你们关型型数据库真是战五渣阿”.是的,高性能的场景下NoSql真的很出彩.而我们关系型数据库只能在墙角哭泣&quo ...
- 对于Oracle中分页排序查询语句执行效率的比较分析
转自:http://bbs.csdn.net/topics/370033478 对于Oracle中分页排序查询语句执行效率的比较分析 作者:lzgame 在工作中我们经常遇到需要在Oracle中进行分 ...
- MySQL查询语句执行过程及性能优化(JOIN/ORDER BY)-图
http://blog.csdn.net/iefreer/article/details/12622097 MySQL查询语句执行过程及性能优化-查询过程及优化方法(JOIN/ORDER BY) 标签 ...
- SQL 2005 中查询或执行另外的数据库操作的方法
原文:SQL 2005 中查询或执行另外的数据库操作的方法 摘要: 如果,你想在一台数据库服务器上,查询另一个台数据服务器的数据该如何做呢?如果,你想在同一台数据服务器上,在不同的数据库之间查询数据, ...
- Spring Data JPA 简单查询--接口方法
一.接口方法整理速查 下表针对于简单查询,即JpaRepository接口(继承了CrudRepository接口.PagingAndSortingRepository接口)中的可访问方法进行整理.( ...
- 高性能mysql 第六章查询性能优化 总结(上)查询的执行过程
6 查询性能优化 6.1为什么查询会变慢 这里说明了的查询执行周期,从客户端到服务器端,服务器端解析,优化器生成执行计划,执行(可以细分,大体过程可以通过show profile查看),从服务器端返 ...
- T-SQL基础(一)之简单查询
名词解释 SQL: Structured Query Language,结构化查询语言,是一种在关系型数据库中用于管理数据的标准语言.SQL是一种声明式编程语言,即只需表明需要什么而无需关注实现细节( ...
随机推荐
- CSS之3D翻转效果
<!DOCTYPE html> <html> <head> <title></title> <style type="tex ...
- Kubernetes---修改证书可用年限
kubeadm---修改apiserver证书有效期 源码编译自签证书: 需要有go环境,从github源码仓库拉取k8s对应版本的源码进行修改/编译.覆盖原来的kubeadm即可. 1.查询证书可用 ...
- 编译wasm Web应用
刚学完WebAssembly的入门课,卖弄一点入门知识. 首先我们知道wasm是目标语言,是一种新的V-ISA标准,所以编写wasm应用,正常来说不会直接使用WAT可读文本格式,更不会用wasm字节码 ...
- 《最新出炉》系列初窥篇-Python+Playwright自动化测试-29-处理日历时间控件-中篇
1.简介 上一篇的日历时间控件宏哥介绍的比较传统也是很常见的.宏哥不能说它很low,但是相比较一些高端.大气.上档次的日历时间控件,结果就一目了然了:确实很low. 2.被测网站 2.1高大上日历时间 ...
- 二、RHEL8操作系统安装
一.如何安装rhel的操作系统? 必要的前提条件:硬件(CPU.内存.硬盘--) + 安装介质(操作系统的安装文件) 会不会把自己的笔记本装成rhel的操作系统呢? 不会 使用虚拟机软 ...
- java笔记——面向对象
1.概述:面向对象是基于面向过程的编程思想 举例:把大象装进冰箱 2.开发:不断的创建对象,使用对象,指挥对象做事情 3.面向对象特征:封装 , 继承 , 多态 4.类和对象的关系: 类是一组相关的属 ...
- Kotlin协程系列(一)
一.协程的定义 最近看了一本有关kotlin协程的书籍,对协程又有了不一样的了解,所以准备写一个关于kotlin协程系列的文章. 言归正传,我们在学习一个新东西的时候,如果连这个东西"是什么 ...
- 【UniApp】-uni-app-OptionAPI应用生命周期和页面生命周期
前言 好,经过上个章节的介绍完毕之后,了解了一下 uni-app-修改组件主题和样式 那么了解完了uni-app-修改组件主题和样式之后,这篇文章来给大家介绍一下 uni-app-OptionAPI应 ...
- [HDU4117] GRE
Recently George is preparing for the Graduate Record Examinations (GRE for short). Obviously the mos ...
- 设备唯一标识方法(Unique Identifier):如何在 Windows 系统上获取设备的唯一标识
原文地址 设备唯一标识方法(Unique Identifier):如何在 Windows 系统上获取设备的唯一标识 zz 唯一的标识一个设备是一个基本功能,可以拥有很多应用场景,比如软件授权(如何保证 ...