文档章节

PostgreSQL系统表及其TOAST是如何定义的

有理想的猪
 有理想的猪
发布于 07/19 08:54
字数 779
阅读 15
收藏 0

本文只是讲PG怎样定义系统表,而不是修改系统表甚至是定义自己的系统表。

PG系统表,比如:pg_class、pg_attribute、pg_type 等等
这几个表相互关联,后两者要在pg_class记录自己的表定义,而pg_class又需要在后两者记录自己的字段和类型,看起来是个死扣。

关于它们怎么定义,有兴趣可以阅读:
System Catalog Declarations and Initial Contents
比以前的文档更加细致和明确,dat文件的定义方式也比以前更清晰。

1、系统表数据结构定义,打开 pg_class.h

CATALOG(pg_class,1259,RelationRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(83,RelationRelation_Rowtype_Id) BKI_SCHEMA_MACRO
{
  NameData  relname;    /* class name */
  Oid      relnamespace;  /* OID of namespace containing this class */
  Oid      reltype;    /* OID of entry in pg_type for table's
                 * implicit row type */
  Oid      reloftype;    /* OID of entry in pg_type for underlying
                 * composite type */
...

pg_class 表结构

flying=# \d pg_class
                     Table "pg_catalog.pg_class"
       Column        |     Type     | Collation | Nullable | Default
---------------------+--------------+-----------+----------+---------
 relname             | name         |           | not null |
 relnamespace        | oid          |           | not null |
 reltype             | oid          |           | not null |
 reloftype           | oid          |           | not null |
...

是不是一一对应,事实上建表脚本就是由这里抽取生成,所以它们才如此一致。

2、src/backend/catalog/genbki.pl脚本

这个Perl脚本负责抽取定义并生成postgres.bki,有兴趣可以结合上边的文档理解它。

BKI脚本由一个单独的语法引擎支持,不是我们常说的SQL,它在bootstrap下,有兴趣可以自己看,以后有机会再讲。

3、代码

我们这里只是看看PG怎么做,并不是修改,每个定义都有其相应代码,它们在commands和catalog下。

后边我会单独写一篇如何新增自己的系统字段。

4、TOAST表

像text类型的字段需要toast存储,系统表的OID都是预置并且不允许修改,所以它们的TOAST同样需要预设。

来看 src/include/catalog/toasting.h,以 pg_proc为例:

DECLARE_TOAST(pg_proc, 2836, 2837);

这个preprocessor是这样定义的:

#define DECLARE_TOAST(name,toastoid,indexoid) extern int no_such_variable

看起来毫无意义对吧,其实它并不是真的给PG代码用,而是genbki,看过代码就知道怎么回事。

5、索引

系统表也是需要索引的,定义在 src/include/catalog/indexing.h,还是以 pg_proc为例:

DECLARE_UNIQUE_INDEX(pg_proc_oid_index, 2690, on pg_proc using btree(oid oid_ops));
#define ProcedureOidIndexId  2690
DECLARE_UNIQUE_INDEX(pg_proc_proname_args_nsp_index, 2691, on pg_proc using btree(proname name_ops, proargtypes oidvector_ops, pronamespace oid_ops));
#define ProcedureNameArgsNspIndexId  2691

它有两个索引,上边的定义包括:名字、OID、am、字段。

这些预处理符同样不是给C代码准备的,只有genbki用得上。

6、初始数据

它们定义在同名的dat文件里,比如 pg_proc.dat。

7、字段可选值

这个并不算表定义,但也是放在一起的,比如pg_proc的provolatile只允许:

#define PROVOLATILE_IMMUTABLE	'i' /* never changes for given input */
#define PROVOLATILE_STABLE		's' /* does not change within a scan */
#define PROVOLATILE_VOLATILE	'v' /* can change even within a scan */

欢迎关注我的公众号,文章同步发布。

© 著作权归作者所有

有理想的猪
粉丝 137
博文 119
码字总数 49964
作品 0
红挢
高级程序员
私信 提问
PostgreSQL学习手册(十三) 系统表

一、pg_class: 该系统表记录了数据表、索引(仍然需要参阅pg_index)、序列、视图、复合类型和一些特殊关系类型的元数据。注意:不是所有字段对所有对象类型都有意义。 名字 类型 引用 描述 re...

长平狐
2012/09/06
112
0
PostgreSQL学习手册(十三) 系统表

一、pg_class: 该系统表记录了数据表、索引(仍然需要参阅pg_index)、序列、视图、复合类型和一些特殊关系类型的元数据。注意:不是所有字段对所有对象类型都有意义。 名字 类型 引用 描述 re...

长平狐
2012/08/27
195
0
PostgreSQL 通过分割heap数据文件分拆表的hacking方法

标签 PostgreSQL , heap file , toast file , 分区 , split , 拆表 , 大表 背景 为什么要将一张大表拆成若干张小表?前面的文档给出了原因 《PostgreSQL 并行vacuum patch - 暨为什么需要并行...

德哥
2018/04/18
0
0
PostgreSQL 11 preview - TOAST切片阈值表级可配置

标签 PostgreSQL , toast阈值表级动态设置 , 增强 , 11 背景 还记得我在13年的时候写过几篇关于变长字段优化的CASE,如果变长字段不怎么被更新,建议放到TOAST存储,因为放TOAST后,TUPLE中就...

德哥
2018/07/28
0
0
Postgres的TOAST技术

一、介绍 首先,Toast是一个名字缩写,全写是The OverSized Attribute Storage Technique,即超尺寸字段存储技术,顾名思义,是说超长字段在Postgres的一个存储方式。Postgres采用的存储默认...

kenyon_君羊
2013/03/11
3.3K
10

没有更多内容

加载失败,请刷新页面

加载更多

从0搭建自己的webpack开发环境(五)

往期回顾: 从0搭建自己的webpack开发环境(一) 从0搭建自己的webpack开发环境(二) 从0搭建自己的webpack开发环境(三) 从0搭建自己的webpack开发环境(四) 前四篇文章我们已经掌握了w...

前端优选
昨天
5
0
docker 构建php-fpm 7.2(swoole) 镜像

mkdir -p ~/mnt/docker/phpmkdir -p ~/mnt/docker/php#下载swoole-2.2.0.tgz安装包到software 下载地址:http://pecl.php.net/package/swoole/2.2.0#创建Dockerfilevim ~/docker/......

Jack088
昨天
5
0
简单工厂

定义:由一个工厂对象决定创建出哪一种产品类的实例 类型:创建型,但不属于GOF23种设计模式 工厂类负责创建的对象比较少 客户端(应用层)只知道传入工厂类的参数,对于如何创建对象,不关心...

东风破2019
昨天
4
0
SSH安全加强两步走

从 OpenSSH 6.2 开始已经支持 SSH 多因素认证,本文就来讲讲如何在 OpenSSH 下启用该特性。 OpenSSH 6.2 以后的版本多了一个配置项 AuthenticationMethods。该配置项可以让 OpenSSH 同时指定...

Linux就该这么学
昨天
7
0
聊聊nacos的TcpSuperSenseProcessor

序 本文主要研究一下nacos的TcpSuperSenseProcessor TcpSuperSenseProcessor nacos-1.1.3/naming/src/main/java/com/alibaba/nacos/naming/healthcheck/TcpSuperSenseProcessor.java @Compon......

go4it
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部