PostgreSQL:额外列的性能影响

Dan*_*ein 5 sql database postgresql performance

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

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

答案的变化取决于额外的列是密集的(大多数不是空的)还是稀疏的(大多数是空的)?

Erw*_*ter 17

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

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

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

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

如何计算行大小: