postgresql中表列上设置的默认值对性能的影响

Rah*_*our 4 sql postgresql

如果表的某列有默认值,例如

    create table emp
(
       flag    smallint default 1
)
Run Code Online (Sandbox Code Playgroud)

那么,如果我不在插入语句中使用,则批量导入中的此默认列是否有任何影响。

mif*_*mif 7

根据文档:

11点之前:

添加具有默认值的列需要更新表的每一行(以存储新的列值)。但是,如果未指定默认值,PostgreSQL 能够避免物理更新。因此,如果您打算用大部分非默认值填充列,最好添加没有默认值的列,使用 UPDATE 插入正确的值,然后添加任何所需的默认值,如下所述。

来源

11 及之后:

从 PostgreSQL 11 开始,添加具有常量默认值的列不再意味着执行 ALTER TABLE 语句时需要更新表的每一行。相反,默认值将在下次访问该行时返回,并在重写表时应用,使得 ALTER TABLE 即使在大型表上也非常快。但是,如果默认值是易失性的(例如,clock_timestamp()),则需要使用执行 ALTER TABLE 时计算的值来更新每行。为了避免可能冗长的更新操作,特别是如果您打算用大部分非默认值填充列,最好添加没有默认值的列,使用 UPDATE 插入正确的值,然后添加任何所需的默认值,如下所述。

来源