Joh*_*han 3 postgresql database-design alter-table
相反:在创建新表时获取所有列是否更好?
我正在开发一个新系统,而且新的要求一直在出现。最新的要求是为每个客户添加一个新的标签字段,以便更容易在新旧系统之间关联数据。新系统尚未投入生产,但已经完成了迁移过程的一些测试运行。
目前,删除表并重新运行批量加载仍然可行,但未来如何 - 当系统中有大量实时数据并且出现对新列的需求时:它对例如,要导出数据,重新创建包含所有列的表,然后再次导入数据,而不仅仅是执行 ALTER TABLE ADD 列......?
如果它有任何不同,该解决方案基于 PostgreSQL 9.5,如果它确实有所不同,那么了解哪些 DBMS 或多或少关心会很有趣。
是否在此列上创建索引会影响答案?例如,当设置了唯一约束时。
ALTER TABLE是有原因的。更严重的是,除非您计划拥有一个非常大的数据集,否则您不必担心按需添加新列。删除和重新创建表只有在您没有(重要)数据时才可行,这意味着ALTER TABLE ... ADD COLUMN无论如何您都必须稍后使用。
当我在上面提到“非常大”时,它是关于用于列定义的不同数据类型的对齐和填充。例如,具有列(按此顺序)的表中的一行(smallint, integer, smallint)将比具有(smallint, smallint, integer). 这仅在 10 秒(在体面的硬件上可能是 100 秒)的百万行表或表有很多列和很多行时才开始产生影响。在 Erwin Brandstetter 的精彩回答中更多地了解了这一点。
在 11 之前的 Postgres 版本中添加新列时,请注意ALTER TABLE ... ADD COLUMN ... NOT NULL DEFAULT .... 由于ALTER TABLE ... ADD COLUMN需要重锁以防止并发会话访问表,因此您必须使事务尽可能短。如果您设法做到这一点,添加一个新列对于其他进程来说几乎不会引起性能方面的注意。