Fer*_*cho 4 postgresql oid limit toast
在与 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 表,想知道是否已接近极限。
提前致谢
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
Run Code Online (Sandbox Code Playgroud)
这chunk_id是单个 toasted 值的标识符,并且chunk_seq是 toasted 值已分割成的部分的索引。
由于只有大约 40 亿个不同的无符号 4 字节整数,并且这就是数据类型oid,因此每个数据库表中只能有 40 亿个烤数据。
然而,并不是表中的每个条目都会被烘烤:只有当压缩后表行的大小超过 2000 字节时,值才会存储在行外。
您可以为您的表资助 TOAST 表:
SELECT reltoastrelid
FROM pg_class
WHERE relname = 'mytable';
Run Code Online (Sandbox Code Playgroud)
然后您可以找到有多少个已烘烤的条目:
SELECT count(DISTINCT chunk_id)
FROM pg_toast.pg_toast_12345;
Run Code Online (Sandbox Code Playgroud)
警告:这是一个昂贵的查询。
| 归档时间: |
|
| 查看次数: |
1598 次 |
| 最近记录: |