考虑到一个大表(1000万到1亿行),添加一些额外(未编入索引)的列的最佳方法是什么?
答案的变化取决于额外的列是密集的(通常不是空的)还是稀疏的(大部分是空的)?
答案 0 :(得分:16)
可以将具有NULL
值的列添加到行中,而不对数据页的其余部分in most cases进行任何更改。只需在 NULL位图中设置一位。所以,是的,在大多数情况下,稀疏列的添加要便宜得多。
为其他列创建单独的1:1表格是否是一个好主意取决于用例。它通常更贵。对于初学者来说,每行有28个字节(堆栈头加项目指针)的开销,每个表有一些额外的开销。查询中JOIN
行的成本也比单个行读取要贵得多。您需要添加主/外键列以及索引。如果您在大多数查询中不需要其他列,则拆分可能是个好主意。大多数情况下这是一个坏主意。
在PostgreSQL中添加列很快。 更新列中的值可能很昂贵,因为每个UPDATE
都会写一个新行(由于MVCC模型)。因此,最好一次更新多个列。
Database page layout in the manual.
如何计算行大小: