- 博客(136)
- 收藏
- 关注
原创 【PostgreSQL内核学习:深入理解 PostgreSQL 中的 tuplesort_performsort 函数】
在 PostgreSQL 的元组排序(tuplesort)模块中,tuplesort_performsort 是一个核心函数,负责执行排序的主要逻辑。它根据当前的排序状态(state->status)选择不同的排序策略,处理串行和并行排序场景,并确保内存管理的高效性。本文将详细分析该函数的实现细节,探讨其作用、逻辑结构、状态转换以及相关优化策略,以帮助读者更好地理解 PostgreSQL 的排序机制。
2025-04-03 17:50:22
937
原创 【PostgreSQL内核学习 —— (sort算子)】
在PostgreSQL中,Sort算子用于对输入数据进行排序以满足查询的ORDER BY要求,其执行流程与执行器框架紧密关联。当执行器启动时,Sort算子会初始化内存缓冲区(由work_mem参数控制),通过下层算子(如SeqScan)逐行拉取数据并存储为SortTuple结构。若内存不足,数据会被分块排序后写入磁盘临时文件(称为“tape”),采用外部归并排序)完成最终排序。优先使用快速排序(quicksort)对内存中的数据块进行排序,并支持增量排序()以利用索引预排序优化多字段排序。
2025-03-27 10:19:20
489
原创 【OpenGauss源码学习 —— (SortGroup算子)】
基于OpenGauss的数据分组聚集方法。该专利提出了一种基于OpenGauss的高效数据分组聚集方法,旨在解决现有技术在处理海量数据时因无效排序和分组导致的性能问题,下面一起来学习一下专利所提出的方案。传统的SQL聚集操作(如COUNTMAXMINSUMAVG)在进行GROUP BY和ORDER BY处理时,可能会导致大量无用数据的计算,从而降低系统性能。现有方案通常是:先分组再排序,但所有数据都需要先分组计算,即使最终只需要Top-N组,仍会处理所有数据,造成不必要的计算开销。先排序再分组。
2025-03-20 13:50:26
991
原创 【PostgreSQL内核学习 —— (WindowAgg(三))】
通过上述详细的例子和逐行分析,函数的作用是基于窗口函数的单调性和操作符表达式(如<=)来决定是否可以优化窗口函数的计算,从而避免不必要的计算。通过合理的优化,查询的执行效率得到提升。
2025-02-06 15:34:38
1156
原创 【PostgreSQL内核学习 —— (WindowAgg(二))】
本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的情况下注明引用来源。本文主要参考了的开源代码和《》一书在中,我们介绍了窗口函数以及窗口聚合的核心计算过程。本文我们继续学习WindowAgg算子的具体实现逻辑。
2025-02-05 17:00:34
1076
原创 【PostgreSQL内核学习 —— (WindowAgg(一))】
书中详细描述了 WindowAgg 节点在 PostgreSQL 中处理窗口函数时的执行过程,包括如何管理分区、排序、聚合等。通过 WindowAggState 和相关的数据结构,窗口聚合可以高效地计算多个窗口函数,同时保持对数据的完整性。性能优化方面,窗口函数的排序和缓存机制也起到了关键作用,帮助提升计算效率。
2025-01-24 16:49:30
1033
原创 【OpenGauss源码学习 —— (VecSortAgg)】
在 openGauss (OG) 中,VecSortAgg 是一种基于矢量化的排序聚合操作,它用于在执行 SQL 查询时高效地对数据进行分组和聚合。与传统的逐行处理不同,VecSortAgg 通过批量处理数据来提高计算效率,特别适用于大规模数据集的聚合操作。VecSortAgg 支持诸如 GROUP BY 和 ROLLUP 等复杂的分组和多阶段聚合操作。其实现中包含了排序、去重、聚合函数应用等步骤,且通过内存管理机制(如批处理缓存和排序器)优化了内存使用,确保计算的高效性和稳定性。
2024-10-14 15:06:59
1122
原创 【OpenGauss源码学习 —— (VecGroup)】
本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的情况下注明引用来源。本文主要参考了的开源代码和一书。
2024-10-10 16:41:18
620
原创 【OpenGauss源码学习 —— (VecAgg)】
本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的情况下注明引用来源。本文主要参考了的开源代码和一书和四个函数共同构成了。在查询计划的执行过程中,用于,为后续的聚合操作做好准备;则负责,根据不同的聚合策略(如哈希聚合、排序聚合等)调用相应的聚合运行器进行数据处理;用于和,确保不再使用的资源能够得到妥善处理;而则负责。这些函数相互联系,形成了一个完整的向量化聚合执行框架,确保在执行查询时能够高效、准确地处理聚合操作。
2024-10-08 17:19:55
882
原创 【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
1106
原创 【OpenGauss源码学习 —— (ALTER TABLE(SET attribute_option))】
本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的情况下注明引用来源。本文主要参考了的开源代码和一书是一种命令,。在中,这种命令可以用来改变列的默认值、是否允许为空、数据类型等属性,以满足不同的业务需求或数据结构变更。在的源代码中,处理和的逻辑通常涉及到调用函数。例如,当命令中包含) 时,会执行函数来实际应用这些选项,而当包含) 时,则会反向执行这些选项的。函数的作用是根据传入的参数,。
2024-06-21 14:23:34
988
原创 【OpenGauss源码学习 —— (ALTER TABLE(调整表中特定列的统计目标))】
本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的情况下注明引用来源。本文主要参考了的开源代码和一书命令用于。通过,数据库查询优化器能够更准确地估算查询结果的选择性,从而生成更高效的查询计划。在中,函数负责执行这一操作,确保新统计信息的正确应用和存储,从而提高数据库的整体性能和效率。
2024-06-20 17:19:10
978
原创 【OpenGauss源码学习 —— (ALTER COLUMN SET/DROP DEFAULT)】
本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的情况下注明引用来源。本文主要参考了的开源代码和一书。
2024-06-19 11:16:12
798
原创 【OpenGauss源码学习 —— (ALTER TABLE(列存修改列类型))】
在数据库管理中,改变表中列的类型是一个常见的操作。这种操作通常通过ALTER TABLE ALTER COLUMN TYPE语句来实现,它允许数据库管理员在不删除和重新创建表的情况下更改列的数据类型。这种操作需要确保数据的正确性和一致性,并且在某些情况下,还需要重写表中的数据来适应新的数据类型。
2024-06-18 17:54:18
1172
原创 【OpenGauss源码学习 —— (ALTER TABLE(列存删除列))】
代码修改要点:本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的情况下注明引用来源。本文主要参考了的开源代码和一书在数据库管理系统中,命令用于修改表的结构,允许用户。在处理列存储表(表)时,删除列的操作尤为复杂,因为。表将每一列的数据独立存储,这意味着在删除列时,。在执行命令时,核心函数扮演着重要角色。该函数负责。特别是在列存储表中,需要对列描述信息()进行清理,并安排在事务提交时,以确保整个操作的原子性。
2024-06-18 15:26:25
993
原创 【OpenGauss源码学习 —— (ALTER TABLE(CStoreRewriter))】
OpenGauss源码学习 —— (ALTER TABLE(ExecRewriteCStoreTable))】这篇文章详细介绍了OpenGauss数据库中命令的实现细节,特别是涉及到列存储表的重写操作其中,通过重写操作,帮助优化存储在列存储表中的数据的物理布局,这包括数据的压缩和重组,以提高查询效率和减少存储空间。在重写过程中,确保所有的表约束(如NOT NULL约束)和表结构更改(如列的添加或删除)都得到妥善处理,确保数据完整性不受影响。重写操作还涉及更新与表相关的元数据,以反映重写后的新状态,例如。
2024-05-10 14:41:09
918
原创 【OpenGauss源码学习 —— (ALTER TABLE(ExecRewriteCStoreTable))】
【OpenGauss源码学习 —— (ALTER TABLE(ExecRewriteRowTable))】这篇文章详细描述了OpenGauss数据库管理系统中执行命令的源码实现。和都是用于重写表的数据的函数,但是它们针对的表类型不同。主要用于重写列存储表的数据,而则用于重写行存储表的数据。因此,它们的关系在于它们都是用于表数据重写的功能,但是针对的表类型不同,分别适用于列存储表和行存储表。本文,我们来学习一下函数的内容。
2024-05-09 11:33:11
1216
原创 【OpenGauss源码学习 —— (ALTER TABLE(ExecRewriteRowTable))】
【OpenGauss源码学习 —— (ALTER TABLE(Add Column))】这篇文章深入分析了OpenGauss数据库管理系统中执行命令的源码实现。文章探讨了系统如何处理向表中添加新列的过程,包括检查约束、设置默认值以及保证数据完整性的机制。特别提到了函数,它负责管理添加列的过程。此外,文章还为理解更复杂的表结构修改提供了基础,特别是涉及到函数,该函数对于处理表结构变化和数据重组至关重要。在函数中,用于执行表的重写操作。和是两个索引分别决定了。
2024-04-28 16:41:54
961
原创 【OpenGauss源码学习 —— (ALTER TABLE(Add Column))】
Add Column用于向已存在的数据库表中添加新的列。这个过程涉及到更新表的元数据,以及可能对表的物理结构进行调整,特别是在需要初始化新列的默认值时。在数据库系统中,执行Add Column操作通常需要考虑锁定机制以避免与其他数据库操作冲突,并且必须确保数据的完整性和一致性不被破坏。此外,添加列的操作还可能触发相关的事件触发器,这些触发器可以用于执行一些定制的逻辑,如自动更新相关视图或维护日志等。整个过程需要高效地管理,以最小化对数据库性能的影响,特别是在涉及大量数据或高并发环境下。
2024-04-28 14:29:18
2520
原创 【PostgreSQL内核学习(三十)—— 执行器(ExecCreateTableAs)】
本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的情况下注明引用来源。本文主要参考了的开源代码和和《》一书。
2024-04-10 16:44:16
1121
原创 【PostgreSQL内核学习(二十九)—— 执行器(ExecProcNode)】
在文章【PostgreSQL内核学习(二十二)—— 执行器(ExecutePlan)】中详细介绍了PostgreSQL数据库中函数的原理和实现细节,强调了它在数据库查询执行机制中的核心作用。文章分析了函数的执行流程,包括初始化变量处理并行执行模式循环执行查询计划节点直到满足退出条件等步骤。此外,还介绍了函数的作用,即执行给定计划节点并返回元组。本文将深入了解的原理和实现细节函数是函数流程中的关键部分,负责实际执行查询计划树中的各个节点并返回结果元组。通过循环调用。
2024-04-03 15:34:33
1296
原创 【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
829
原创 【PostgreSQL内核学习(二十八) —— 执行器 (表达式计算) 】
在PostgreSQL系统的执行器模块中,“表达式计算” 是一个核心功能,它负责处理和评估SQL查询中的各种表达式,包括算术运算逻辑判断函数调用等。这一过程涉及解析查询中的表达式树,然后按照操作符和函数的定义,逐节点计算表达式的值。执行器会利用类型系统来处理不同数据类型之间的操作,并可能涉及类型转换以确保操作的正确性。此外,表达式计算还可能包括对表达式中涉及的列数据进行访问和检索,以及应用优化策略如索引查找或缓存结果以提高计算效率。通过这一系列复杂的计算过程,PostgreSQL。
2024-02-27 16:48:17
1126
原创 【PostgreSQL内核学习(二十七) —— (编码转换)】
PostgreSQL处理客户端和服务器端字符集匹配问题的机制是复杂且灵活的,能够确保数据在不同编码之间传输时保持其原始的意义和结构,从而避免了乱码问题。这一机制主要涉及字符集的识别转换和验证过程,以确保从客户端发送到服务器的数据能够被正确解释和存储,即使客户端和服务器使用的是不同的字符编码(例如,客户端使用 GBK,而服务器使用 UTF-8编码设置和识别•客户端可以在与服务器建立连接时指定其使用的字符编码。这允许客户端告诉服务器它将以何种编码发送数据。例如,一个使用GBK 编码的客户端。
2024-02-23 16:16:34
1616
原创 【PostgreSQL内核学习(二十六) —— (共享数据缓冲区)】
PostgreSQL的共享数据缓冲区()是数据库系统中用于存储从磁盘读取的数据页的内存区域,以便快速重用这些数据,从而减少对磁盘的访问次数和提高查询性能。当数据库需要访问某个数据页时,它首先检查该页是否已在共享数据缓冲区中;如果是直接从内存中读取数据,否则从磁盘加载数据页到缓冲区再进行访问。共享数据缓冲区的大小是可配置的,通过调整参数来实现,这个参数定义了缓冲区分配的内存量。理想的缓冲区大小取决于系统的总内存数据库的工作负载以及其他内存需求。
2024-02-04 10:57:06
1167
原创 【PostgreSQL内核学习(二十五) —— (DBMS存储空间管理)】
在数据库管理系统(DBMS)中,空间管理是指如何在物理存储介质上组织、管理和优化数据的存储。这是DBMS性能和效率的关键因素之一。块(或页面)区间(区域或范围)段表空间和数据库。块(或页面)块(在Oracle中称为块,在SQL Server和PostgreSQL中称为页面是数据库管理系统存储数据的基本单位。一个块通常是从磁盘上以固定大小读取和写入的数据块,这个大小可以是等,根据数据库的配置而定。每个块包含了一系列的记录,这些记录是数据库中存储的实际数据。区间(Extents)区间是一系列连续的块。
2024-02-02 14:54:36
911
原创 【PostgreSQL内核学习(二十四) —— (ALTER MATERIALIZED VIEW)】
是一个SQL命令,用于修改一个已经存在的物化视图的定义或行为。物化视图是一种特殊的数据库对象,它存储了查询结果的实际数据,与普通视图(仅保存查询逻辑)不同。这使得物化视图在处理复杂查询和提高数据检索效率方面非常有用,特别是在涉及大量数据和复杂联结的情况下。使用命令,您可以进行各种修改,比如重命名物化视图更改其底层查询逻辑更新或刷新其中的数据更改存储参数或者修改与物化视图相关的安全和访问规则。这个命令提供了灵活性来维护和优化物化视图,确保它们保持最新并有效地服务于数据库应用程序的需求。在。
2024-01-17 11:34:18
1281
原创 【PostgreSQL内核学习(二十三)—— 执行器(ExecEndPlan)】
在这三篇文章中,首先是【OpenGauss源码学习 —— 执行器(execMain)】,它详细探讨了OpenGauss数据库管理系统中执行器模块的主要功能和实现机制。这部分内容涉及到如何在 OpenGauss 环境下处理和执行SQL语句,包括查询计划的生成和优化,以及如何有效地管理数据流和处理结果。接着,【PostgreSQL内核学习(二十一)—— 执行器(InitPlan)】专注于PostgreSQL数据库的执行器模块,特别是初始化计划(InitPlan)的部分。这篇文章讨论了在。
2024-01-16 10:36:02
1233
原创 【PostgreSQL内核学习(二十二)—— 执行器(ExecutePlan)】
在文章【OpenGauss源码学习 —— 执行器(execMain)】中,我们深入探究了执行器在数据库中的核心功能和逻辑。这篇文章详细介绍了执行器的主要组成部分,如查询执行的初始化与结束主执行循环、以及行处理逻辑等。通过这篇文章,读者可以了解到执行器是如何在数据库系统中处理用户的查询请求,包括如何遍历执行树执行计划节点,以及如何对数据进行操作和传递。另一方面,文章【PostgreSQL内核学习(二十一)—— 执行器(InitPlan)】则专注于介绍了InitPlan函数在PostgreSQL。
2024-01-15 16:44:22
1393
原创 【PostgreSQL内核学习(二十一)—— 执行器(InitPlan)】
在【OpenGauss源码学习 —— 执行器(execMain)】一文中,我们学习了执行器中执行查询的核心函数和逻辑。在本文中,我们将深入研究InitPlan的内容。InitPlan是数据库查询执行过程中的关键组成部分,它用于在查询计划的执行过程中初始化子查询或表达式的结果,以确保正确的查询执行顺序和结果。通过本文的学习,我们将深入了解InitPlan的原理和实现细节,从而更好地理解数据库查询的执行机制。在查询执行阶段之前调用,作为整个执行过程的入口点。它负责触发 InitPlan。
2024-01-15 15:38:14
1324
原创 【OpenGauss源码学习 —— 执行器(execMain)】
在OpenGauss数据库系统中,文件是执行器(Executor)模块的核心部分之一。这个文件主要负责实现查询的执行逻辑,是数据库查询处理的关键组成部分。其中,文件所对应的部分如下图中的红色框区域所示。其中,本文主要介绍蓝色框区域的内容。以下是对在OpenGauss的文件中,以下列出的函数各自承担着查询执行流程的不同责任。这些函数共同协作,确保从查询计划的初始化到执行的每个步骤都能正确进行。#else#endif函数功能InitPlan初始化查询计划。
2024-01-12 14:53:38
1244
原创 【PostgreSQL内核学习(二十)—— 数据库中的遗传算法】
遗传算法GA)是一种启发式搜索算法,用于解决优化和搜索问题,它借鉴了自然界中的进化理论。在数据库领域,遗传算法可以用于各种任务,如查询优化数据挖掘模式识别等。种群(Population)在遗传算法中,一个种群由多个个体组成,每个个体代表数据库中的一个潜在解决方案。染色体(Chromosome)每个个体由染色体表示,它是解决方案的编码。在数据库应用中,染色体可能代表查询计划、数据库索引的配置或数据分布的模式。适应度函数(Fitness Function)这是一个评价函数,用于确定染色体的优劣。
2023-12-27 17:23:21
1429
原创 【OpenGauss源码学习 —— 列存储(获取表大小)】
在OpenGauss中,有一个名为的内置函数可以帮助我们实时获取表的存储空间大小。本文将深入探讨这个函数的工作原理、用途以及如何使用它来监控和优化数据库性能。select pg_size_pretty(pg_table_size('表名'));---创建列存表id INT,age INT,---插入数据---执行pg_table_size查看表的大小72 kB(1 row)
2023-12-25 14:38:33
1497
原创 【PostgreSQL内核学习(十九)—— 存储管理(元组操作)】
对元组的操作包括插入删除和更新三种基本操作,这三种操作都是把元组当作一个整体进行处理。除些之外,在OG中) 这个文件中还实现了元组内部结构的相关操作,包括元组的构造修改分解复制释放等作。一个完整的元组信息将对应一个结构和一个TupleDesc结构,在中还包含一个结构。TupleDesc是关系结构的一部分,也称为元组描述符,它记录了与该元组相关的全部属性模式信息。通过元组描述符可以读取磁盘中存储的无格式数据,并根据元组描述符构造出元组的各个属性值,元组描述符。
2023-12-21 14:16:54
1526
原创 【PostgreSQL内核学习(十八)—— 存储管理(存储管理的体系结构)】
数据库管理系统(DBMS)的本质是向存储设备上写入数据或者读出数据,因此存储的管理是一项非常基础且重要的技术。在PostgreSQL中,存储管理器是专门负责管理存储设备的模块,其提供了一组统一管理外存和内存的功能模块。因此从本质上看,存储管理器提供了PostgreSQL与物理存取设备的接口。因为外存对应着各种磁盘设备,而内存则对应着各种随机存储器。存储管理器是整个PostgreSQL系统的底层模块,各种需要访问底层硬件的操作都需要调用其提供的接口。这是数据库系统的核心部分,负责缓存数据页。
2023-12-19 17:57:15
1097
原创 【OpenGauss源码学习 —— (RowToVec)算子】
OpenGauss在PortalRun函数中会实际执行相关的DML查询,对数据进行计算和处理。在执行过程中,所有执行算子分为两大类行存储算子和向量化算子。这两类算子分别对应行存储执行引擎和向量化执行引擎。行存储执行引擎的上层入口是函数,向量化执行引擎的上层人口是函数。其中向量化引擎是针对列存储表的执行引擎。如果存在行存储表和列存储表的混合计算,那么行存储执行引擎和向量化执行引擎直接可以通过VecToRow和RowToVec算子进行相互转换。行存储算子执行入口函数的命名规则一般为 “Exec + 算子名。
2023-12-05 16:28:22
1153
原创 【OpenGauss源码学习 —— (VecToRow)算子】
OpenGauss在PortalRun函数中会实际执行相关的DML查询,对数据进行计算和处理。在执行过程中,所有执行算子分为两大类行存储算子和向量化算子。这两类算子分别对应行存储执行引擎和向量化执行引擎。行存储执行引擎的上层入口是函数,向量化执行引擎的上层人口是函数。其中向量化引擎是针对列存储表的执行引擎。如果存在行存储表和列存储表的混合计算,那么行存储执行引擎和向量化执行引擎直接可以通过VecToRow和RowToVec算子进行相互转换。行存储算子执行入口函数的命名规则一般为 “Exec + 算子名。
2023-12-05 15:38:59
1179
原创 【OpenGauss源码学习 —— 执行算子(Merge Join 算子)】
Merge JoinMerge Join的主要优势在于对有序关系的高效处理。由于输入已排序,不需要回溯,整个算法的时间复杂度为O(N+M),其中N和M分别是两个输入关系的大小。Merge Join不需要额外的内存结构,对内存友好。相比于Hash Join,适用于大规模数据集。由于需要有序输入,如果关系没有按连接属性排序,则需要进行排序操作,增加了初始开销。Merge Join只能处理等值连接,无法处理其他类型的连接操作。总体而言,Merge Join。
2023-11-25 14:57:48
1695
原创 【 OpenGauss源码学习 —— 列存储(CStoreMemAlloc)】
学习完了CU和CUStorage类,我们最后来学习一下类。类提供了内存管理的功能,而CU和CUStorage类负责处理列存储中的具体数据单元和物理存储。在实际的列存储系统中,这些类可能会协同工作以有效地管理内存和存储数据。类类用于管理列存储中的内存分配和释放。功能:分配内存,并根据需要注册到管理器。释放缓存的节点。重新分配内存,同时处理注册和取消注册。释放内存,同时处理取消注册。注册内存指针,将其添加到管理表。取消注册内存指针,将其从管理表中移除。Reset 方法。
2023-11-22 17:23:00
154
原创 【 OpenGauss源码学习 —— (hash_search)】
在对源码的不断学习中,经常可以看到一个名为的函数,该函数用于在哈希表中查找键并执行相应操作。先前一直没有仔细看过该函数的内部逻辑,本文则来详细的学习一下吧。
2023-11-22 09:32:35
231
TPC-H V 3.0.1
2024-01-11
差分演化算法相关学术论文集合
2023-11-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人