上QQ阅读APP看书,第一时间看更新
4.4 PostgreSQL 11的新特性——新增带默认值的字段不再重写数据表
在PostgreSQL 11版本之前,新增一个不带默认值的字段时,只需要更新数据字典。如果新增一个非空带默认值的字段,则需要重写数据表,表越大,执行时间越长。例如:
ALTER TABLE tb_dept1 ADD COLUMN mmid INT DEFAULT 1001;
对于一个数据比较大的数据表,上述语句将执行以下两步:
- 第一步,添加不带默认值的字段。
- 第二步,批量刷新新增字段的默认值。
在PostgreSQL 11版本中,上述语句将不再重写数据表,从而提高了执行效率。
下面通过案例测试PostgreSQL 11版本中新增带默认值的字段时是否重写数据表。
步骤01 新增测试数据表tt,语句如下:
CREATE TABLE tt(id int, name text);
步骤02 插入500万行测试数据,语句如下:
INSERT INTO tt (id,name ) SELECT n, n || '_ALTER TABLE TEST ' FROM generate_series (1,5000000) n;
步骤03 查看数据表tt的relfilenode和relpages信息,语句如下:
SELECT relname,relfilenode, relpages FROM pg_class WHERE relname='tt';
执行结果如图4-43所示。
步骤04 新增带默认值的字段ffname,语句如下:
ALTER TABLE tt ADD COLUMN ffname text DEFAULT '默认值';
图4-43 查看relfilenode和relpages信息
步骤05 再次查看数据表tt的relfilenode和relpages信息,语句如下:
SELECT relname,relfilenode, relpages FROM pg_class WHERE relname='tt';
执行结果如图4-44所示。从结果可以看出,relfilenode和relpages的数据并没有发生变化。
图4-44 再次查看relfilenode和relpages信息