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

  • 只需添加列即可。
  • 为每个额外的列创建一个单独的表,并在需要访问额外值时使用联接。

  • 答案会根据额外的列是密集的(通常不是null)还是稀疏的(通常是null)而改变吗?

    最佳答案

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

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

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

    Database page layout in the manual.

    如何计算行大小:

  • Making sense of Postgres row sizes
  • Calculating and saving space in PostgreSQL
  • 关于sql - PostgreSQL:额外列的性能影响,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10020573/

    10-11 22:53