📜  PostgreSQL – 系统架构(1)

📅  最后修改于: 2023-12-03 15:03:49.678000             🧑  作者: Mango

PostgreSQL - 系统架构

PostgreSQL 是一款顶级开源关系型数据库系统,在开源社区和企业应用领域拥有广泛的用户群体和市场份额。本文将介绍 PostgreSQL 的系统架构,包括进程模型、存储引擎、查询执行等方面。

进程模型

PostgreSQL 的进程模型采用了一种基于进程的架构,每个客户端连接都对应一个单独的后台进程,负责处理客户端请求。当用户发起连接请求时,由后台进程处理并分配本地端口,接下来的请求将通过该端口进行通信。

前台进程

前台进程主要负责处理客户端请求和发送响应。每个前台进程拥有一个唯一的会话标识符 (Session ID),用于跟踪不同的客户端会话。前台进程在接收到请求后,会通过共享内存与后台进程通信,并将请求结果返回给客户端。

后台进程

后台进程用于处理客户端的请求,PostgreSQL 具有多种类型的后台进程,每个类型的进程都有不同的责任和功能,具体如下:

  • 自动化后台进程:用于执行一些定时任务,例如自动归档、自动备份等。
  • WAL Writer 进程:用于将 WAL (Write-ahead Logging) 日志写入磁盘,以保证数据的持久性。
  • WAL Checkpointer 进程:用于触发 WAL 日志的归档,从而避免 WAL 日志无限增长。
  • 后台工作者进程:用于进行异步提交和异步回滚等工作。
存储引擎

PostgreSQL 的存储引擎是一种基于 MVCC (Multi-Version Concurrency Control) 的存储引擎。MVCC 策略通过为每个修改操作创建新版本的方式来保证并发访问的正确性,同时可以提高并发性能。

表空间

表空间是 PostgreSQL 中用于存放表和索引的目录,类似于文件系统中的目录。表空间可以位于本地磁盘或远程磁盘上。用户可以根据需要为不同的表空间设置不同的存储限制。

数据文件

PostgreSQL 的数据文件包含了表、索引、序列等对象的数据。每个表在磁盘上对应一个数据文件,其中存储了表的元数据和数据记录。使用 PostgreSQL 的管理工具可以方便地备份、还原、移动、复制数据文件。

WAL 日志

WAL 日志是 PostgreSQL 中用于保证数据持久性和故障恢复的重要机制,也是实现 MVCC 策略的关键。WAL 日志记录了事务的所有修改操作,当发生事务回滚、系统崩溃等情况时,可以使用 WAL 日志进行恢复。

查询执行

PostgreSQL 的查询执行过程通常包括以下步骤:

  1. 解析:将 SQL 语句解析成内部语法树。
  2. 重写:对 SQL 语句进行重写,包括视图展开、子查询展开等。
  3. 优化:生成执行计划,选择最优的执行路径。
  4. 执行:执行查询计划并返回结果。
解析

当 PostgreSQL 接收到客户端发送的 SQL 语句后,首先需要将其解析成内部语法树。解析器会将 SQL 语句分解成关键字、标识符、运算符、常量等几个基本元素,并生成对应的语法树。

重写

SQL 语句的重写过程可以分为两个阶段:视图展开和子查询展开。

  • 视图展开:将 SQL 语句中的视图转化为实际的表或其他视图。
  • 子查询展开:将 SQL 语句中的子查询转化为一个或多个独立的查询语句。
优化

优化器是 PostgreSQL 查询执行过程中的核心模块,它负责生成最优的执行计划。优化器会分析查询树的各个节点,考虑可用索引、表关联类型、查询过滤条件等多个因素,并基于统计信息对它们进行评估,从而生成最优的执行计划。

执行

查询执行过程中最后一步是实际的执行阶段。执行阶段首先需要执行一个聚合函数来收集查询结果,并生成输出结果集。在输出结果集之前,PostgreSQL 还需要进行锁管理、并发控制、异常处理等操作,以保证查询的正确性和安全性。