postgresql新增非空默认值字段是否需要重写表

简介: PostgreSQL 10 版本前表新增不带默认值的DDL不需要重写表,只需要更新数据字典,因此DDL能瞬间执行,如下: ALTER TABLE table_name ADD COLUMN flag text; 如果新增的字段带默认值,则需要重写表,表越大,执行时间越长,如下。

PostgreSQL 10 版本前表新增不带默认值的DDL不需要重写表,只需要更新数据字典,因此DDL能瞬间执行,如下:

ALTER TABLE table_name ADD COLUMN flag text;

如果新增的字段带默认值,则需要重写表,表越大,执行时间越长,如下。

ALTER TABLE table_name ADD COLUMN flag text DEFAULT 'default values';

生产环境下给大表添加带 Default 值的字段将非常吃力,通常分两步进行:

  1. 第一步: 先添加不带 Default值的字段。
  2. 第二步: 写函数批量刷新新增字段的默认值。

上述第二步比较麻烦,也可以在业务低谷或申请停服窗口一次性完成带DEFAUL值字段的新增。

PostgreSQL 11 版本这方面进一步增强,表新增带非空默认值的字段不再需要重写表,Release 中的说明如下:

Release中的说明

Allow ALTER TABLE to add a column with a non-null default without a table rewrite

本文分别在 10 版本和 11 版本进行测试。

PostgreSQL 10 版本

创建测试表并插入1000万数据,如下。

[pg10@pghost1 ~]$ psql mydb pguser
psql (10.0)
Type "help" for help.mydb=> CREATE TABLE t1(id int4, name text);
CREATE TABLEmydb=> INSERT INTO t1 (id,name ) SELECT n, n || '_ALTER TABLE TEST ' FROM generate_series (1,10000000) n;
INSERT 0 10000000mydb=> ANALYZE t1;
ANALYZE

查看表的 relfilenode 和 relpages 信息,relfilenode 表示表的物理文件号。

mydb=> SELECT relname,relfilenode, relpages FROM pg_class WHERE relname='t1';relname | relfilenode | relpages
---------+-------------+----------t1      |       25672 |    73530
(1 row)

新增带默认值的非空字段,如下。

mydb=> \timing
Timing is on.mydb=> ALTER TABLE t1 ADD COLUMN flag text DEFAULT 'abcdefg';
ALTER TABLE
Time: 15540.002 ms (00:15.540)

执行时间较长,需要15秒左右。

表分析后再次查看表的 relfilenode 和 relpages信息

mydb=> ANALYZE t1;
ANALYZEmydb=> SELECT relname,relfilenode, relpages FROM pg_class WHERE relname='t1';relname | relfilenode | relpages
---------+-------------+----------t1      |       25679 |    83334
(1 row)

发现 relfilenode 有变化 ,之前的 relfilenode 值为 25672 ,说明表被重写。另一方面 relpages 变大了。

PostgreSQL 11 版本

创建测试表并插入1000万数据,如下。

[pg11@pghost2 ~]$ psql francs francs
psql (11beta3)
Type "help" for help.francs=> CREATE TABLE t1(id int4, name text);
CREATE TABLEfrancs=> INSERT INTO t1 (id,name ) SELECT n, n || '_ALTER TABLE TEST ' FROM generate_series (1,10000000) n;
INSERT 0 10000000francs=> ANALYZE t1;
ANALYZE

查看表的 relfilenode 和 relpages信息,如下:

francs=> SELECT relname,relfilenode, relpages FROM pg_class WHERE relname='t1';relname | relfilenode | relpages
---------+-------------+----------t1      |       16802 |    73530

新增带默认值的非空字段,如下。

francs=> \timing
Timing is on.francs=> ALTER TABLE t1 ADD COLUMN flag text DEFAULT 'abcdefg';
ALTER TABLE
Time: 40.743 ms

执行时间只需要 40 ms,瞬间完成。

表分析后再次查看表的 relfilenode 和 relpages信息

francs=> ANALYZE t1;
ANALYZEfrancs=> SELECT relname,relfilenode, relpages FROM pg_class WHERE relname='t1';relname | relfilenode | relpages
---------+-------------+----------t1      |       16802 |    73530
(1 row)

发现 relfilenode 没有变化,依然是 16802,同时 relpages 也没有变化。

增加1000字段

PostgreSQL 11 版本给表 t1 增加了一个带默认值的字段后表占用空间没有变化,是不是增加的字段数不够多?接着往下测试,增加1000个带默认值的字段,看看情况如何?

创建测试表并插入1000万测试数据,如下:

francs=> DROP TABLE t1;
DROP TABLEfrancs=> CREATE TABLE t1(id int4, name text);
CREATE TABLEfrancs=> INSERT INTO t1 (id,name ) SELECT n, n || '_ALTER TABLE TEST ' FROM generate_series (1,10000000) n;
INSERT 0 10000000francs=> ANALYZE t1;
ANALYZE

查看表的 relfilenode 和 relpages信息,如下:

