【问题标题】:Efficient storage of a text array column in PostgreSQLPostgreSQL 中文本数组列的高效存储
【发布时间】:2021-12-06 17:58:41
【问题描述】:

我的问题主要与数据库存储/空间优化有关。我的数据库中有一个表 以下列:

  1. id:主键整数

  2. array_col:唯一文本[]

这个表是 - 迄今为止 - 数据库中最大的(就存储空间而言)并且包含大约 约 2 亿条记录。 array_col 有一些特征让我怀疑我 我没有以空间最佳的方式存储它。它们如下:

  1. 大多数字符串的长度都很合适(平均为 25 个字符)

  2. 文本数组的长度是可变的(通常每个数组有 100+ 个字符串)

  3. 各个字符串会在记录中以适当的频率重复。一般 给定的字符串将出现在数千条其他记录中。 (数组顺序趋于相似 也跨记录)

    id array_col
    1 […,"20 torque clutch settings",…]
    2 […,"20 torque clutch settings",…]
    3 […,"20 torque clutch settings",…]

    上表显示了跨记录重复的值。

我不想规范化这个表,因为将文本数组视为一个原子单元是最 对我的应用程序很有用,它也使查询变得更加简单。我也关心的排序 数组中的字符串也是如此。

我可以想到两种方法来解决这个问题:

  1. 创建查找表以避免重复字符串。这里的假设是 INT[] 可能是 比 TEXT[] 更节省空间。

    表 1

    id array_col
    1 […,47,…]
    2 […,47,…]
    3 […,47,…]

    表 2

    id name
    47 "20 torque clutch settings"

    问题: 据我所知,PostgreSQL 不支持外键数组。我也不确定触发器或存储过程会是什么样子。数据库一致性可能也会成为我更关心的问题。

  2. ZSON ?,我没有使用此扩展程序的经验,但听起来它可以做一些事情 在创建常用字符串的查找表方面类似。据我了解,我会 需要将数组列转换为某种 JSON 字符串。

    {"array_col":[…,“20 torque clutch settings”,…]}
    

    GitHub - postgrespro/zson: ZSON is a PostgreSQL extension for transparent JSONB compression

任何有关如何解决此问题的建议将不胜感激。做任何上述选择 在数据库设计方面似乎是合理的还是更好的长期方法?我目前正在使用 PostgreSQL 14 用于此。

【问题讨论】:

    标签: sql postgresql database-design


    【解决方案1】:

    如果你真的想优化存储空间,告诉 PostgreSQL 压缩超过 128 字节的列:

    ALTER TABLE tab SET (toast_tuple_target = 128);
    

    当然,优化空间可能对性能没有好处。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-20
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-23
      • 1970-01-01
      • 2015-08-29
      相关资源
      最近更新 更多