Postgresql体系架构(三)-逻辑结构

Postgresql体系架构(三)-逻辑结构

  1. 逻辑概览

逻辑存储结构是内部的组织和管理数据的方式;主要包括数据库集群(Database Cluster)、数据库(Database)、表空间(Table Spaces)、数据库(Databases)、表(Tables)、索引(Indexes)等。

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

        

  1. 1. 数据库集群-Database Cluster

        也叫数据库集簇。它是指有单个PostgreSQL服务器实例管理的数据库集合,组成数据库集群的这些数据库使用相同的全局配置文件和监听端口、共用进程和内存结构。一个DataBase Cluster可以包括:多个DataBase、多个User、以及Database中的所有对象。

  1. 2. 数据库-Database

        数据库是数据库对象的集合。在关系数据库理论中,数据库对象是一种用于存储或引用数据的数据结构。(堆)表是一个典型的例子,还有许多其他的例子,如索引、序列、视图、函数。 在 PostgreSQL 中,数据库本身也是数据库对象,在逻辑上彼此分离。所有其他数据库对象 (如表、索引等)都属于各自的数据库。

        

        数据库初始化之后自动会创建postgres、template0、template1三个数据库。

        postgres数据库:这是默认的管理数据库,用于管理 PostgreSQL 服务器和用户角色。它包含了用于管理服务器和用户的系统表,例如 pg_roles、pg_database 等。通常不建议用于存储实际数据,而仅用于管理目的。

        template0数据库:是一个不可修改的数据库,它是PostgreSQL的原始模板,包含了数据库的初始设置和结构。任何时候都不应对template0进行修改,因为它是一个干净的模板,用于在需要时创建一个新的、干净的数据库副本使用template0创建数据库时,可以指定字符集和本地化设置。例如,可以指定编码为UTF-8collatectype属性为特定的区域设置template0主要用于在数据库损坏或需要恢复原始状态时使用。由于它是一个不可修改的模板,可以确保新创建的数据库始终基于一个干净的状态

        template1数据库:PostgreSQL中的一个模板数据库,可用于创建其他数据库的模板,在创建新数据库时提供基础设置和数据结构。与 template0 类似,也是一个模板数据库。但与template0 不同的是,template1 是可以被修改的,比如修改模版字符集、或者可以在其中创建用户自定义的对象,例如函数、表等。默认情况,我们新创建database会以template1库为模板进行创建。使用template1创建数据库时,不能指定新的字符集和本地化设置,只能使用与template1相同的设置template0不能连接,而template1可以连接并创建对象。当创建数据库时,如果不指定模板属性,PostgreSQL默认使用template1作为模板库

        1.3. 表空间 Tablespace

        

        1.3.1. 表空间概述

        PostgreSQL 表空间(Tablespace)是一种存储机制,允许数据库管理员将数据库对象(如表、索引等)存储在文件系统上的指定位置。表空间允许更灵活地管理存储资源,优化数据库性能。

        1.3.2. 表空间的作用

  • 存储管理:允许将数据库对象分布在不同的物理存储设备上,提高存储效率和访问速度。
  • 性能优化:通过将频繁访问的数据对象放在高性能存储设备上,可以减少I/O延迟,提高数据库性能。
  • 备份恢复:表空间使得数据库对象的备份和恢复更加灵活,可以单独备份或恢复特定的表空间。
  • 存储扩展:随着数据量的增长,表空间允许轻松添加新的存储设备,扩展存储空间。
  • 多对多的关系:在PostgreSQL集群中,一个表空间可以被多个数据库使用,而一个数据库也 可以使用多个表空间。

        1.3.3. 表空间类型

  • pg_global :系统字典表表空间,用于共享系统目录。如pg_database、pg_authid、pg_tablespace 等表以及它们的索引。
  • pg_default :是 template1 和 template0 数据库的默认表空间,该表空间的物理文件存储在数据目录中的base目录中,如果没有给出 TABLESPACE 子句,则用于在数据库内创建的表、索引和临时文件的默认表空间。每当您在创建表/数据库而未在创建表语句中指定表空间时,它将转到 pg_default 表空间。
  • 自定义表空间:用户创建的表空间。对应文件系统目录$PGDATA/pg_tblspc/。当手动创建表空间时,该目录下会自动生成一个软链接,指向表空间设定的路径。

        [postgres@pgserver01 ~]$ ls -l $PGDATA/pg_tblspc/

  1. 4.模式Schema

