11

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

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

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

4

1 回答 1

21

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

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

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

手册中的数据库页面布局。

如何计算行大小:

于 2012-04-04T23:29:45.510 回答