Hasty Briefsbeta

双语

Why It's So Hard to Add a Column in the Middle of a PostgreSQL Table

a day ago
  • PostgreSQL的ADD COLUMN仅将新列添加到末尾,没有'AFTER'子句,这与MySQL不同。这是由于系统目录中的attnum字段所致,该字段为每个列创建时分配一个唯一标识符且永不更改。attnum承担三个角色:作为列的身份标识、磁盘元组中的物理位置以及查询中的逻辑顺序,这使得重新排序变得复杂。删除的列会留下墓碑记录,其attnum槽位不会回收,导致未使用空间直到表被重写。列顺序因数据类型对齐填充影响存储效率;通过'列俄罗斯方块'优化将较宽的列放在首位可节省约20%的磁盘空间。自2014年起,PostgreSQL开发者已提议将attnum拆分为身份、物理和逻辑位置的独立字段,但由于广泛的代码依赖,实施停滞不前。目前,通过ACCESS EXCLUSIVE锁重建表是重新排序列以获取存储增益的唯一方法。MySQL能够轻松处理列重排序,因为它将逻辑和物理列顺序分离,允许在近期版本中无需表重写即可即时添加列。