PostgreSQL源码修改 ——查询优化一

目录

目录... 1

图表目录... 4

第一章 引言... 6

1.1 项目修改目标... 6

1.1.1 问题描述... 6

1.1.2 涉及部分... 6

1.2 本报告组织形式... 6

1.3 已做的代码阅读工作简述... 6

第二章 问题分析——查询优化执行流程... 8

2.1 问题总体分析... 8

2.2 查询优化整体流程... 8

2.3 ExecLimit详细分析... 9

2.3.1 ExecLimit关键代码及注释... 9

2.3.2 ExecLimit流程分析与描述... 12

2.3.3 ExecLimit流程图解... 12

2.4 ExecSort详细分析... 12

2.4.1 ExecSort关键代码及注释... 12

2.4.2 ExecSort流程分析与描述... 13

2.4.3 ExecSort程图解... 13

2.5 tuplesort_performsort详细分析... 14

2.5.1 tuplesort_performsort关键代码及注释... 14

2.5.2 tuplesort_performsort流程分析与描述... 15

2.5.3 tuplesort_performsort 流程图解... 16

2.6 重要的数据结构分析... 16

2.6.1 PlanState. 16

2.6.2 LimitState. 17

2.6.3 SortState. 17

2.6.4 Tuplesortstate. 18

2.7 外存处理流程分析... 18

2.7.1多阶段合并算法... 18

2.7.2 PostgreSQL中多阶段合并算法实现流程... 20

第三章 解决方案设计与实现... 21

3.1 总体思路... 21

3.1.1 参数的传递思路... 21

3.1.2 执行流程修改思路... 21

3.2 简单选择置换方案... 21

3.2.1 方案设计思路... 21

3.2.2参数传递... 21

3.2.3 流程修改... 24

3.2.4 代价分析... 27

3.3 Select(S,K)算法方案... 27

3.3.1 方案设计思路... 27

3.3.2参数传递... 28

3.3.3 流程修改... 28

3.3.4 代价分析... 33

3.4 外存修改方案... 33

3.4.1 方案设计思路... 33

3.4.2 参数传递... 34

3.4.3 流程修改... 36

3.4.4 优化分析... 38

第四章 解决方案测评... 39

4.1 测评方案... 39

4.2 测试结果... 40

4.3 总体评价... 40

4.3.1 时间复杂度大为降低... 40

4.3.2 扩展性很好... 41

4.3.3 健壮性比较强... 41

4.3.4 代码风格良好... 41

第五章 遇到的问题及解决方案... 42

5.1 “奇怪”的段错误... 42

5.1.1 问题后果及前因... 42

5.1.2 问题解决之道... 42

5.1.3 经验 结论 技巧... 42

5.2 不能Debug出来的宏错误... 42

5.2.1 问题后果及前因... 42

5.2.2 问题解决之道... 44

5.2.3 经验 结论 技巧... 44

5.3 结构体成员访问错误... 44

5.3.1 问题后果及前因... 44

5.3.2 问题解决之道... 44

5.3.3 经验 结论 技巧... 44

5.4 “防不胜防”的下标出错... 44

5.4.1 问题后果及前因... 44

5.4.2 问题解决之道... 44

5.4.3 经验 结论 技巧... 45

5.5 “不可思议”的死循环... 45

5.5.1 问题后果及前因... 45

5.5.2 问题解决之道... 45

5.5.3 经验 结论 技巧... 47

第六章 心得体会... 48

6.1 版本控制 提纲挈领... 48

6.1.1 版本控制 事关重大... 48

6.1.2 统一注释方便搜索... 48

6.1.3 建立映像文件夹 只保存修改文件... 48

6.2 小议内存 指针乃王道... 48

6.2.1 程序员与内存... 48

6.2.2 类型与变量 指针变量与内存布局... 48

6.2.3 类型与函数 定义与声明... 49

6.3 面向对象 大势所趋... 49

6.3.1 面向过程与面向对象... 49

6.3.2 C与伪继承... 50

6.3.3 C与多态... 50

6.4 编程经验积累... 50

6.4.1 编译与运行 静态与动态... 50

6.4.2 继承与组合 统一与灵活... 51

6.5 一份耕耘 一分收获... 51

参考文献: 51


图表目录

图表 1exec_simple_query总体流程... 8

图表 2:示例语句的计划树结构... 9

图表 3ExecLimit关键代码及注释... 11

图表 4ExecLimit流程图解... 12

图表 5ExecSort关键代码及注释... 13

图表 6ExecSort流程图解... 14

图表 7:tuplesort_performsort关键代码及注释... 15

图表 8tuplesort_performsort 流程图解... 16

图表 9PlanState关键代码及注释... 16

图表 10LimitState关键代码及注释... 17

图表 11SortState 关键代码及注释... 17

图表 12Tuplesortstate关键代码及注释... 18

图表 13:多阶段合并算法流程示意图... 19

图表 14:多阶段合并算法算法步骤... 19

图表 15SortState修改关键代码及注释... 22

图表 16ExecLimit修改关键代码及注释... 23

图表 17ExecSort修改关键代码 及注释... 24

图表 18my_tuplesort_performsort关键代码及注释... 26

图表 19my_simple_select_sort算法实现代码及注释... 27

图表 20Select(S,K)的算法思想和伪码... 28

图表 21Select(S,K)中子问题示意图... 28

图表 22Select(S,K)所有相关代码及注释... 33

图表 23Select(S,K)子问题规模示意图... 33

图表 24Tuplesortstate修改代码及注释... 35

图表 25Tuplesortstate的参数传递... 36

图表 26beginmerge修改关键代码及注释... 38

图表 27:测试方案实现代码... 40

图表 28:用宏实现的swap注释及测试代码... 43

图表 29:“不可思议”的死循环BUG的跟踪观察结果... 45

图表 30:“不可思议”的死循环问题的解决代码... 46

图表 31:类的内存布局测试代码... 49


PostgreSQL源码修改报告

——查询优化

PostgreSQL是一个优秀的开放源码数据库管理软件,阅读分析其实现代码,并在其基础上修改或扩展其功能,对于学习《数据库系统实现》课程和提高自己实践能力都有很大的帮助。

本文着力于分析PostgreSQL的查询处理的部分的流程与实现,为在PostgreSQL基础上实现查询优化的扩展功能。

关键词:PostgreSQL;查询处理;查询优化; 数据库系统实现;代码修改;课程实习


第一章 引言

1.1 项目修改目标

1.1.1 问题描述

返回行数限制的优化。原来:真正对查询结果排序后才返回指定行。希望能修改为:查询结果进行一遍扫描即返回指定行。

比如select * from teacher order by name limits 2 offset 1.原来PostgreSQL是全排序后返回第2和第3大的元素。现在希望不用全排序,也可以返回正确的两个元组。

1.1.2 涉及部分

查询优化和执行。控制和修改查询树执行的流程。

1.2 本报告组织形式

本文主体部分共分六章。

第一章 引言,提出问题,主要介绍了实习的目标和之前做的代码阅读情况。

第二章 分析问题,详细分析了目标相关的所有重要的执行模块流程及数据结构。在每个模块流程分析的小节中,又分为关键代码及注释、流程分析与描述和流程图解三部分,从不同的角度分析模块的执行与实现。所有对流程以分析又可以分为两种,一种是对内存模式的分析,一种是对外存模式的分析,其中,内存模式是本文的重点。

第三章 解决问题,在提出总体思路之后,又分别提出三种不同的解决方案的设计和实现。在每个方案中,又可分为四节:方案设计思路、参数传递、流程修改、代价分析。第一节为方案的总体设计思路,第二与第三节为方案的具体实现,含有关键的代码及注释。第四节为方案的评测,对方案提出的算法设计,进行理论上的算法代价估计。

