建议使用以下浏览器,以获得最佳体验。 ie 9.0 以上版本 chrome 31 谷歌浏览器 firefox 30 火狐浏览器
温馨提示

抱歉,您需设置社区昵称后才能参与社区互动!

前往修改
我再想想
选择版块
主题:324帖子:963

【酷哥说库】

opengauss内核分析(二):简单查询的执行

2022/6/1 1743

上一期酷哥分析了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_**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语句即可开始调试


回复3

0 0
2022/6/4 23:12

谢谢分享

0 0
2022/6/8 22:56

感谢分享

0 0
2022/6/8 23:02

感谢分享

上划加载中
直达楼层
全部回复
正序浏览
标签
您还可以添加5个标签
  • 没有搜索到和“关键字”相关的标签
  • 云产品
  • 星辰平台的解决方案
  • 技术领域
  • 通用技术
  • 平台功能
取消

opengauss内核分析(二):简单查询的执行-星辰平台

您已采纳当前回复为最佳回复

发帖: 162粉丝: 5

级别 : 版主,版块专家

发表于2022年06月01日 16:29:03 1743 3
直达本楼层的链接
楼主
[酷哥说库] opengauss内核分析(二):简单查询的执行

上一期酷哥分析了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_**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语句即可开始调试


分享文章到朋友圈

分享文章到微博
您已采纳当前回复为最佳回复

zdnyyh

发帖: 2粉丝: 2

发表于2022年06月04日 23:12:36

谢谢分享

您已采纳当前回复为最佳回复

红鲤鱼与绿鲤鱼

发帖: 2粉丝: 2

发表于2022年06月08日 22:56:04

感谢分享

您已采纳当前回复为最佳回复

慕雪

发帖: 2粉丝: 2

发表于2022年06月08日 23:02:27

感谢分享

您需要登录后才可以回帖 | 立即注册

您对问题的回复是否满意?
满意度
非常满意 满意 一般 不满意
我要反馈
0/200