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

时间:2018-01-03 13:53:22

标签: sql postgresql

如果某个表在列上具有默认值,例如

    create table emp
(
       flag    smallint default 1
)

如果我没有在insert语句中使用,那么这个默认列在批量导入中是否有任何影响。

2 个答案:

答案 0 :(得分:0)

如果您查看生成器/计划器/优化器/重写器的源代码 (postgresql / src / backend / rewrite / rewriteHandler.c绕#1112行,函数build_column_default()):

从目录中提取默认值(或函数,例如序列号),并将一次添加到查询树中。因此,DEFAULT甚至可能更多高效,而不是从查询中的一个表中为所有受影响的行提取单独的值。

但你确实可以衡量差异。

答案 1 :(得分:0)

根据文档:

11点之前

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

source

11及之后:

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

source