随笔分类 -  PostgreSQL源码分析

PostgreSQL (也叫 Postgres)是一个自由的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发行。它提供了相对其他开放源代码数据库系统(比如 MySQL 和 Firebird),和对专有系统比如 Oracle、Sybase、IBM 的 DB2 和 Microsoft SQL Server的一种选择。
摘要:上面这张图从整体上概括了Postgresql的查询处理的步骤以及牵涉到的各个模块,源码参考自postgresql-12.6。 一、Parser(查询分析模块) 查询分析模块主要是pg_parse_query函数(\src\backend\tcop\postgres.c 631行),输入const c 阅读全文
posted @ 2021-02-23 23:20 肥叔菌 阅读(4239) 评论(0) 推荐(0)
摘要:查询优化是数据库管理系统中承上启下的一个模块,它接收来自语法分析模块传递过来的查询树,在这个查询树的基础上进行了逻辑上的等价变换、物理执行路径的筛选,并且把选择出的最优的执行路径传递给数据库的执行器模块。查询优化器的输入是查询树,输出是查询执行计划。 查询优化器和数据库用户之间的信息不对称,查询优化 阅读全文
posted @ 2021-02-02 23:03 肥叔菌 阅读(2520) 评论(0) 推荐(2)
摘要:src/backend/parser/scan.l --> lexical scanner for PostgreSQL 该文件中的规则需要和psql lexer一致。Lex用来生成扫描器,其工作是识别一个一个的模式,比如数字、字符串、特殊符号等,然后将其传给Yacc。 定义段 定义段包括文字块(l 阅读全文
posted @ 2021-01-26 23:15 肥叔菌 阅读(1383) 评论(0) 推荐(0)
摘要:Postgres进程是实际的接受查询请求并调用相应模块处理查询的PostgreSQL服务进程。它直接接受用户的命令进行编译执行,并将结果返回给用户。如此循环,直到用户断开连接。用户的命令分为两种:一种是查询命令,即插入、删除、更新和选择四种命令;另一种是非查询命令,如创建/删除表、视图、索引等命令。 阅读全文
posted @ 2021-01-19 23:36 肥叔菌 阅读(1689) 评论(0) 推荐(0)
摘要:PostgreSQL系统的主要功能都集中于Postgres程序,其入口是Main模块中的main函数,在初始化数据集簇、启动数据库服务器时,都将从这里开始执行。Main模块主要的工作是确定当前的操作系统平台,并据此做一些平台相关的环境变量设置和初始化,然后通过对命令行参数的判断,将控制转到相应的模块 阅读全文
posted @ 2021-01-14 23:52 肥叔菌 阅读(3516) 评论(0) 推荐(0)
摘要:数据库初始设置包括创建系统视图、系统表TOAST表等,复制template1来创建template0和postgres,这些操作都用普通的SQL命令来完成。 setup_sysviews函数建立系统视图,从system_views_file指向的文件读取SQL,并控制子进程执行这些SQL。 1 st 阅读全文
posted @ 2020-12-31 13:03 肥叔菌 阅读(368) 评论(0) 推荐(0)
摘要:数据库初始设置包括创建系统视图、系统表TOAST表等,复制template1来创建template0和postgres,这些操作都用普通的SQL命令来完成。如下代码就是用于数据库初始设置。 1 setup_auth(); 2 if (pwprompt || pwfilename) 3 get_set 阅读全文
posted @ 2020-12-29 12:51 肥叔菌 阅读(1025) 评论(0) 推荐(0)
摘要:PostgreSQL系统的主要功能都集中于Postgres程序,其入口是Main模块(src/backend/main/main.c)中的main函数,在初始化数据集簇、启动数据库服务器时,都将从这里开始执行。Main模块主要的工作是确定当前的操作系统平台,并据此做一些平台相关的环境变量设置和初始化 阅读全文
posted @ 2020-12-28 22:32 肥叔菌 阅读(1030) 评论(0) 推荐(0)
摘要:在bootstrap模式下创建数据库template1,存储在数据目录的子目录base/1/中。 1 /* Bootstrap template1 */ 2 bootstrap_template1(short_version); 3 /* Make the per-database PG_VERSI 阅读全文
posted @ 2020-12-26 13:00 肥叔菌 阅读(472) 评论(0) 推荐(0)
摘要:测试当前服务器系统性能,由测试结果创建配置文件postgresql.conf、pg_hba.conf、pg_ident.conf,并对其中定义的参数做一些设置。主要执行流程如下代码所示。 1 /* Top level PG_VERSION is checked by bootstrapper, so 阅读全文
posted @ 2020-12-25 13:03 肥叔菌 阅读(744) 评论(0) 推荐(0)
摘要:创建事务记录软链接symlink,如果xlog_dir不为空字符串,先清理xlog目录名,检查其绝对路径,检查指定xlog目录是否为空。check_data_dir(xlog_dir)如果返回0,说明xlog目录不存在,必须创建;如果返回1,说明xlog目录存在,但是为空,修改权限问题并使用;存在且 阅读全文
posted @ 2020-12-24 23:04 肥叔菌 阅读(592) 评论(0) 推荐(0)
摘要:设置中断信号处理函数,对终端命令行SIGHUP、程序中断SIGINT、程序退出SIGQUIT、软件中断SIGTERM和管道中断SIGPIPE等信号进行屏蔽,保证初始化工作顺利进行。 1 /* now we are starting to do real work, trap signals so w 阅读全文
posted @ 2020-12-24 22:31 肥叔菌 阅读(245) 评论(0) 推荐(0)
摘要:设置环境变量(pg_data等),获取系统配置文件的源文件路径(postgres.bki、postgresql.conf. sample等文件),并检查该路径下各文件的可用性。 一、设置环境变量 set_pglocale_pgservice函数设置应用指定的locale和service目录。对于第一 阅读全文
posted @ 2020-12-24 21:31 肥叔菌 阅读(1331) 评论(0) 推荐(0)
摘要:template1和template0数据库用于创建数据库。PG中采用从模板数据库复制的方法来创建新的数据库,在创建数据库的命令中可以用-T选项来指定以哪个数据库为模板来创建新数据库。template1数据库是创建数据库命令默认的模板,也就是说通过不带-T选项的命令创建的用户数据库和template 阅读全文
posted @ 2020-12-22 22:11 肥叔菌 阅读(3219) 评论(0) 推荐(0)
摘要:后端接口postgres.bki文件是在编译的过程中由/src/backend/catalog目录下的脚本程序genbki.sh读取/src/include/catalog目录下的以.h结尾的系统表定义文件(包括系统表索引和TOAST表定义文件)创建,并通常存放在安装树的share子目录下。 在pg 阅读全文
posted @ 2020-12-21 12:45 肥叔菌 阅读(1122) 评论(0) 推荐(0)
摘要:磁盘管理器是SMGR的一种具体实现,它对外提供了管理磁盘介质的接口,其主要实现在文件md.c中。磁盘管理器并非对磁盘上的文件直接进行操作,而是通过VFD机制进行文件操作。在PG中,凡是要对存储在磁盘中的表进行磁盘操作(如打开/关闭、读/写等),都是必须与磁盘管理器打交道,由它来统一处理。对文件的操作 阅读全文
posted @ 2020-12-09 12:58 肥叔菌 阅读(1495) 评论(0) 推荐(0)
摘要:MemoryContext是一个抽象类,可以有对个实现,但目前只有AllocSetContext一个实现。事实上,MemoryContext并不管理实际上的内存分配,仅仅是用作对MemoryContext树的控制。管理一个内存上下文中的内存块是通过AllocSet结构来完成的,而MemoryCont 阅读全文
posted @ 2020-12-03 23:52 肥叔菌 阅读(1604) 评论(0) 推荐(0)
摘要:MemoryContext是一个抽象类,是内存分配发生的逻辑上下文,作为内存上下文的实际实现的节点类型必须以与MemoryContext相同的字段开头。内存上下文管理模块(src/backend/utils/mmgr/mcxt.c)处理独立于正在操作的特定类型上下文的上下文管理操作。它通过内存上下文 阅读全文
posted @ 2020-11-30 13:08 肥叔菌 阅读(3258) 评论(0) 推荐(0)
摘要:catcache代码位于src/backend/utils/cache/catcache.c,包含了对SysCache结构体的初始化和数据结构之间指针关系的链接以及操作。最重要的是提供了两个函数:精确匹配SearchCatCache和部分匹配SearchCatcacheList。提供的静态函数如下, 阅读全文
posted @ 2020-11-20 13:23 肥叔菌 阅读(1011) 评论(0) 推荐(0)
摘要:在CatCache中查找元组有两种方式:精确匹配SearchCatCache和部分匹配SearchCatcacheList。前者用于给定CatCache所需的所有键值,并返回CatCache中能完全匹配这个键值的元组;而后者只需要给出部分键值,并将部分匹配的元组以一个CatCList的方式返回。 S 阅读全文
posted @ 2020-11-19 23:14 肥叔菌 阅读(941) 评论(0) 推荐(0)