【问题标题】:PostgreSQL: performance impact of extra columnsPostgreSQL:额外列的性能影响
【发布时间】:2012-04-18 17:15:30
【问题描述】:

给定一个大表(10-1 亿行),向其中添加一些额外(未索引)列的最佳方法是什么?

  1. 只需添加列。
  2. 为每个额外的列创建一个单独的表,并在您想要访问额外的值时使用连接。

答案是否会根据额外列是密集的(大部分不是空的)还是稀疏的(大部分是空的)而改变?

【问题讨论】:

    标签: sql database performance postgresql


    【解决方案1】:

    可以将具有NULL 值的列添加到行中,而无需对数据页in most cases 的其余部分进行任何更改。 NULL 位图 中只需设置一位。所以,是的,在大多数情况下,添加稀疏列要便宜得多。

    为其他列创建一个单独的 1:1 表是否是一个好主意在很大程度上取决于用例。它通常更昂贵。对于初学者,每行有 28 个字节的开销(堆元组头加上项目标识符),每个表还有一些额外的开销。在查询中JOIN 行也比在一块中读取它们要昂贵得多。并且您需要在其上添加一个主/外键列和一个索引。如果您在大多数查询中不需要额外的列,那么拆分可能是一个好主意。大多数情况下,这是一个坏主意。

    在 PostgreSQL 中添加列很快。 更新列中的值可能很昂贵,因为每个UPDATE 都会写入一个新行(由于MVCC 模型)。因此,一次更新多个列是个好主意。

    Database page layout in the manual.

    如何计算行大小:

    【讨论】:

    • there is an overhead of 28 bytes (heaptuple header plus item pointer) per row and some additional overhead per table 确认一下,这是否意味着具有三个 4 字节整数(主键 + 2 个外键)的直通表每行需要 28+12 个字节?
    • @DavidTan:实际上,每行总共 44 个字节。 24 + 4 + 3*4 + 4 字节对齐填充。我在上面添加了指向更详细说明的链接。
    猜你喜欢
    • 2018-03-09
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多