PostgreSQL 12: 分区表数据导入性能提升

PostgreSQL 12 版本的分区表的 DML 性能得到显著提升,上一篇文章有详细介绍,详见 PostgreSQL 12: 分区表DML性能大辐提升

同时,12 版本的分区表数据导入性能也得到了提升,手册说明如下:

发行说明

Improve speed of COPY into partitioned tables (David Rowley)

本文将大致比较 11 版本和 12 版本的分区表数据导入、分区表数据导出性能,测试环境为1台8核16G虚拟机。

环境准备

11 版本和 12 版本都创建以下 HASH 分区表进行测试,创建父表,如下:

1
2
3
4
5
CREATE TABLE userinfo (
userid int4,
username character varying(64),
ctime timestamp(6) without time zone
) PARTITION BY HASH(userid);

创建分区(2048个分区),如下:

1
psql -At postgres postgres -c "SELECT 'CREATE TABLE userinfo_' || n || ' PARTITION of userinfo FOR VALUES WITH (MODULUS 2048, REMAINDER  ' || n || ');' FROM generate_series(0,2047) as n ;" | psql

插入2千万数据,如下:

1
INSERT INTO userinfo(userid,username,ctime) SELECT round(100000000*random()), n || '_username',clock_timestamp() FROM generate_series(1,20000000) n;

PostgreSQL 11 测试

11 版本数据导出,如下:

1
2
3
postgres=# COPY (SELECT * FROM userinfo) TO '/home/pg11/userinfo_pg11.txt';
COPY 20000000
Time: 13017.028 ms (00:13.017)

11 版本数据导入,如下:

1
2
3
4
5
6
postgres=# TRUNCATE TABLE  userinfo;
TRUNCATE TABLE

postgres=# COPY userinfo FROM '/home/pg11/userinfo_pg11.txt';
COPY 20000000
Time: 48525.563 ms (00:48.526)

PostgreSQL 12 测试

12 版本数据导出,如下:

1
2
3
postgres=# COPY (SELECT * FROM userinfo)  TO '/home/pg12/userinfo_pg12.txt';
COPY 20000000
Time: 13033.455 ms (00:13.033)

12 版本数据导入,如下:

1
2
3
4
5
6
postgres=# TRUNCATE TABLE  userinfo;
TRUNCATE TABLE

postgres=# COPY userinfo FROM '/home/pg12/userinfo_pg12.txt';
COPY 20000000
Time: 39090.769 ms (00:39.091)

测试汇总

将以上步骤测试场景数据汇总,如下表:

版本 2千万数据导出分区表 2千万数据导入分区表
PostgreSQL 11 13017.028 ms 48525.563 ms
PostgreSQL 12 13033.455 ms 39090.769 ms

根据以上统计数据,可以看出:

  • 2千万数据导出分区表场景,12 版本和 11 版本性能无差异。
  • 2千万数据导入分区表场景,12 版本较 11 版本提升 23% 左右。

参考

最后推荐和张文升共同编写的《PostgreSQL实战》,本书基于PostgreSQL 10 编写,共18章,重点介绍SQL高级特性、并行查询、分区表、物理复制、逻辑复制、备份恢复、高可用、性能优化、PostGIS等,涵盖大量实战用例!

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

PostgreSQL实战
感谢支持!
0%