Postgresql pg_toast 表,它们是强制性的吗?

ult*_*man 2 postgresql

我在 PostgreSQL v13 中有一个小模式,只有模式结构,但仍然没有数据。

我所看到的是,我得到了一些pg_toast普通表的表,尽管里面没有数据。我有一个包含 5 列的简单表,其中一些是 varchar=200 长度和 inte=19 长度。

pg_toast当我没有向表中插入任何数据时,为什么我会得到这些表。pg_toast我可以看到表pg_class与列的关系reltoastrelid

这些表有 0 KB 数据,根据:

pg_relation_size(reltoastrelid) AS toast_size
Run Code Online (Sandbox Code Playgroud)

唯一拥有pg_toast数据的是:pg_rewritepg_statistic

Sah*_*sci 5

当列大小大于 TOAST 阈值 (2 kb) 时,PostgreSQL 内部不会将列存储在元组中。例如,整数值的大小为 4 字节,这显然适合页面大小。varchar然而,对于某些数据类型(例如或 ),页面并不总是足够的text。为了解决这个限制,PostgreSQL 使用了一种称为TOAST(超大属性存储技术)的存储技术。PostgreSQL 基本上创建一个新表,称为 toast 表,并将值作为压缩块存储在其中。pg_toast* 这就是目录中有表格的原因pg_class

它们是强制性的吗?是的(某种程度上)-它们是内部关系(表),在大多数情况下您不应该关心它们。