↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

百科 / 存储结构 / 物理结构

TOAST

本节概述超长属性存储技术( TOAST , The Oversized-Attribute Storage Technique)。 PostgreSQL 使用固定页面大小(通常为 8 kB),并且不允许元组跨越多个页面。因此,无法直接存储非常大的字段值。为克服这一限制,大字段值会被压缩并且/或者拆分成多个物理行。这个过程对用户是透明的,而且对大部分后端代码的影响很小。这项技术被亲切地称为 TOAST (或者 “ 自切片面包问世以来最棒的东西 ” )。 TOAST 基础设施也被用于改进内存中大型…

当前查看 PostgreSQL 18。

中文定义与说明

存储结构 storage-toast。

同版本中文手册节选

本节概述超长属性存储技术(TOAST, The Oversized-Attribute Storage Technique)。

PostgreSQL 使用固定页面大小(通常为 8 kB),并且不允许元组跨越多个页面。因此,无法直接存储非常大的字段值。为克服这一限制,大字段值会被压缩并且/或者拆分成多个物理行。这个过程对用户是透明的,而且对大部分后端代码的影响很小。这项技术被亲切地称为 TOAST(或者“自切片面包问世以来最棒的东西”)。TOAST 基础设施也被用于改进内存中大型数据值的处理。

只有某些数据类型支持 TOAST,因为没有必要让那些不可能产生大字段值的数据类型承担这部分额外开销。要支持 TOAST,数据类型必须具有变长(varlena)表示形式,在通常情况下,任何已存储值的第一个四字节字都包含该值以字节计的总长度(包括其自身)。TOAST 对该数据类型表示形式的其余部分没有约束。统称为经过 TOAST 处理的值的特殊表示形式,是通过修改或重新解释这个初始长度字来工作的。因此,支持可 TOAST 数据类型的 C 级函数,必须小心处理可能已经过 TOAST 处理的输入值:在被去 TOAST 化之前,一个输入值未必真正由四字节长度字和内容组成。(通常是在对输入值做任何处理之前调用 PG_DETOAST_DATUM,但在某些情况下也可以采用更高效的方法。详见第 36.13.1 节。)

TOAST 会占用 varlena 长度字中的两个位(在大端机器上是最高的两位,在小端机器上是最低的两位),从而把任何可 TOAST 数据类型值的逻辑大小限制为 1 GB(230 - 1 字节)。当这两个位都为零时,该值就是这种数据类型的普通、未经 TOAST 处理的值,长度字的其余位给出该 datum 的总大小(包括长度字),以字节计。当最高位或最低位被置位时,该值使用的不是通常的四字节头部,而是单字节头部;该字节的其余位给出 datum 的总大小(包括长度字节),以字节计。这样既能高效存储短于 127 字节的值,又仍然允许数据类型在需要时增长到 1 GB。带单字节头部的值不按任何特定边界对齐,而带四字节头部的值至少按四字节边界对齐;省去这部分对齐填充后,相对于短值而言,可以显著节省空间。作为特殊情况,如果单字节头部的其余位全为零(对于包含长度字节自身的长度而言,这是不可能的),则该值是一个指向行外数据的指针,它可能有下面将描述的几种形式。这样一种 TOAST 指针的类型和大小,由 datum 第二个字节中存储的编码决定。最后,当最高位或最低位为零、但相邻的一位被置位时,该 datum 的内容已被压缩,使用前必须先解压。在这种情况下,四字节长度字的其余位给出的是压缩后 datum 的总大小,而不是原始数据的大小。请注意,行外数据也可能被压缩,但 varlena 头部不会告诉你是否发生了压缩,这一点要由 TOAST 指针的内容来说明。

查看完整中文手册与上下文。

说明

本节概述超长属性存储技术( TOAST , The Oversized-Attribute Storage Technique)。 PostgreSQL 使用固定页面大小(通常为 8 kB),并且不允许元组跨越多个页面。因此,无法直接存储非常大的字段值。为克服这一限制,大字段值会被压缩并且/或者拆分成多个物理行。这个过程对用户是透明的,而且对大部分后端代码的影响很小。这项技术被亲切地称为 TOAST (或者 “ 自切片面包问世以来最棒的东西 ” )。 TOAST 基础设施也被用于改进内存中大型数据值的处理。 只有某些数据类型支持 TOAST ,因为没有必要让那些不可能产生大字段值的数据类型承担这部分额外开销。要支持 TOAST ,数据类型必须具有变长( varlena )表示形式,在通常情况下,任何已存储值的第一个四字节字都包含该值以字节计的总长度(包括其自身)。 TOAST 对该数据类型表示形式的其余部分没有约束。统称为 经过 TOAST 处理的值 的特殊表示形式,是通过修改或重新解释这个初始长度字来工作的。因此,支持可 TOAST 数据类型的 C 级函数,必须小心处理可能已经过 TOAST 处理的输入值:在被 去 TOAST 化 之前,一个输入值未必真正由四字节长度字和内容组成。(通常是在对输入值做任何处理之前调用 PG_DETOAST_DATUM ,但在某些情况下也可以采用更高效的方法。详见 第 36.13.1 节 。) TOAST 会占用 varlena 长度字中的两个位(在大端机器上是最高的两位,在小端机器上是最低的两位),从而把任何可 TOAST 数据类型值的逻辑大小限制为 1 GB(2 30 - 1 字节)。当这两个位都为零时,该值就是这种数据类型的普通、未经 TOAST 处理的值,长度字的其余位给出该 datum 的总大小(包括长度字),以字节计。当最高位或最低位被置位时,该值使用的不是通常的四字节头部,而是单字节头部;该字节的其余位给出 datum 的总大小(包括长度字节),以字节计。这样既能高效存储短于 127 字节的值,又仍然允许数据类型在需要时增

定义范围
同版本核心物理存储文档

相关条目

文档与源码

来源构建
版本
18.6
构建
https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2
来源指纹
555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f

版本比较

PostgreSQL 17 → 18: 无变化。

比较已记录的接口与属性,排除来源指纹和构建元数据。某个样本中没有记录,不能据此判断实际引入或移除的版本。

相关条目

导出 JSON · 返回存储结构 · 收录范围为 PostgreSQL 10 至 20;最早采样版本不一定是实际引入版本。