如果某个表在列上具有默认值,例如
create table emp
(
flag smallint default 1
)
如果我没有在insert语句中使用,那么这个默认列在批量导入中是否有任何影响。
答案 0 :(得分:0)
如果您查看生成器/计划器/优化器/重写器的源代码
(postgresql / src / backend / rewrite / rewriteHandler.c绕#1112行,函数build_column_default()
):
从目录中提取默认值(或函数,例如序列号),并将一次添加到查询树中。因此,DEFAULT
甚至可能更多高效,而不是从查询中的一个表中为所有受影响的行提取单独的值。
但你确实可以衡量差异。
答案 1 :(得分:0)
根据文档:
11点之前
添加具有默认值的列需要更新表的每一行(以存储新的列值)。但是,如果未指定默认值,则PostgreSQL可以避免物理更新。因此,如果您打算用大多数非默认值填充该列,则最好添加无默认值的列,使用UPDATE插入正确的值,然后按如下所述添加任何所需的默认值。
11及之后:
从PostgreSQL 11开始,添加具有恒定默认值的列不再意味着执行ALTER TABLE语句时需要更新表的每一行。取而代之的是,默认值将在下次访问该行时返回,并在重写表时应用,从而使ALTER TABLE即使在大型表上也非常快。但是,如果默认值是易失性的(例如clock_timestamp()),则需要使用执行ALTER TABLE时计算出的值来更新每一行。为避免可能进行冗长的更新操作,特别是如果您打算以任何方式都将大多数非默认值填充到该列中,则最好添加无默认值的列,使用UPDATE插入正确的值,然后添加任何所需的默认值,如下所述