【问题标题】:What is the size limit of a TOAST table in PostgreSQL? 4 billion rows o 4 billions values of chunk_id?PostgreSQL 中 TOAST 表的大小限制是多少? 40 亿行或 40 亿个 chunk_id 值?
【发布时间】:2020-07-01 17:04:08
【问题描述】:
在与 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 表,想知道我们是否接近极限。
提前致谢
【问题讨论】:
标签:
postgresql
limit
toast
oid
【解决方案1】:
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
这里chunk_id是单个toasted值的标识符,chunk_seq是toasted值被分割成的部分的索引。
由于只有大约 40 亿个不同的无符号 4 字节整数,而 oid 就是这种数据类型,因此每个数据库表中只能有 40 亿个 toasted 数据。
但是,并不是表中的每个条目都会被烘烤:只有当压缩后表行的大小超过 2000 字节时,才会将值存储在行外。
您可以为自己的表资助 TOAST 表:
SELECT reltoastrelid
FROM pg_class
WHERE relname = 'mytable';
然后你可以找到有多少个toasted条目:
SELECT count(DISTINCT chunk_id)
FROM pg_toast.pg_toast_12345;
警告:这是一个昂贵的查询。