PostgreSQL:额外列的性能影响

时间:2012-04-04 23:14:53

标签: sql database performance postgresql

考虑到一个大表(1000万到1亿行),添加一些额外(未编入索引)的列的最佳方法是什么?

  1. 只需添加列。
  2. 为每个额外列创建一个单独的表,并在您想要访问额外值时使用联接。
  3. 答案的变化取决于额外的列是密集的(通常不是空的)还是稀疏的(大部分是空的)?

1 个答案:

答案 0 :(得分:16)

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

为其他列创建单独的1:1表格是否是一个好主意取决于用例。它通常更贵。对于初学者来说,每行有28个字节(堆栈头加项目指针)的开销,每个表有一些额外的开销。查询中JOIN行的成本也比单个行读取要贵得多。您需要添加主/外键列以及索引。如果您在大多数查询中不需要其他列,则拆分可能是个好主意。大多数情况下这是一个坏主意。

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

Database page layout in the manual.

如何计算行大小: