PostgreSQL 11 新特性解读 : 新增非空默认值字段不需要重写表

  • 时间:
  • 浏览:1
  • 来源:幸运飞艇APP下载_幸运飞艇APP官方

查看表大小,如下:

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

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

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

发现 relfilenode 有变化 ,刚刚的 relfilenode 值为 25672 ,说明表被重写。个人面 relpages 变大了。

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

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

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

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

执行函数,如下:

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

查看表 relfilenode 和 relpages,没办法 变化。

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

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

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

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

最后推荐和张文升一同编写的《PostgreSQL实战》,本书基于PostgreSQL 10 编写,共18章,重点介绍SQL高级行态、并行查询、分区表、物理克隆qq、逻辑克隆qq、备份恢复、高可用、性能优化、PostGIS等,蕴含几瓶实战用例!

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

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

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

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

PostgreSQL 11 版本给表 t1 增加了有有有另2个带默认值的字段后表占用空间没办法 变化,是有的是增加的字段数严重不足多?接着往下测试,增加2000个带默认值的字段,看看状态怎样才能?

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

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

发现 relfilenode 没办法 变化,依然是 162002,一同 relpages 也没办法 变化。

购买链接:https://item.jd.com/12405774.html

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

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

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

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

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