‌        PostgreSQL中的Schema是一个逻辑容器,用于组织和管理数据库对象,如表、视图、函数等。Schema可以帮助区分不同用户或应用程序的数据,避免命名冲突,并提供更好的安全性和可管理性

        Schema的基本概念和用途

        Schema在PostgreSQL中类似于一个命名空间,它包含命名对象(如表、数据类型、函数和运算符),这些对象的名称可以与其他Schema中存在的其他对象的名称重复。通过将Schema名称作为前缀限定其名称,可以访问这些对象。此外,Schema还可以用于实现多租户架构、数据隔离和权限管理等功能

创建数据库时会自动会创建information_schemapg_catalogpg_toastpublic四个模式。

        默认Schema

        每个数据库都有一个默认的Schema,名为public。当创建一个新的表时,如果没有指定Schema,表将被创建在public Schema

        PostgreSQL 语句CREATE SCHEMA 创建一个schema

        1.5. 段-segment 

        一个段是分配给一个逻辑结构(一个表、一个索引或其他对象)的一组区,是数据库对象使用 的空间的集合;段可以有表段、索引段、回滚段、临时段和高速缓存段等。

  • 每一个表和索引都存放到单独的数据文件中
  • 文件名是表或索引的文件结点(filenode)编号
  • 如果表或索引超过 1 GB 就会被分割为多个段
  • 第一个段以文件结点(filenode)编号命名,第二个以及之后的段以filenode.1, filenode.2形式命名
  • 数据大小编译安装时可设定相关参数:

        ./configure --help 查看 with-segsize 默认单个文件大小是1G

  1. 6.区-extent

        区是数据库存储空间分配的一个逻辑单位,它由连续数据块所组成。第一个段是由一个或多个盘区组成。当一段中间所有空间已完全使用,PostgreSQL为该段分配一个新的范围

  1. 7. -blockPage

        数据块是PostgreSQL 管理数据文件中存储空间的单位,为数据库使用的I/O的最小单位,是最小的逻辑部件。默认值8K

  1. 8. 数据库对象-Database object

        如:表、视图、索引、序列、函数等等。在PostgreSQL中的所有数据库对象都由各自的对象标识符(OID)进行内部的管理。例如,数据库的OID存储在pg_database系统表中,可以通过下面的语句进行查询。

2. 系统信息

        2.1. 系统信息视图

        Postgres 数据库的表元数据信息等都放置在pg_catalog schema中,包括系统表 、索引 、内置 数据类型、内置函数等。比如,常见的pg_class储存表的描述信息;

        pg_database 存储已经创 建数据库的信息;pg_am 用于存储表访问方法的元数据。

\dS 将列出pg_catalog 模式中的pg_* 表并且显示系统信息

        2.1. 系统管理函数

        查看当前日志文件lsn位置:

        select pg_current_wal_lsn();

        查看某个lsn对应的日志名:

        select pg_walfile_name('2/9817FE40');

        查看表的数据文件路径,filenode:

        select pg_relation_filepath('test'::regclass); select pg_relation_filenode('test');

        查看表的oid:

        select 'test'::regclass::oid;

        查看当前会话pid:

        select pg_backend_pid();

        生成uuid

        select gen_random_uuid();

        重载配置文件信息:

        select pg_reload_conf();

        查看数据库启动时间:

        select pg_postmaster_start_time();

        查看用户表、列等权限信息:

        select has_any_column_privilege(user,table,privilege);

        select has_any_column_privilege(table,privilege);

        select has_column_privilege(user,table,column,privilege);

        select has_table_privilege(user,table,privilege);

        查看当前快照信息:

        select txid_current_snapshot();

        查看对象的大小信息:

        select pg_relation_size();

        select pg_table_size();

        select pg_total_relation_size();

        物理、逻辑复制槽: pg_create/drop_physical_replication_slot(slotname);         pg_create_logical_replication_slot(slotname,decodingname);         pg_logical_slot_get_changes();

3. 分区表

        3.1. 分区表定义

