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

What is the size limit of a TOAST table in PostgreSQL? 4 billion rows o 4 billions values of chunk_id?

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

"You cannot have more than 2^32 (4 billion) out-of-line values in a single table, because there would have to be duplicated OIDs in its TOAST table."

这是什么意思?

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

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

我们为 32 亿行干杯 table,想知道我们是否接近极限。

提前致谢

TOAST tables 定义如下:

\d pg_toast.pg_toast_59238
TOAST table "pg_toast.pg_toast_59238"
   Column   |  Type   
------------+---------
 chunk_id   | oid
 chunk_seq  | integer
 chunk_data | bytea

这里chunk_id是单个toasted value的标识符,chunk_seq是toasted value被分割成的部分的索引。

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

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

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

SELECT reltoastrelid
FROM pg_class
WHERE relname = 'mytable';

然后你可以找到有多少个toasted条目:

SELECT count(DISTINCT chunk_id)
FROM pg_toast.pg_toast_12345;

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