第四章 解决方案测评,就测试方案,测试结果和总体评价三个方面对提出的解决方案做一个实际用例的测试和评价。

第五章 遇到的问题及解决方案,主要是记录在具体的实习的过程中,总结了自己遇到的部分实际问题,我们觉得这些实际的问题具有一定的普遍性,因此归纳出来,以方便后续的研究者。每个问题都分为三小节,分别叙述“问题后果及前因”、“问题解决之道”及“经验 结论 技巧”。

最后一章第六章 为实习的心得体会。主要是对项目管理、程序设计、C特性和编程经验的总结,最后还有一点小小的感言,以鼓励他人,也鼓励自己。

1.3 已做的代码阅读工作简述

通过前期有代码阅读,我们已经知道:PostgreSQL从用户输入查询到最后结果的输出可以分为两个大的部分:前台处理和后台执行。其中后台执行又有四个部分:Parser,Rewriter,Planner,Executor。和本项目相关的是第四个部分。

前期的工作主要对前台处理和后台处理的四个部分的总体流程有了一个大概的分析。对其涉及到的数据结构也做了简要的分析。但修改代码应该落实到具体的数据结构与模块函数,因此,现在本期的工作就话在一些重要的函数的执行详细流程和一些重要的数据结构的运行上。

其中,和本项目最相关的是后台执行的Executor部分,这部分的输入是已经重写后生成的查询计划树。当PostgreSQL在执行查询计划树上的查询计划时,从根到孩子式的递归调用执行,直到执行完一棵计划树。

