PostgreSQL 中 TOAST 表的大小限制是多少?40 亿行或 40 亿个 chunk_id 值?

Fer*_*cho 4 postgresql oid limit toast

在与 TOASTed 表相关的 PostgreSQL wiki ( https://wiki.postgresql.org/wiki/TOAST ) 中说:

“单个表中的外线值不能超过 2^32(40 亿)个,因为 TOAST 表中必须有重复的 OID。”

这是什么意思?

1)TOAST表不能有超过40亿行?或者

2) TOAST 表不能有超过 40 亿个不同的 OID 值(chunk_id 列的值)?

我们有一个包含 32 亿行的 Toast 表,想知道是否已接近极限。

提前致谢

Lau*_*lbe 5

TOAST 表的定义如下:

\d pg_toast.pg_toast_59238
TOAST table "pg_toast.pg_toast_59238"
   Column   |  Type   
------------+---------
 chunk_id   | oid
 chunk_seq  | integer
 chunk_data | bytea
Run Code Online (Sandbox Code Playgroud)

chunk_id是单个 toasted 值的标识符,并且chunk_seq是 toasted 值已分割成的部分的索引。

由于只有大约 40 亿个不同的无符号 4 字节整数,并且这就是数据类型oid,因此每个数据库表中只能有 40 亿个烤数据。

然而,并不是表中的每个条目都会被烘烤:只有当压缩后表行的大小超过 2000 字节时,值才会存储在行外。

您可以为您的表资助 TOAST 表:

SELECT reltoastrelid
FROM pg_class
WHERE relname = 'mytable';
Run Code Online (Sandbox Code Playgroud)

然后您可以找到有多少个已烘烤的条目:

SELECT count(DISTINCT chunk_id)
FROM pg_toast.pg_toast_12345;
Run Code Online (Sandbox Code Playgroud)

警告:这是一个昂贵的查询。