【发布时间】:2012-04-18 17:15:30
【问题描述】:
给定一个大表(10-1 亿行),向其中添加一些额外(未索引)列的最佳方法是什么?
- 只需添加列。
- 为每个额外的列创建一个单独的表,并在您想要访问额外的值时使用连接。
答案是否会根据额外列是密集的(大部分不是空的)还是稀疏的(大部分是空的)而改变?
【问题讨论】:
标签: sql database performance postgresql
给定一个大表(10-1 亿行),向其中添加一些额外(未索引)列的最佳方法是什么?
答案是否会根据额外列是密集的(大部分不是空的)还是稀疏的(大部分是空的)而改变?
【问题讨论】:
标签: sql database performance postgresql
可以将具有NULL 值的列添加到行中,而无需对数据页in most cases 的其余部分进行任何更改。 NULL 位图 中只需设置一位。所以,是的,在大多数情况下,添加稀疏列要便宜得多。
为其他列创建一个单独的 1:1 表是否是一个好主意在很大程度上取决于用例。它通常更昂贵。对于初学者,每行有 28 个字节的开销(堆元组头加上项目标识符),每个表还有一些额外的开销。在查询中JOIN 行也比在一块中读取它们要昂贵得多。并且您需要在其上添加一个主/外键列和一个索引。如果您在大多数查询中不需要额外的列,那么拆分可能是一个好主意。大多数情况下,这是一个坏主意。
在 PostgreSQL 中添加列很快。 更新列中的值可能很昂贵,因为每个UPDATE 都会写入一个新行(由于MVCC 模型)。因此,一次更新多个列是个好主意。
Database page layout in the manual.
如何计算行大小:
【讨论】:
there is an overhead of 28 bytes (heaptuple header plus item pointer) per row and some additional overhead per table 确认一下,这是否意味着具有三个 4 字节整数(主键 + 2 个外键)的直通表每行需要 28+12 个字节?