【问题标题】:Performance impact of using PostgreSQL "IF NOT EXISTS" and similar for migrations使用 PostgreSQL "IF NOT EXISTS" 和类似的迁移对性能的影响
【发布时间】:2020-05-09 05:47:34
【问题描述】:
PostgreSQL 能够对大多数迁移类型的查询进行幂等操作。例如,CREATE TABLE IF NOT EXISTS "foo" 或 CREATE OR REPLACE FUNCTION "bar"() 等。使用这些类型的查询而不是检查每个增量迁移文件是否已运行的更传统的迁移表会对性能产生什么影响?
【问题讨论】:
标签:
postgresql
performance
database-migration
【解决方案1】:
liquidate、flyweight 等迁移工具能够检查对象是否存在,并在未找到时创建该对象。出于性能原因,迁移脚本应该以这种方式编写。一旦可以使迁移工具调用一个幂等对象创建脚本,该脚本使用像你描述的'REATE TABLE IF NOT EXISTS "foo" 这样的语法。因此,从性能的角度来看,这必须以一种或另一种方式完成。
迁移工具提供了一些额外的好处,例如 - 您可以在运行脚本之前添加任何前提条件。该前提条件可以与 SQL 为您拥有的所有对象提供的范围一样广泛。
它提供了版本控制机制,因为脚本在发布上运行,这些脚本可以累积并运行以重新创建数据库。当这些脚本使用你提到的可靠的前置条件和幂等脚本编写时,它们不会很慢。
总之,我会同时使用带有前置条件和幂等语法的迁移脚本。