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是一种声明式编程语言,即只需表明需要什么而无需关注实现细节( ...
随机推荐
- umich cv-5-1 神经网络训练1
这节课中介绍了训练神经网络的第一部分,包括激活函数的选择,权重初始化,数据预处理以及正则化方法 训练神经网络1 激活函数 数据预处理 权重初始化 正则化方法 激活函数 这部分主要讨论我们之前提到的几种 ...
- Django + celery + redis 执行异步任务及查看结果
官方文档 https://docs.celeryproject.org/en/latest/django/first-steps-with-django.html#using-celery-wit ...
- Flyweight 享元模式简介与 C# 示例【结构型6】【设计模式来了_11】
〇.简介 1.什么是享元模式? 一句话解释: 将相似或同类的对象共享同一个对象,将这些对象暂存在列表中,使用时直接取出,避免每次使用时都要新建浪费资源. 享元模式的目的是减少对象的创建,通过共享对 ...
- JUC并发编程学习(五)集合类不安全
集合类不安全 List不安全 单线程情况下集合类和很多其他的类都是安全的,因为同一时间只有一个线程在对他们进行修改,但是如果是多线程情况下,那么集合类就不一定是安全的,可能会出现一条线程正在修改的同时 ...
- 从零实现的浏览器Web脚本
从零实现的浏览器Web脚本 在之前我们介绍了从零实现Chrome扩展,而实际上浏览器级别的扩展整体架构非常复杂,尽管当前有统一规范但不同浏览器的具体实现不尽相同,并且成为开发者并上架Chrome应用商 ...
- 两个对于电影片段的情绪研究(中国&国外)
1.国内的研究(A new standardized emotional film database for Asian culture) 测试片使用了8种情绪类型,每部片子有4个维度的分数,分数是从 ...
- 中间件IIS监控指标、配置和Windbg调试分析
1. 关键性能计数器指标 a. Web服务(W3SVC)性能计数器 当前连接数(Current Connections):显示当前所有HTTP连接的数量.过高的数值可能表明网站流量过大或连接无法及时释 ...
- iNeuOS工业互联网操作系统,高效采集数据配置与应用
1. 概述 2. 通讯原理 3. 参数配置 1. 概述 某生产企业世界500强的集团能源管控平台项目建设,通过专线网络实现异地厂区数据集成,每个终端能源仪表都有IP地址,总共有1000多台能源表 ...
- 基于python的Linux服务器资源监控
介绍 项目地址: https://github.com/leeyoshinari/performance_monitor 已完成如下功能 1.监控整个服务器的CPU使用率.io wait.内存使用.磁 ...
- [ARC169E] Avoid Boring Matches
题解链接 非常厉害的一道题. 考虑无解是什么情况? R 的个数超过 \(2^{n-1}\) 先考虑如何判定.从前往后考虑,如果遇到一个 B,那么如果后面有 R,就选最靠前的 R,否则选最靠后的一个 B ...