分区表是一种数据库优化技术,它允许将一个大表逻辑上划分为多个较小的、可管理的部分,这些部分被称为分区或子表。分区表在物理上是分开存储的,但在逻辑上仍作为一个整体呈现给用户。

        3.2. 分区表的好处

        提升查询性能:将数据按指定的规则分布落到到子分区,查询可以定位到一个或几个分区来限制查询扫描的数据量,以提高查询性能。

        简化维护操作:分区表允许用户专注于表中的特定数据子集,简化了数据维护。添加、删除或归档数据变得更加容易,减少了管理开销并优化了存储使用。

        增强并发性: 分区表支持并行查询执行,多个查询可以同时在不同的分区上运行

        优化存储管理:可以将分区放到不同的表空间上,可以将 系统很少访问的分区放到廉价的磁盘上,也可以将系统长访问的分区存储到高速的存储上。

        增强可扩展性:随着数据量增长,可通过增加分区来水平扩展。

        数据归档‌:可以通过时间戳等字段将数据分区,以便更容易地归档和删除旧数据。

        数据安全性‌:可以通过分区限制对某些数据的访问,从而提高数据安全性。

        3.3. 分区表特点

        PG 数据库表分区表的结构是由主表(父表)与分区表(子表)组成,主表是创建子表的模板, 它是一个正常的普通表,正常情况下它并不储存任何数据;分区表继承并属于一个主表,分区 表中存储所有的数据,主表与分区表属于一对多的关系,也就是说,一个主表包含多个分区表, 而一个分区表只从属于一个主表。

        官方声明分区实现方式:声明式分区、继承分区;除此之外还支持其它的第三方分区管理方式,比如pathman扩展等。

        声明分区也叫原生分区,从PG10版本开始支持,相当于“官方支持”的分区表,也是最为推荐 的分区方式。虽然与继承分区不一样,但是其内部也是用继承表实现的。声明式分区支持:范围分区、list分区、hash分区。

        3.4. 分区表的分类

        (1) 范围分区表

        范围分区表一般指的一个分区的范围,然后把满足条件的行存放在该分区中,最常见的是以日 期做为分区条件,根据时间段分为不同的分区,存放不同时间段的数据。

        select

               tableoid::regclass,

               count(*)

      FROM part_range

        group by tableoid::regclass;

        (2) list 分区表

        list 分区以指定的分区值将数据存放到对应的分区上,然后把满足条件的行存放在该分区中, 最常见的是以某列值为分区条件,根据不同的列值存放在不同的分区。

        SELECT

                 tableoid::regclass,

                 *

          FROM part_range;

        (3) hash 分区表

        hash 分区将数据散列存储在各个分区上,以打散热点数据存放到对应的分区上,然后把满足条件的行存放在该分区中,最常见的是平均的把数据放在不同的分区。

        SELECT

                  tableoid::regclass,

                  count(*)

          FROM part_hash

            group by tableoid::regclass;

        (4) 混合分区表

        PG分区下面也可以建立子分区构成级联模式,子分区可以有不同的分区方式,这样的分区称 为混合分区。

​​​​​​​        3.5. 分区表时需要注意的事项

        分区策略选择:根据数据的特性和查询需求选择合适的分区策略(如范围分区、列表分区等)。

        分区管理:定期检查和维护分区,如合并、拆分或删除不再需要的分区。

        索引优化:在每个分区上创建适当的索引以提高查询性能。

        约束和触发器:确保分区表上的约束和触发器在分区上正确应用。

        性能监控:使用PostgreSQL的性能监控工具来评估分区表对查询性能的影响,并根据需要进行调整。

        3.6. 分区表总结

        不支持interval 分区,没有自带的自动新增分区功能;

        只支持分区索引,不支持全局索引;

  分区表的分区本身也是表,主表不存储数据,分区表存储数据; truncate,vacuum,analyze 主表会执行所有分区。truncate only 不能在主表上执行,但可以在存数据的分区表上执行,仅清除这个分区表; range,hash 分区的分区键可以有多个列,list分区的分区键只能是单个列或表达式;

 default 分区表会接收不在声明的范围中的数据;如果没有default分区,插入范围外的数据会直接报错;

      如果要新增分区,需要注意default分区中是否有这个新增分区的数据; partition of 创建的分区会自动创建主表上定于的索引、约束、行级触发器;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值