2012-04-04 108 views
5

给定一个大表(10-100万行)向其中添加一些额外(未索引)列的最佳方式是什么?PostgreSQL:额外列的性能影响

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

答案会根据额外的列是密集的(大多是非空的)还是稀疏的(大多为空)而改变?

回答

13

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

创建一个单独的1:1表的附加列是一个好主意,这很大程度上取决于用例。它通常更昂贵。对于初学者来说,每行有28个字节的开销(heaptuple头+项目指针),每个表有额外的开销。查询中的JOIN行的成本也比单独读取要高得多。你需要添加一个主键/外键列和一个索引。如果在大多数查询中不需要额外的列,那么分割可能是个好主意。大多数情况下这是一个糟糕的主意。

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

Database page layout in the manual.

如何计算行大小:

+0

'有每行和大约28个字节(heaptuple首部加上项指针)的塔顶每个表的额外开销只是为了确认,这是否意味着具有三个4字节整数(主键+2 fo统治键)每行需要28 + 12字节? – dtgq 2016-11-27 16:39:14

+1

@DavidTan:实际上,每行总共有44个字节。 24 + 4 + 3 * 4 + 4字节的对齐填充。我在上面添加了更多详细解释的链接。 – 2016-11-27 21:01:02