Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
表'上设置的默认值对性能的影响;postgresql中的s列_Sql_Postgresql - Fatal编程技术网

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

表'上设置的默认值对性能的影响;postgresql中的s列,sql,postgresql,Sql,Postgresql,如果表格的某列上有默认值,例如 create table emp ( flag smallint default 1 ) 因此,如果我没有在insert语句中使用此默认列,那么在批量导入中是否会有任何影响。如果您查看生成器/规划器/优化器/重写器的源代码 (postgresql/src/backend/rewrite/rewriteHandler.c位于第1112行,函数build\u column\u default()): 默认值(或函数,例如,对于序列)从目录

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

    create table emp
(
       flag    smallint default 1
)

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

如果您查看生成器/规划器/优化器/重写器的源代码 (postgresql/src/backend/rewrite/rewriteHandler.c位于第1112行,函数
build\u column\u default()
):

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

但是您必须测量差异以确定。

根据文档:

11点之前:

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

11及之后:

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


是否需要默认值?是的,我想要一个默认值,只是想知道是否对大容量插入和仅一行插入有任何影响,或者在insert语句中使用此列。如果没有默认值,它将为该列存储空值,则成本很小,因为每行将大两个字节。但是我不希望它被注意到。无论是哪种方式创建行,都必须编写
1
null
,因此我怀疑从IO角度看会有多大影响,从性能角度看,这通常是最大的工作量。这是在现有表中添加列,而不是创建全新的表。