PG的逻辑结构和内存结构

时间:2024-05-23 22:48:16

PG的逻辑结构和内存结构

PostgreSQL体系结构-物理结构

物理结构
数据库集簇布局
数据库布局
表和索引文件的相关布局
表空间的布局
堆表文件的内部结构
对于数据的访问(堆元组的读写)

PG对比ORACLE的逻辑结构

逻辑结构
一个数据库实例对应多个数据库( PostgreSQL MySQL SQLServer)
一个数据库实例对应一个数据库( Oracle)
多个数据库实例对应—个数据库( ORACLE RAC)

一个PostgreSQL数据库服务下可以有多个数据库,多个数据库之间无法互相访问,需要访问需要使用dblink等手段。
ORACLE数据库一个实例只能有属于一个数据库,一个库可以有多个实例,比如RAC就是如此。Post的这种其实和sql server, MYSQL都类似。

Database,instance

Postgresql ORACLE SQL Server
一个库不能属于多个实例 一个库可以有多个实例
一个实例下有多个库 一个实例只能属于一个库

Schema
在PostgreSQL中Schema可以理解为一个命名空间或目录,每个schema有各自的表,视图等对象,不同的schema下名称可以相同。ORACLE的Schema功能上和PostgreSQL相同,但是ORACLE一个用户即一个Schema。

PG的逻辑结构:

Database数据库:Postgres 默认数据库、Template0 最精简模板、Template1 默认模板;一个数据库可以有多个User用户,多个Schema模式。默认创建一个数据库会存储在默认表空间,它包含一个Public名称的Schema模式(拷贝自Template1模板)。
Tablespace表空间:表空间是物理结构,同一表空间下可以有多个数据库。pg_default表空间是默认创建存放用户数据;pg_global表空间是默认创建存放系统数据;
User用户:postgres用户是默认创建的超级管理员;每个数据库都有一个OWNER用户,每个用户可以OWNER多个数据库。
Schema模式:数据库创建后,默认会有一个Public名称的Schema模式。它可隔离多个用户之间相同名称的对象。一个数据库可以有多个Schema模式,他们互不相关互相隔离

PG的逻辑结构和内存结构
PG的逻辑结构和内存结构

Database cluster: 由postgresql server管理的数据库的集合,下面由多个database组成

databsase: 由各种独立的数据库对象构成,比如下图中的table,indexes, view,function,sequence

数据最终存储在表中

表如何存储数据
表的组成表由多个 page [ block]组成)
一个page包含(页头信息空闲空间 Tuple)

整体来讲

Tablespace
Database cluster
multi database
表索引序列视图函数用户模式

Tablespace是数据最大的存储空间
Database是构成表空间的存储单元
pages是 PostgreSQL数据库中最小的O单元

所有数据库对象都有各自的oid(object identifiers),oid是一个无符号的四字节整数,相关对象的oid都存放在相关的system catalog表中,比如数据库的oid和表的oid分别存放在pg_database,pg_class表中。

Oracle的逻辑结构

PG的逻辑结构和内存结构

PG的逻辑结构和内存结构

PG的内存结构

Oracle的内存结构

PG的逻辑结构和内存结构

PG的内存结构

PG的逻辑结构和内存结构

PG的逻辑结构和内存结构
在Postgresql中,内存大概被分为两块

Local memory area – 为每一个backend process 分配的内存

Shared memory area – PostgreSQL server 所有的backgroud process使用的内存

2.1 Local memory area

每一个backend process 都会分配一块local memory area, 每一块区域又分为三个子区域 ,见下表

sub-area description reference
work_mem 用户在sort,distinct,merge join,hash join的时候会用到这块区域 Chapter 3
maintenance_work_mem vacuum,reindex会用到这块区域 Section 6.1
temp_buffers 存储临时表会用到这块区域

2.2 Shared memory area

这块区域在服务器启动的时候分配,这块区域也是分为好几个子区域,见下面介绍

sub-area description reference
shared buffer pool 将表或者索引的page从磁盘加载到shared buffer,然后在shared buffer操作 Chapter 8
WAL buffer 在服务端出现问题的时候,确保数据不会丢失,在写到磁盘之前,wal buffer是wal log的缓存区域 Chapter 9
commit log 为了并发控制所有事物的状态的保持而分配的区域

另外,Postgresql还分配一些其他的内存区域:

  • 为访问控制分配的子区域,比如轻量级锁,共享或者专有锁.
  • 为其他backgroud process提供的子区域,比如检查点,vacuum.
  • 为事物处理提供的子区域,比如事物中的保存点,和二阶段事物提交.

相关文章