下面着重对Executor涉及的一些重要的函数执行流程做一些更为细致的分析。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读601次。Oracle的数据导入导出是一项基本的技能,但是对于懂数据库却不熟悉Oracle的同学可能会有一定的障碍。正好在最近的一个项目中碰到了这样一个任务,于是研究了一下Oracle的数据导入导出,在这里跟大家分享一下。......_oracle 迁移方法 对比
文章浏览阅读553次。开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共700多人左右 1 + 2)。最近我们在使用MYSQL 8 的情况下(8.025)在数据库运行中出现一个问题 参数prefer_order_i..._mysql prefer_ordering_index
文章浏览阅读3.5k次,点赞3次,收藏7次。折腾了两个小时多才成功连上,在这分享一下我的经验,也仅仅是经验分享,有不足的地方欢迎大家在评论区补充交流。_navicat连接opengauss
文章浏览阅读2.7k次。JSON 代表 JavaScript Object Notation。它是一种开放标准格式,将数据组织成中详述的键/值对和数组。_postgresql json
文章浏览阅读2.9k次,点赞2次,收藏6次。navicat 连接postgresql 注:navicat老版本可能报错。1.在springboot中引入我们需要的依赖以及相应版本。用代码生成器生成代码后,即可进行增删改查(略)安装好postgresql 略。更改配置信息(注释中有)_mybatisplus postgresql
文章浏览阅读1.4k次。postgre进阶sql,包含分组排序、JSON解析、修改、删除、更新、强制踢出数据库所有使用用户、连表更新与删除、获取今年第一天、获取近12个月的年月、锁表处理、系统表使用(查询所有表和字段及注释、查询表占用空间)、指定数据库查找模式search_path、postgre备份及还原_pgsql分组取每组第一条
文章浏览阅读3.3k次。上一篇我们学习了日志清理,日志清理虽然解决了日志膨胀的问题,但就无法再恢复检查点之前的一致性状态。因此,我们还需要日志归档,pg的日志归档原理和Oracle类似,不过归档命令需要自己配置。以下代码在postmaster.c除了开启归档外,还需要保证wal_level不能是MINIMAL状态(因为该状态下有些操作不会记录日志)。在db启动时,会同时检查archive_mode和wal_level。以下代码也在postmaster.c(PostmasterMain函数)。......_postgresql archive_mode
文章浏览阅读3k次。系统:ubuntu22.04.3目的:利用向日葵实现windows远程控制ubuntu。_csdn局域网桌面控制ubuntu
文章浏览阅读1.6k次。表分区是解决一些因单表过大引用的性能问题的方式,比如某张表过大就会造成查询变慢,可能分区是一种解决方案。一般建议当单表大小超过内存就可以考虑表分区了。1,继承式分区,分为触发器(trigger)和规则(rule)两种方式触发器的方式1)创建表CREATE TABLE "public"."track_info_trigger_partition" ( "id" serial, "object_type" int2 NOT NULL DEFAULT 0, "object_name..._pg数据表分区的实现
文章浏览阅读3.3k次。物联网平台开源的有几个,就我晓得的有、、thingskit、JetLink、DG-iot(还有其他开源的,欢迎在评论区留言哦!),然后重点分析了下ThingsBoard、ThingsPanel和JetLink,ThingsBoard和Jetlinks是工程师思维产品,可以更多的通过配置去实现开发的目的,ThingsPanel是业务人员思路产品,或者开发或者用,避免了复杂的配置带来的较高学习门槛。ThingsBoard和Jetlinks是Java技术体系的,ThingsPanel是PHP开发的。_jetlinks和thingsboard
文章浏览阅读3.8k次。PostgreSQL 数据类型转换_pgsql数字转字符串
文章浏览阅读7k次,点赞3次,收藏14次。在做数据统计页面时,总会遇到统计某段时间内,每天、每月、每年的数据视图(柱状图、折线图等)。这些统计数据一眼看过去也简单呀,不就是按照时间周期(天、月、年)对统计数据进行分个组就完了嘛?但是会有一个问题,简单的写个sql对周期分组,获取到的统计数据是缺失的,即没有数据的那天,整条记录也都没有了。如下图需求:以当前月份(2023年2月)为起点,往后倒推一年,查询之前一年里每个月的统计数据。可见图中的数据其实是缺少的,这条sql只查询到了有数据的月份(23年的1月、2月,22年的12月)_如何用一条sql查出按年按月按天的汇总
文章浏览阅读3.8k次,点赞66次,收藏51次。PostgreSQL全球开发小组与2022年10月13日,宣布发布PostgreSQL15,这是世界上最先进的开源数据库的最新版本_mysql8 postgresql15
文章浏览阅读1.3k次。上文介绍了磁盘管理器中VFD的实现原理,本篇将从上层角度讲解磁盘管理器的工作细节。_smgrrelationdata
文章浏览阅读1.1k次。PostgreSQL设置中文语言界面和局域网访问_postgressql汉化
文章浏览阅读4.2k次。PostgreSQL 修改数据存储路径_如何设置postgresql 数据目录
文章浏览阅读4.7k次。在项目中用到了多数据源,在连接postgres数据库时,项目启动报错,说数据库连接错误,说dual不存在,网上好多教程都是说数据库查询的时候的大小写问题,而这个仅仅是连接,咋鞥却处理方法是修改application-dev.yml中的配置文件.项目中的druid参数是这样的:确实在配置文件中有个查询语句。_relation "dual" does not exist
文章浏览阅读4.9k次。PostgreSQL是一款强大的关系型数据库,但在实际使用过程中,许多用户经常会遇到慢SQL的问题。这些问题不仅会降低数据库性能,还会直接影响业务流程和用户体验。因此,本文将会深入分析PostgreSQL慢SQL的原因和优化方案,帮助用户更好地利用这个优秀的数据库系统。无论你是初学者还是专业开发者,本文都将为你提供实用的技巧和方法,让你的PostgreSQL数据库始终保持高效快速。_postgresql数据库优化
文章浏览阅读1.6k次。Linux配置postgresql开机自启_linux 启动pgsql
文章浏览阅读2k次。本篇介绍如何在centos7系统搭建一个postgresql主备集群实现最近的HA(高可用)架构。后续更高级的HA模式都是基于这个最基本的主备搭建。_postgresql主备