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

问题描述 投票:3回答:1

在PostgreSQL的Wiki中,与TOASTed表(https://wiki.postgresql.org/wiki/TOAST)有关:

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

这是什么意思?

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

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

我们有一个吐司表,其中有32亿行,想知道我们是否接近极限。

提前感谢

postgresql limit toast oid
1个回答
3
投票

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是单个烘烤值的标识符,chunk_seq是将烘烤值分割成的部分的索引。

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

但是,并非表中的每个条目都被烘烤:仅在压缩后表行的大小超过2000字节时,值才存储为行外。

您可以为表的TOAST表注资:

SELECT reltoastrelid
FROM pg_class
WHERE relname = 'mytable';

然后您可以找到多少个烤面包条目:

SELECT count(DISTINCT chunk_id)
FROM pg_toast.pg_toast_12345;

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

© www.soinside.com 2019 - 2024. All rights reserved.