在PostgreSQL的Wiki中,与TOASTed表(https://wiki.postgresql.org/wiki/TOAST)有关:
“单个表中的线外值不能超过2 ^ 32(40亿),因为它的TOAST表中必须有重复的OID。”
这是什么意思?
1)TOAST表不能有超过40亿行?或
2)TOAST表不能具有超过40亿个不同的OID值(用于chunk_id列的值)?
我们有一个吐司表,其中有32亿行,想知道我们是否接近极限。
提前感谢
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;
警告:这是一个昂贵的查询。