- 博客(147)
- 收藏
- 关注
原创 【PostgreSQL内核学习:并行聚合(Parallel Aggregation)】
PostgreSQL,作为一款开源关系型数据库的佼佼者,通过引入并行查询机制,巧妙地将计算任务分发至多个worker线程,实现高效的分布式处理。其中,并行聚合(Parallel Aggregation)尤为引人注目:它将聚合操作拆分为Partial Aggregate阶段——每个worker独立处理数据子集,生成中间状态;随后通过Gather节点汇集输出,最终由Finalize Aggregate节点合并结果。这种设计不仅显著提升了GROUP BY和聚合函数的执行速度,还确保了查询的正确性和可扩展性。本文将
2025-11-18 10:40:43
421
原创 【PostgreSQL内核学习:表达式】
PostgreSQL内核中的表达式初始化机制:通过ExecInitExpr函数将SQL表达式(如条件判断、计算列)转换为可执行的指令序列。该过程首先创建执行计划书(ExprState),检查表达式树结构,标记需要的数据源(如字段、子查询),生成具体执行步骤(如读取字段、运算操作),最后添加结束标志并校验执行计划。关键子函数ExecCreateExprSetupSteps负责分析表达式依赖关系,而expr_setup_walker则递归遍历表达式树识别变量来源和特殊子查询,为后续执行准备必要环境数据。该机制实
2025-09-12 14:36:18
959
原创 【PostgreSQL内核学习 —— (SeqScan算子)】
本文分析了PostgreSQL 18中SeqScan算子的实现,重点解读了ExecInitSeqScan函数的源码。该函数用于初始化顺序扫描算子,主要完成以下工作:创建扫描状态结构体、设置执行上下文、打开扫描关系表、初始化元组槽和投影信息,并编译WHERE条件表达式。通过一个具体的SQL查询示例(SELECT * FROM employees WHERE salary > 50000),详细说明了函数在查询执行过程中如何将静态计划转换为可执行的运行时状态,包括内存分配、计划节点关联、关系表打开等关键步
2025-09-11 17:53:06
919
原创 【PostgreSQL内核学习:基于 ExprState 的哈希计算优化—— GROUP BY 与 SubPlan 的性能提升】
这个 PostgreSQL 优化 Patch 针对哈希连接(Hash Join)引入了新的 ExprState 支持,通过 ExecBuildHash32Expr 函数一次性计算多个连接键的 32 位哈希值,显著减少了元组变形(tuple deformation)和重复表达式评估的开销。
2025-09-08 11:38:43
1081
原创 【PostgreSQL内核学习:通过 ExprState 提升哈希聚合与子计划执行效率(二)】
本文以PostgreSQL内核中的ExecBuildHash32FromAttrs函数为核心,通过一个分组查询示例详细解析了哈希计算执行计划的构建过程。文章首先给出一个按地区和部门分组统计销售额的SQL查询示例,然后逐行分析该函数如何为GROUP BY列(region和department)构建哈希计算的ExprState执行计划。关键步骤包括:初始化ExprState节点、配置元组解构操作、遍历目标列构建哈希函数调用链,以及处理多列哈希值的组合计算。通过结合具体代码与示例数据,清晰展示了PostgreSQ
2025-08-28 20:17:53
1191
原创 【PostgreSQL内核学习:通过 ExprState 提升哈希聚合与子计划执行效率(一)】
本文介绍了PostgreSQL内核中通过引入ExprState优化哈希聚合与子计划执行效率的技术方案。该补丁重构了哈希计算逻辑,利用ExprState表达式执行框架减少函数调用开销,并支持JIT编译优化。测试显示其可提升哈希聚合性能约15%,哈希NOT IN查询性能30%以上。补丁还改进了哈希值扰动方式,减少冲突概率。这一优化不仅提升了GROUP BY和子查询的执行效率,还为未来JIT编译扩展奠定了基础,是PostgreSQL性能优化的重要进展。
2025-08-27 16:49:31
1082
原创 【PostgreSQL内核学习:slot_deform_heap_tuple 的分支消除与特化路径优化】
PostgreSQL内核优化:slot_deform_heap_tuple的分支消除与性能提升 本文分析了PostgreSQL中元组解构函数slot_deform_heap_tuple的性能优化。原始实现存在重复检查NULL值和偏移量缓存的问题,导致大量不必要的分支跳转。优化补丁通过以下改进显著提升性能: 引入内联函数slot_deform_heap_tuple_internal,分离慢速模式(动态计算偏移量)和非慢速模式(使用缓存偏移量)的处理逻辑 一次性检查HeapTupleHasNulls,避免循环中
2025-08-21 15:21:20
793
原创 【PostgreSQL内核学习:WindowAgg 节点对 Tuplestore 的复用机制】
下面为本次优化的提交信息,hash性能提升:平均提升11.49%(约812.78 ms),优于优化前的,验证了补丁通过复用tuplestore减少内存分配开销的效果。稳定性:优化后执行时间波动较小(),表明优化提高了性能稳定性。与预期差异:提升低于补丁声称的40%,可能因测试场景(如分区数量、硬件)不同,建议进一步测试更大分区数(如100万分区)以接近补丁目标。
2025-08-20 16:54:11
990
原创 【PostgreSQL内核学习:WindowAgg 性能优化】
PostgreSQL内核优化:WindowAgg性能提升分析 PostgreSQL 18 beta2版本针对窗口函数性能进行了优化,重点改进了WindowAgg操作的执行效率。本次优化通过重构nodeWindowAgg.c文件中的代码,将窗口框架偏移量计算逻辑从ExecWindowAgg函数中提取出来,形成独立的calculate_frame_offsets函数。核心优化点在于避免了重复计算固定的框架偏移量(如ROWS BETWEEN子句中指定的值),这些值在查询执行期间保持不变。测试数据显示,该优化在部分
2025-07-31 20:33:46
304
原创 【PostgreSQL内核学习:WindowAgg 帧优化与节点去重】
本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的情况下注明引用来源。本文主要参考了的开源代码和《》一书。
2025-07-30 17:25:46
1212
原创 【PostgreSQL内核学习:深入理解 PostgreSQL 中的 tuplesort_performsort 函数】
在 PostgreSQL 的元组排序(tuplesort)模块中,tuplesort_performsort 是一个核心函数,负责执行排序的主要逻辑。它根据当前的排序状态(state->status)选择不同的排序策略,处理串行和并行排序场景,并确保内存管理的高效性。本文将详细分析该函数的实现细节,探讨其作用、逻辑结构、状态转换以及相关优化策略,以帮助读者更好地理解 PostgreSQL 的排序机制。
2025-04-03 17:50:22
1247
原创 【PostgreSQL内核学习 —— (sort算子)】
在PostgreSQL中,Sort算子用于对输入数据进行排序以满足查询的ORDER BY要求,其执行流程与执行器框架紧密关联。当执行器启动时,Sort算子会初始化内存缓冲区(由work_mem参数控制),通过下层算子(如SeqScan)逐行拉取数据并存储为SortTuple结构。若内存不足,数据会被分块排序后写入磁盘临时文件(称为“tape”),采用外部归并排序)完成最终排序。优先使用快速排序(quicksort)对内存中的数据块进行排序,并支持增量排序()以利用索引预排序优化多字段排序。
2025-03-27 10:19:20
869
原创 【OpenGauss源码学习 —— (SortGroup算子)】
基于OpenGauss的数据分组聚集方法。该专利提出了一种基于OpenGauss的高效数据分组聚集方法,旨在解决现有技术在处理海量数据时因无效排序和分组导致的性能问题,下面一起来学习一下专利所提出的方案。传统的SQL聚集操作(如COUNTMAXMINSUMAVG)在进行GROUP BY和ORDER BY处理时,可能会导致大量无用数据的计算,从而降低系统性能。现有方案通常是:先分组再排序,但所有数据都需要先分组计算,即使最终只需要Top-N组,仍会处理所有数据,造成不必要的计算开销。先排序再分组。
2025-03-20 13:50:26
1124
原创 【PostgreSQL内核学习 —— (WindowAgg(三))】
通过上述详细的例子和逐行分析,函数的作用是基于窗口函数的单调性和操作符表达式(如<=)来决定是否可以优化窗口函数的计算,从而避免不必要的计算。通过合理的优化,查询的执行效率得到提升。
2025-02-06 15:34:38
1375
原创 【PostgreSQL内核学习 —— (WindowAgg(二))】
本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的情况下注明引用来源。本文主要参考了的开源代码和《》一书在中,我们介绍了窗口函数以及窗口聚合的核心计算过程。本文我们继续学习WindowAgg算子的具体实现逻辑。
2025-02-05 17:00:34
1283
原创 【PostgreSQL内核学习 —— (WindowAgg(一))】
书中详细描述了 WindowAgg 节点在 PostgreSQL 中处理窗口函数时的执行过程,包括如何管理分区、排序、聚合等。通过 WindowAggState 和相关的数据结构,窗口聚合可以高效地计算多个窗口函数,同时保持对数据的完整性。性能优化方面,窗口函数的排序和缓存机制也起到了关键作用,帮助提升计算效率。
2025-01-24 16:49:30
1330
原创 【OpenGauss源码学习 —— (VecSortAgg)】
在 openGauss (OG) 中,VecSortAgg 是一种基于矢量化的排序聚合操作,它用于在执行 SQL 查询时高效地对数据进行分组和聚合。与传统的逐行处理不同,VecSortAgg 通过批量处理数据来提高计算效率,特别适用于大规模数据集的聚合操作。VecSortAgg 支持诸如 GROUP BY 和 ROLLUP 等复杂的分组和多阶段聚合操作。其实现中包含了排序、去重、聚合函数应用等步骤,且通过内存管理机制(如批处理缓存和排序器)优化了内存使用,确保计算的高效性和稳定性。
2024-10-14 15:06:59
1220
原创 【OpenGauss源码学习 —— (VecGroup)】
本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的情况下注明引用来源。本文主要参考了的开源代码和一书。
2024-10-10 16:41:18
687
原创 【OpenGauss源码学习 —— (VecAgg)】
本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的情况下注明引用来源。本文主要参考了的开源代码和一书和四个函数共同构成了。在查询计划的执行过程中,用于,为后续的聚合操作做好准备;则负责,根据不同的聚合策略(如哈希聚合、排序聚合等)调用相应的聚合运行器进行数据处理;用于和,确保不再使用的资源能够得到妥善处理;而则负责。这些函数相互联系,形成了一个完整的向量化聚合执行框架,确保在执行查询时能够高效、准确地处理聚合操作。
2024-10-08 17:19:55
997
原创 【OpenGauss源码学习 —— (ALTER TABLE(修改表空间))】
在OpenGauss 数据库中,ALTER TABLE ... SET TABLESPACE 命令允许将表和索引移动到新的表空间,这对于管理数据存储和性能优化至关重要。这条命令的主要语法是ALTER TABLE table_name SET TABLESPACE new_tablespace; 其中,table_name 是要移动的表的名称,new_tablespace 是目标表空间的名称。
2024-06-24 19:53:33
1397
原创 【OpenGauss源码学习 —— (ALTER TABLE(SET attribute_option))】
本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的情况下注明引用来源。本文主要参考了的开源代码和一书是一种命令,。在中,这种命令可以用来改变列的默认值、是否允许为空、数据类型等属性,以满足不同的业务需求或数据结构变更。在的源代码中,处理和的逻辑通常涉及到调用函数。例如,当命令中包含) 时,会执行函数来实际应用这些选项,而当包含) 时,则会反向执行这些选项的。函数的作用是根据传入的参数,。
2024-06-21 14:23:34
1128
原创 【OpenGauss源码学习 —— (ALTER TABLE(调整表中特定列的统计目标))】
本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的情况下注明引用来源。本文主要参考了的开源代码和一书命令用于。通过,数据库查询优化器能够更准确地估算查询结果的选择性,从而生成更高效的查询计划。在中,函数负责执行这一操作,确保新统计信息的正确应用和存储,从而提高数据库的整体性能和效率。
2024-06-20 17:19:10
1121
原创 【OpenGauss源码学习 —— (ALTER COLUMN SET/DROP DEFAULT)】
本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的情况下注明引用来源。本文主要参考了的开源代码和一书。
2024-06-19 11:16:12
928
原创 【OpenGauss源码学习 —— (ALTER TABLE(列存修改列类型))】
在数据库管理中,改变表中列的类型是一个常见的操作。这种操作通常通过ALTER TABLE ALTER COLUMN TYPE语句来实现,它允许数据库管理员在不删除和重新创建表的情况下更改列的数据类型。这种操作需要确保数据的正确性和一致性,并且在某些情况下,还需要重写表中的数据来适应新的数据类型。
2024-06-18 17:54:18
1468
原创 【OpenGauss源码学习 —— (ALTER TABLE(列存删除列))】
代码修改要点:本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的情况下注明引用来源。本文主要参考了的开源代码和一书在数据库管理系统中,命令用于修改表的结构,允许用户。在处理列存储表(表)时,删除列的操作尤为复杂,因为。表将每一列的数据独立存储,这意味着在删除列时,。在执行命令时,核心函数扮演着重要角色。该函数负责。特别是在列存储表中,需要对列描述信息()进行清理,并安排在事务提交时,以确保整个操作的原子性。
2024-06-18 15:26:25
1222
原创 【OpenGauss源码学习 —— (ALTER TABLE(CStoreRewriter))】
OpenGauss源码学习 —— (ALTER TABLE(ExecRewriteCStoreTable))】这篇文章详细介绍了OpenGauss数据库中命令的实现细节,特别是涉及到列存储表的重写操作其中,通过重写操作,帮助优化存储在列存储表中的数据的物理布局,这包括数据的压缩和重组,以提高查询效率和减少存储空间。在重写过程中,确保所有的表约束(如NOT NULL约束)和表结构更改(如列的添加或删除)都得到妥善处理,确保数据完整性不受影响。重写操作还涉及更新与表相关的元数据,以反映重写后的新状态,例如。
2024-05-10 14:41:09
1050
原创 【OpenGauss源码学习 —— (ALTER TABLE(ExecRewriteCStoreTable))】
【OpenGauss源码学习 —— (ALTER TABLE(ExecRewriteRowTable))】这篇文章详细描述了OpenGauss数据库管理系统中执行命令的源码实现。和都是用于重写表的数据的函数,但是它们针对的表类型不同。主要用于重写列存储表的数据,而则用于重写行存储表的数据。因此,它们的关系在于它们都是用于表数据重写的功能,但是针对的表类型不同,分别适用于列存储表和行存储表。本文,我们来学习一下函数的内容。
2024-05-09 11:33:11
1317
原创 【OpenGauss源码学习 —— (ALTER TABLE(ExecRewriteRowTable))】
【OpenGauss源码学习 —— (ALTER TABLE(Add Column))】这篇文章深入分析了OpenGauss数据库管理系统中执行命令的源码实现。文章探讨了系统如何处理向表中添加新列的过程,包括检查约束、设置默认值以及保证数据完整性的机制。特别提到了函数,它负责管理添加列的过程。此外,文章还为理解更复杂的表结构修改提供了基础,特别是涉及到函数,该函数对于处理表结构变化和数据重组至关重要。在函数中,用于执行表的重写操作。和是两个索引分别决定了。
2024-04-28 16:41:54
1076
原创 【OpenGauss源码学习 —— (ALTER TABLE(Add Column))】
Add Column用于向已存在的数据库表中添加新的列。这个过程涉及到更新表的元数据,以及可能对表的物理结构进行调整,特别是在需要初始化新列的默认值时。在数据库系统中,执行Add Column操作通常需要考虑锁定机制以避免与其他数据库操作冲突,并且必须确保数据的完整性和一致性不被破坏。此外,添加列的操作还可能触发相关的事件触发器,这些触发器可以用于执行一些定制的逻辑,如自动更新相关视图或维护日志等。整个过程需要高效地管理,以最小化对数据库性能的影响,特别是在涉及大量数据或高并发环境下。
2024-04-28 14:29:18
3600
原创 【PostgreSQL内核学习(三十)—— 执行器(ExecCreateTableAs)】
本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的情况下注明引用来源。本文主要参考了的开源代码和和《》一书。
2024-04-10 16:44:16
1287
原创 【PostgreSQL内核学习(二十九)—— 执行器(ExecProcNode)】
在文章【PostgreSQL内核学习(二十二)—— 执行器(ExecutePlan)】中详细介绍了PostgreSQL数据库中函数的原理和实现细节,强调了它在数据库查询执行机制中的核心作用。文章分析了函数的执行流程,包括初始化变量处理并行执行模式循环执行查询计划节点直到满足退出条件等步骤。此外,还介绍了函数的作用,即执行给定计划节点并返回元组。本文将深入了解的原理和实现细节函数是函数流程中的关键部分,负责实际执行查询计划树中的各个节点并返回结果元组。通过循环调用。
2024-04-03 15:34:33
1465
原创 【OpenGauss源码学习 —— 执行算子(Nest Loop 算子)】
连接算子用于处理表关联,openGauss支持12种连接类型(等),提供了3算子;其中,在先前的学习中,【OpenGauss源码学习 —— 执行算子(hash join 算子)】一文中详细介绍了hash join算子的执行过程。【OpenGauss源码学习 —— 执行算子(Merge Join 算子)】一文中学习了Merge Join算子的执行过程。本文则来继续学习另一个扫描算子Nest Loop算子。Nest Loop可以处理各种连接类型,包括内连接左连接右连接和全连接。对于小型数据集或者。
2024-02-28 16:07:24
1097
原创 【PostgreSQL内核学习(二十八) —— 执行器 (表达式计算) 】
在PostgreSQL系统的执行器模块中,“表达式计算” 是一个核心功能,它负责处理和评估SQL查询中的各种表达式,包括算术运算逻辑判断函数调用等。这一过程涉及解析查询中的表达式树,然后按照操作符和函数的定义,逐节点计算表达式的值。执行器会利用类型系统来处理不同数据类型之间的操作,并可能涉及类型转换以确保操作的正确性。此外,表达式计算还可能包括对表达式中涉及的列数据进行访问和检索,以及应用优化策略如索引查找或缓存结果以提高计算效率。通过这一系列复杂的计算过程,PostgreSQL。
2024-02-27 16:48:17
1459
原创 【PostgreSQL内核学习(二十七) —— (编码转换)】
PostgreSQL处理客户端和服务器端字符集匹配问题的机制是复杂且灵活的,能够确保数据在不同编码之间传输时保持其原始的意义和结构,从而避免了乱码问题。这一机制主要涉及字符集的识别转换和验证过程,以确保从客户端发送到服务器的数据能够被正确解释和存储,即使客户端和服务器使用的是不同的字符编码(例如,客户端使用 GBK,而服务器使用 UTF-8编码设置和识别•客户端可以在与服务器建立连接时指定其使用的字符编码。这允许客户端告诉服务器它将以何种编码发送数据。例如,一个使用GBK 编码的客户端。
2024-02-23 16:16:34
1852
原创 【PostgreSQL内核学习(二十六) —— (共享数据缓冲区)】
PostgreSQL的共享数据缓冲区()是数据库系统中用于存储从磁盘读取的数据页的内存区域,以便快速重用这些数据,从而减少对磁盘的访问次数和提高查询性能。当数据库需要访问某个数据页时,它首先检查该页是否已在共享数据缓冲区中;如果是直接从内存中读取数据,否则从磁盘加载数据页到缓冲区再进行访问。共享数据缓冲区的大小是可配置的,通过调整参数来实现,这个参数定义了缓冲区分配的内存量。理想的缓冲区大小取决于系统的总内存数据库的工作负载以及其他内存需求。
2024-02-04 10:57:06
1503
原创 【PostgreSQL内核学习(二十五) —— (DBMS存储空间管理)】
在数据库管理系统(DBMS)中,空间管理是指如何在物理存储介质上组织、管理和优化数据的存储。这是DBMS性能和效率的关键因素之一。块(或页面)区间(区域或范围)段表空间和数据库。块(或页面)块(在Oracle中称为块,在SQL Server和PostgreSQL中称为页面是数据库管理系统存储数据的基本单位。一个块通常是从磁盘上以固定大小读取和写入的数据块,这个大小可以是等,根据数据库的配置而定。每个块包含了一系列的记录,这些记录是数据库中存储的实际数据。区间(Extents)区间是一系列连续的块。
2024-02-02 14:54:36
1052
原创 【PostgreSQL内核学习(二十四) —— (ALTER MATERIALIZED VIEW)】
是一个SQL命令,用于修改一个已经存在的物化视图的定义或行为。物化视图是一种特殊的数据库对象,它存储了查询结果的实际数据,与普通视图(仅保存查询逻辑)不同。这使得物化视图在处理复杂查询和提高数据检索效率方面非常有用,特别是在涉及大量数据和复杂联结的情况下。使用命令,您可以进行各种修改,比如重命名物化视图更改其底层查询逻辑更新或刷新其中的数据更改存储参数或者修改与物化视图相关的安全和访问规则。这个命令提供了灵活性来维护和优化物化视图,确保它们保持最新并有效地服务于数据库应用程序的需求。在。
2024-01-17 11:34:18
1426
原创 【PostgreSQL内核学习(二十三)—— 执行器(ExecEndPlan)】
在这三篇文章中,首先是【OpenGauss源码学习 —— 执行器(execMain)】,它详细探讨了OpenGauss数据库管理系统中执行器模块的主要功能和实现机制。这部分内容涉及到如何在 OpenGauss 环境下处理和执行SQL语句,包括查询计划的生成和优化,以及如何有效地管理数据流和处理结果。接着,【PostgreSQL内核学习(二十一)—— 执行器(InitPlan)】专注于PostgreSQL数据库的执行器模块,特别是初始化计划(InitPlan)的部分。这篇文章讨论了在。
2024-01-16 10:36:02
1314
原创 【PostgreSQL内核学习(二十二)—— 执行器(ExecutePlan)】
在文章【OpenGauss源码学习 —— 执行器(execMain)】中,我们深入探究了执行器在数据库中的核心功能和逻辑。这篇文章详细介绍了执行器的主要组成部分,如查询执行的初始化与结束主执行循环、以及行处理逻辑等。通过这篇文章,读者可以了解到执行器是如何在数据库系统中处理用户的查询请求,包括如何遍历执行树执行计划节点,以及如何对数据进行操作和传递。另一方面,文章【PostgreSQL内核学习(二十一)—— 执行器(InitPlan)】则专注于介绍了InitPlan函数在PostgreSQL。
2024-01-15 16:44:22
1664
1
通过预先计算恒定帧偏移来优化WindowAgg的修改patch
2025-07-31
TPC-H V 3.0.1
2024-01-11
差分演化算法相关学术论文集合
2023-11-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