francs=> SELECT relname,relfilenode, relpages FROM pg_class WHERE relname='t1';relname | relfilenode | relpages
---------+-------------+----------t1      |       34187 |    73530
(1 row)

查看表大小,如下:

francs=> SELECT pg_size_pretty(pg_relation_size('t1'));pg_size_pretty
----------------574 MB
(1 row)

创建函数,此函数用来给表 t1 添加 1000 个带默认值的字段,如下:

CREATE OR REPLACE FUNCTION  add_column() RETURNS INTEGER  AS  $BODY$
DECLAREcolumn_name       text;default_value     text;
BEGINdefault_value:= repeat(md5('1'),10);FOR i in 1..1000 LOOPcolumn_name:= 'flag' || i;EXECUTE  
$$ALTER TABLE t1 ADD COLUMN 
$$|| column_name  || 
$$text default' 
$$|| default_value  || 
$$
'
$$;END LOOP;RETURN 1;
END
$BODY$  LANGUAGE 'plpgsql';

执行函数,如下:

francs=> SELECT add_column();add_column
------------1
(1 row)

这时表t1已增加了1000个字段,如下:

francs=> SELECT * FROM t1 LIMIT 1;
-----------------------------------------[ RECORD 1 ]-----------------------------------------------------------------------------------------------------------------------id       | 1
name     | 1_ALTER TABLE TEST
flag1    |  c4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849b
flag2    |  c4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849b
flag3    |  c4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849b
flag4    |  c4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849b
flag5    |  c4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849b
flag6    |  c4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849b
flag7    |  c4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849bc4ca4238a0b923820dcc509a6f75849b
...省略

查看表 relfilenode 和 relpages,没有变化。

francs=> SELECT relname,relfilenode, relpages FROM pg_class WHERE relname='t1';relname | relfilenode | relpages
---------+-------------+----------t1      |       34187 |    73530
(1 row)

再次确认表大小,依然还是 574MB。

francs=> SELECT pg_size_pretty(pg_relation_size('t1'));pg_size_pretty
----------------574 MB
(1 row)

从以上看出给表t1增加了1000个带默认值的字段后,t1表大小依然没有变化。

参考

  • WAITING FOR POSTGRESQL 11 – FAST ALTER TABLE ADD COLUMN WITH A NON-NULL DEFAULT
  • PostgreSQL 11 preview - 添加非空默认值不需要 rewrite table - online add column with default value

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/159781.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql使用--数据的插入,删除和更新

1.UNION合并多个结果集 如&#xff1a;SELECT m1, n1 FROM t1 WHERE m1 < 2 UNION SELECT m2, n2 FROM t2 WHERE m2 > 2; 默认下&#xff0c;某行在参与合并两个结果集均存在时&#xff0c;最终结果集中只包含一行。 如希望最终结果集包含两行&#xff0c;用UNION ALL。 …

慕尼黑电子展Samtec Demo | 回环测试带来Samtec产品组合优异表现

【摘要/前言】 大家好&#xff01;Electronica虎家展台Demo系列回来咯。 实践出真知&#xff0c;再好的纸面数据都不如来一场实际的测试和演示。Samtec团队始终在努力为客户带来卓越的产品和优质服务。而这其中&#xff0c;Demo演示的存在至关重要。演示过程可以为大家带来了…

关于Flink的旁路缓存与异步操作

1. 旁路缓存 1. 什么是旁路缓存? 将数据库中的数据,比较经常访问的数据,保存起来,以减少和硬盘数据库的交互 比如: 我们使用mysql时 经常查询一个表 , 而这个表又一般不会变化,就可以放在内存中,查找时直接对内存进行查找,而不需要再和mysql交互 2. 旁路缓存例子使用 dim层…

Vue-报错No “exports“ main defined in xx

vue报错&#xff1a;No "exports" main defined in F:\wjh\vue#Practice\EasyQuestionnaire-web-master\EasyQuestionnaire-web-master\node_modules\babel\helper-compilation-targets\package.json 1.在文件中找到该路径的package.json文件&#xff0c; 2.按照提示…

人工智能:拥抱未来之手

人工智能对我们的生活影响有多大 人工智能给我们的生活带来了巨大的影响&#xff01;它像魔术师一样&#xff0c;帮我们解决问题、提供建议&#xff0c;甚至预测未来。从智能手机到智能家居&#xff0c;人工智能让我们的生活变得更便捷、更智能。它是我们生活中的得力助手&…

MEMS制造的基本工艺——晶圆键合工艺

晶圆键合是一种晶圆级封装技术&#xff0c;用于制造微机电系统 (MEMS)、纳米机电系统 (NEMS)、微电子学和光电子学&#xff0c;确保机械稳定和气密密封。用于 MEMS/NEMS 的晶圆直径范围为 100 毫米至 200 毫米&#xff08;4 英寸至 8 英寸&#xff09;&#xff0c;用于生产微电…

java序列化与反序列化

