【问题标题】: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;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-24
      • 2022-12-18
      • 2011-07-15
      • 2012-04-27
      • 2011-11-01
      相关资源
      最近更新 更多