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;
警告:这是一个昂贵的查询。
在与 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;
警告:这是一个昂贵的查询。