读书笔记-PostgreSQL数据库内核分析 系统表

在关系数据库中,为了实现数据库系统的控制,必须提供数据字典的功能。数据字典不仅存储各种对象的描述信息,而且存储系统管理所需的各种对象的细节信息。从内容来看,数据字典包含:

  1. 数据库系统中所有对象及其属性的描述信息
  2. 对象之间关系的描述信息
  3. 对象属性的自然语言含义
  4. 数据字典变化的历史(即数据库的状态信息)

数据字典是关系数据库系统管理控制信息的核心,在PostgreSQL数据库系统中,系统表扮演着数据字典的角色。系统表是PostgreSQL数据库存放结构元数据的地方,它在PostgreSQL中表现为存放有系统信息的普通表或者视图。用户可以删除然后重建这些表、增加列、插入和更新数值,然后由用户去修改系统会导致系统信息的不一致性,进而导致系统控制紊乱。正常情况下不应该由用户手工修改系统表,而是由SQL命令关联的系统表操作自动维护系统表信息。比如,创建数据库语句会向pg_database系统表插入一行,并且在磁盘上创建该数据库。
PostgreSQL的每一个数据库中都有自己的一套系统表,其中大多数系统表都是在数据库创建时从模板数据库中拷贝过来的,因此这些系统表里的数据都是与所属数据库相关的。只有少数系统表是所有数据库共享的(比如pg_database),这些系统表里的数据是关于所有数据库的。
由于系统表保存了数据库的所有元数据,所有系统运行时对系统表的访问是非常频繁的。为了提高系统性能,在内存中建立共享的系统表CACHE,使用Hash函数和Hash表提高查询效率
系统表功能的实现代码包含系统表定义文件和系统表绑定函数实现文件。分别位于如下位置:
在src/include/catalog目录下有若干以’pg_xxx’开头的.h文件,它们相应地定义了名为pg_xxx的系统表的数据结构,其中的Indexing.h文件定义了所有的系统表索引,toasting.h文件定义了所有系统表的TOAST表(TOAST表用于存放普通表中超长属性值)
在src/backend.catalog目录下的pg_xxx.c文件中定义了对pg_xxx进行相关操作的函数,其中的indexing.c文件定义了四个操作系统表索引的函数,toasting.c文件定义了四个操作系统表的TOAST表的函数。

主要系统表功能及依赖关系

在PostgreSQL 8.4.1中,共有42张系统表和17张系统视图,系统视图是建立在基本系统表之上的。

系统表

读书笔记-PostgreSQL数据库内核分析 系统表_第1张图片
pg_namespace
系统表pg_namespace用于存储命名空间。命名空间是SQL92模式下层的结构:每个名字空间有独立的关系、类型等集合,但并不会相互冲突。PostgreSQL的名字空间层次是:数据库、模式、表、属性。当要访问一个对象时,PostgreSQL会按一下名字空间顺序进行搜索:特殊名字空间(special),仅用于创建模式->临时表的名字空间(TEMP)->系统表的名字空间。
pg_namespace中每个元组都对应一个名字空间,每个名字空间都被分配一个OID(对象标识符,用于在整个数据库系统中唯一地标识一个数据库对象,包括数据库、表、视图、索引等)作为唯一标识,并且存储在对应元组的隐藏属性(PostgreSQL中每个元组都有几个用户不可见的属性,用于记录一些系统级的信息)中。
读书笔记-PostgreSQL数据库内核分析 系统表_第2张图片
pg_tablespace
pg_tablespace存储表空间信息,将表放置在不同的表空间有助于实施磁盘文件布局。pg_tablespace在整个数据集簇里只有一份,也就是说同一个数据集簇内的所用数据库共享一个pg_tablespace表。PostgreSQL里的表空间允许数据库管理员在文件系统里定义代表数据库对象的文件的存放位置。通过使用表空间,管理员可以控制一个PostgreSQL中数据的磁盘布局,即可以通过表空间将PostgreSQL系统的数据分布在不同的磁盘位置上。

  • 如果初始的集簇所在的分区或者卷用光了空间,而又无法扩展该分区或卷的空间,那么可以通过表空间去利用另一个分区的空间
  • 表空间允许管理员根据数据库对象的使用模式安排数据位置,从而优化性能。比如一个使用很频繁的索引可以放在非常快并且可靠的磁盘上,而一个存储归档的数据、很少使用的或者对性能要求不高的表可以存储在一个相对便宜但速度比较慢的磁盘系统上。
    pg_tablespace中每一个元组都对应一个表空间,每一个表空间都被分配一个OID作为唯一标识,并且存储在对应元祖的隐藏属性中。
    读书笔记-PostgreSQL数据库内核分析 系统表_第3张图片

pg_database
pg_database中存放了当前数据集簇中数据库的信息,它是一个在整个集簇范围内共享的系统表。该表中每个元祖就标识集簇中的一个数据库,每一个数据库都被分配一个OID作为唯一标识,并且存储在对应元祖的隐藏属性中。
读书笔记-PostgreSQL数据库内核分析 系统表_第4张图片
pg_class
pg_class存储表及与表类似结构的数据库对象信息,包括索引、序列、视图、复合物数据类型、TOAST表等。每一个对象都在pg_class中表示为一个元祖,并且每一个对象都会被分配一个OID作为唯一标识,该OID作为该元祖的一个隐藏属性存储。
读书笔记-PostgreSQL数据库内核分析 系统表_第5张图片
读书笔记-PostgreSQL数据库内核分析 系统表_第6张图片
pg_type
pg_type存储数据类型信息。基本数据类型和枚举类型由CREATE TYPE创建,域类型由CREATE DOMAIN创建,复合数据类型在表创建时自动创建。pg_type中每一个元祖对应一个数据类型。
读书笔记-PostgreSQL数据库内核分析 系统表_第7张图片
读书笔记-PostgreSQL数据库内核分析 系统表_第8张图片
pg_attribute
pg_attribute存储表的属性信息,对于数据库中标的每一个属性都有一个元祖。
读书笔记-PostgreSQL数据库内核分析 系统表_第9张图片
读书笔记-PostgreSQL数据库内核分析 系统表_第10张图片
pg_index
pg_index存储索引的具体信息
读书笔记-PostgreSQL数据库内核分析 系统表_第11张图片

系统视图

系统视图是在初始化数据库集簇的时候读取脚本创建的。系统视图提供了查询系统表和访问数据库内部状态的方法。
读书笔记-PostgreSQL数据库内核分析 系统表_第12张图片

你可能感兴趣的:(计算机存储,#,PostgreSQL,postgresql)