PostgreSQL 11从入门到精通(视频教学版)
上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信息