什么是系统表在关系数据库中,为了实现数据库系统的控制,必须提供数据字典的功能。数据字典不仅存储各种对象的描述信息,而且存储系统管理所需的各种对象的细节信息。从内容来看,数据字典包含数据库系统中所有对象及其属性的描述信息、对象之间关系的描述信息、对象属性的自然语言含义以及数据字典变化的历史(即数据库的状态信息)。数据字典是关系数据库系统管理控制信息的核心,在PostgreSQL数据库系统中,系统表扮演着数据字典的角色。 系统表是PostgreSQL数据库存放结构元数据的地方,它在PostgreSQL中表现为存放有系统信息的普通表或者视图。用户可以删除然后重建这些表、增加列、插入和更新数值,然而由用户去修改系统会导致系统信息的不一致性,进而导致系统控制紊乱。正常情况下不应该由用户手工修改系统表,而是由SQL命令关联的系统表操作自动维护系统表信息。比如,创建数据库语句(CREATE DATABASE)会向pg_database系统表插入一行,并且在磁盘上创建该数据库。 PostgreSQL的每一个数据库中都有自己的一套系统表,其中大多数系统表都是在数据库创建时从模板数据库中拷贝过来的,因此这些系统表里的数据都是与所属数据库相关的。只有少数系统表是所有数据库共享的(比如pg_database),这些系统表里的数据是关于所有数据库的。 由于系统表保存了数据库的所有元数据,所以系统运行时对系统表的访问是非常频繁的。为了提高系统性能,在内存中建立了共享的系统表CACHE,使用Hash函数和Hash表提高查询效率,这些内容将在第3章详细介绍。 系统表功能的实现代码包含系统表定义文件和系统表绑定函数实现文件。分别位于如下位置: 在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表的函数。 pg_databasepostgres=# select * from pg_database; datname | datdba | encoding | datcollate | datctype | datistemplate | datallowconn | datconnlimit | datlastsysoid | datfrozenxid | datminmxid | dattablespace | datacl -----------+--------+----------+-------------+-------------+---------------+--------------+--------------+---------------+--------------+------------+---------------+----- ------------------------------------------------- postgres | 10 | 6 | en_US.UTF-8 | en_US.UTF-8 | f | t | -1 | 13805 | 548 | 1 | 1663 | {=Tc /postgres,postgres=CTc/postgres,duye=C/postgres} template1 | 10 | 6 | en_US.UTF-8 | en_US.UTF-8 | t | t | -1 | 13805 | 548 | 1 | 1663 | {=c/ postgres,postgres=CTc/postgres} template0 | 10 | 6 | en_US.UTF-8 | en_US.UTF-8 | t | f | -1 | 13805 | 548 | 1 | 1663 | {=c/ postgres,postgres=CTc/postgres} duyeweb | 10 | 6 | en_US.UTF-8 | en_US.UTF-8 | f | t | -1 | 13805 | 548 | 1 | 1663 | (4 rows) postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+-------------+-------------+----------------------- duyeweb | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =Tc/postgres + | | | | | postgres=CTc/postgres+ | | | | | duye=C/postgres template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres (4 rows) pg_namespacepostgres=# select * from pg_namespace; nspname | nspowner | nspacl --------------------+----------+------------------------------------- pg_toast | 10 | pg_temp_1 | 10 | pg_toast_temp_1 | 10 | pg_catalog | 10 | {postgres=UC/postgres,=U/postgres} public | 10 | {postgres=UC/postgres,=UC/postgres} information_schema | 10 | {postgres=UC/postgres,=U/postgres} (6 rows) 系统表pg_namespace用于存储命名空间。命名空间是SQL92模式下层的结构:每个名字空间有独立的关系、类型等集合,但并不会相互冲突。PostgreSQL的名字空间层次是:数据库.模式.表.属性。 当要访问一个对象时,PostgreSQL会按以下名字空间顺序进行搜索: 特殊名字空间(special),仅用于创建模式。 临时表的名字空间(TEMP)。 系统表的名字空间。 pg_namespace中每一个元组都对应一个名字空间,每一个名字空间都被分配一个OID(对象标识符,用于在整个数据库系统中唯一地标识一个数据库对象,包括数据库、表、视图、索引等)作为唯一标识,并且存储在对应元组的隐藏属性(PostgreSQL中每个元组都有几个用户不可见的属性,用于记录一些系统级的信息)中。每个元组(名字空间)包含的属性如表2-1所示。 pg_tablespacepostgres=# select * from pg_tablespace; spcname | spcowner | spcacl | spcoptions ------------+----------+--------+------------ pg_default | 10 | | pg_global | 10 | | (2 rows) 未完待续。。。。 (责任编辑:IT) |