前言
上篇博客讲述了 postgresql 如何存储变长数据,它的应用主要是在 toast 。Toast 在存储大型数据时,会将它存储在单独的表中(称为 toast 表)。因为 postgresql 的 tuple(行数据)是存在在 Page 中的,Page 的大小默认为 8KB。postgresql 不允许 tuple 跨页存储,所以当一行数据的某个列数据过大时,比如 text 类型的数据,超过了单页的大小,那么 postgresql 会将它压缩,切分,并且存储在另外的位置。这种技术就是称为 Toast。
Toast 表
如果我们创建了一张表,有了变长数据的列,那么就会有一个对应的 toast 表,专门存储过大的数据。下面展示了一个例子
test=# \d mytable
Table "public.mytable"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
id | integer | | not null |
name | text | | |
Indexes:
"mytable_pkey" PRIMARY KEY, btree (id)
可以看见 mytable 有个变长数据类型的列 name。然后我们来看看表对应的 oid。
test=# select oid from pg_class where relname = 'mytable';
oid
--------
127295
(1 row)
可以看到 mytable 表的 oid 为 127295,那么可以推断出它的 toast 表名称为 pg_toast_127295,其对应的 oid 仍然可以通过上述语句查出来(在此省略了),或者
test=# select reltoastrelid from pg_class where relname = 'mytable';
reltoastrelid
---------------
127298

最低0.47元/天 解锁文章
479

被折叠的 条评论
为什么被折叠?