java中序列化与反序列化 概念 在Java中&#xff0c;序列化是指将对象转换为字节流的过程&#xff0c;而反序列化则是将字节流转换回对象的过程。序列化和反序列化通常用于在网络上传输对象或将对象持久化到磁盘上。 要对一个对象进行序列化&#xff0c;可以使用ObjectOutput…

github访问失败

1. 问题场景 今天了解到notepad可以安装许多插件&#xff0c;但是自动下载插件时总是失败&#xff0c;这些插件的下载源都是github&#xff0c;将地址复制到浏览器也打不开&#xff0c;所以查了下github的访问问题&#xff0c;目前插件已正常下载。 2. 解决方法 gitee上搜索…

facebook如何群发小组贴

Facebook是一款非常流行的社交媒体平台&#xff0c;它可以让人们与朋友、家人和同事进行交流和分享。在Facebook上&#xff0c;用户可以加入各种小组&#xff0c;与志同道合的人交流和分享。而群发小组贴是一种在小组内发布消息的方式&#xff0c;让小组的成员都能够收到消息。…

BUUCTF [SWPU2019]神奇的二维码 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 得到的 flag 请包上 flag{} 提交。 密文&#xff1a; 下载附件&#xff0c;得到一个.png图片。 解题思路&#xff1a; 1、使用QR research扫一下&#xff0c;得到“swpuctf{flag_is_not_here}”的提示。 2、放到0…

orvibo的Mini网关VS20ZW玩法

概述 闲鱼淘来一个2016年生产的网关,此网关的型号:VS20ZW。 已经不能用APP入网了,没事拆来玩玩。 此设备已经被淘汰,很多新的zigbee产品不再支持入网。 官网设备的简介: ZigBee Mini网关,智能家居网关,智能家居主机|ORVIBO欧瑞博智能网关 设备概貌: 主要器件: …

微信小程序 获取微信头像和昵称的低版本兼容问题

<template> <uni-forms-item label"头像" nameimg><!-- #ifndef MP || MP-WEIXIN --><view click"addFile1"><u-avatar size"46":src"this.$utils.baseUrl/file/download/customFormData.avatar"></…

Uptime Kuma 企业微信群机器人告警

curl https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key693axxx6-7aoc-4bc4-97a0-0ec2sifa5aaa \-H Content-Type: application/json \-d {"msgtype": "text","text": {"content": "hello world"}}企业微信群机器人ke…

PowerQuery领域的经典之作“猴子书“中文版来啦!

与数据打交道&#xff0c;还在纠结于Excel、SQL、VBA、Python&#xff1f;数据处理领域经典之作PowerQuery"猴子书"让你用更聪明的方法处理数据。学完这本书&#xff0c;你就掌握了Power Query的一切&#xff0c;想要学Power Query&#xff0c;只需要这一本就够啦&am…

Hotspot启动原理(三)

关于Hotspot虚拟机的启动原理和内部运行机制。Hotspot虚拟机是Java虚拟机的一种实现&#xff0c;它采用了基于类的技术&#xff0c;在运行时将Java字节码转换为机器码并执行。在Hotspot虚拟机的启动过程中&#xff0c;会经历一系列的过程 包括JVM初始化、类加载、字节码解释执…

POL890 LVDSRGB TO MIPILVDS

一、芯片简介 1、系统 高性能 MIPS 32bit CPU 内核&#xff1b; 高性能 DSP 内核图像处理单元&#xff1b; 16KB 指令 Cache&#xff1b; 16KB 数据 Cache&#xff1b; 128KB OnChip SRAM&#xff1b; 内嵌 DDR3 控制器&#xff1b; 2、RGB 输入 支持 RGB666、RGB888 输入&…

万字解析设计模式之组合模式、亨元模式

一、组合模式 1.1概述 组合模式是一种结构型设计模式&#xff0c;它允许将对象组合成树形结构&#xff0c;以表示“部分-整体”的层次结构。组合模式使得客户端可以一致地对待单个对象和对象组合&#xff0c;从而将复杂的层次结构展现为一个统一的树形结构。 在组合模式中&…

设计模式-16-Spring源码中的设计模式

1-Spring之观察者模式 Java、Google Guava都提供了观察者模式的实现框架。Java提供的框架比较简单&#xff0c;只包含java.util.Observable和java.util.Observer两个类。Google Guava提供的框架功能比较完善和强大&#xff1a;通过EventBus事件总线来实现观察者模式。实际上&am…

表格制作软件排行榜,热门做表格的软件推荐

在数字化时代&#xff0c;表格不仅仅是企业管理和数据整理的重要工具&#xff0c;更是学术研究、项目规划以及日常生活中必不可少的一部分。为了更高效地进行表格制作&#xff0c;选择一款优秀的表格制作软件是至关重要的。在众多的软件中&#xff0c;我们特别推荐一款备受好评…

java.lang.IllegalStateException: Can not add resource

安卓解决 java.lang.IllegalStateException: Can not add resource 放两个链接 解决Can not add resource (com.android.aaptcompiler.ParsedResourcea980fbb) to table_言并肃的博客-CSDN博客 android attr何时会冲突_android attr冲突-CSDN博客 然后去新增的依赖找资源…