openGauss

开源数据库

openGauss社区官网

开源社区

PostgreSQL与openGauss之分区性能

高云龙2021-03-08openGauss与PostgreSQL对比

PostgreSQL 与 openGauss 之分区性能

概述

PostgreSQL 与 openGauss 分区表定义差异,请参考https://www.modb.pro/db/41393。

openGauss1.1.0 开始支持 hash/list 分区,hash 分区表最多支持 64 个分区,否则会报:

ERROR: Un-support feature
DETAIL: The partition’s length should be less than 65.

本次对 PostgreSQL 和 openGauss 64 个子分区表的常规操作对比。

服务器配置:虚拟机 8G4C50G

数据库版本:PostgreSQL13.1、openGauss1.1.0

添加分区表

PostgreSQL 数据库:

--创建父表
CREATE TABLE partition_table(
 id          int,
 col1        character varying(16),
 create_time timestamptz
) PARTITION BY HASH(id);

--添加分区
SELECT 'CREATE TABLE partition_table_' || n || ' PARTITION of partition_table FOR VALUES WITH (MODULUS 64, REMAINDER  ' || n || ');' FROM generate_series(0,63) as n ;\gexec

--初始化数据
INSERT INTO partition_table(id,col1,create_time) SELECT round(100000000*random()), n || '_col1',now() FROM generate_series(1,10000000) n;

--添加索引
CREATE INDEX ON partition_table USING BTREE(id);
CREATE INDEX ON partition_table USING BTREE(col1);

openGauss 数据库:

--创建分区表
create table partition_table(
	id int,
	col1 varchar(16),
	create_time timestamptz default now())
partition by hash(id)
(partition part_hash_1,
partition part_hash_2,
partition part_hash_3,
partition part_hash_4,
partition part_hash_5,
partition part_hash_6,
partition part_hash_7,
partition part_hash_8,
partition part_hash_9,
partition part_hash_10,
partition part_hash_11,
partition part_hash_12,
partition part_hash_13,
partition part_hash_14,
partition part_hash_15,
partition part_hash_16,
partition part_hash_17,
partition part_hash_18,
partition part_hash_19,
partition part_hash_20,
partition part_hash_21,
partition part_hash_22,
partition part_hash_23,
partition part_hash_24,
partition part_hash_25,
partition part_hash_26,
partition part_hash_27,
partition part_hash_28,
partition part_hash_29,
partition part_hash_30,
partition part_hash_31,
partition part_hash_32,
partition part_hash_33,
partition part_hash_34,
partition part_hash_35,
partition part_hash_36,
partition part_hash_37,
partition part_hash_38,
partition part_hash_39,
partition part_hash_40,
partition part_hash_41,
partition part_hash_42,
partition part_hash_43,
partition part_hash_44,
partition part_hash_45,
partition part_hash_46,
partition part_hash_47,
partition part_hash_48,
partition part_hash_49,
partition part_hash_50,
partition part_hash_51,
partition part_hash_52,
partition part_hash_53,
partition part_hash_54,
partition part_hash_55,
partition part_hash_56,
partition part_hash_57,
partition part_hash_58,
partition part_hash_59,
partition part_hash_60,
partition part_hash_61,
partition part_hash_62,
partition part_hash_63,
partition part_hash_64);

--初始化数据
INSERT INTO partition_table(id,col1,create_time) SELECT round(100000000*random()), n || '_col1',now() FROM generate_series(1,10000000) n;

--添加全局索引
CREATE INDEX ON partition_table USING BTREE(id);
CREATE INDEX ON partition_table USING BTREE(col1);

--添加本地索引
CREATE INDEX ON partition_table USING BTREE(id) local;
CREATE INDEX ON partition_table USING BTREE(col1) local;

测试方法

采用 pgbench 压测工具,自定义压测脚本的方式来对比。

cat bench.sql
\set idpp random(1,100000)
--insert into partition_table values(:idpp,:idpp||'_col1',now());
--update partition_table set create_time=now() where id=:idpp;
--update partition_table set create_time=now() where col1=:idpp||'_col1';
--select * from partition_table where id=:idpp;
--select * from partition_table where col1=:idpp||'_col1';

pgbench -p 5432 -j 30 -c 30 -M prepared -T 30 -n yunlong -f bench.sql

结果对比

  

分区键查询

非分区键查询

分区键更新

非分区键更新

插入

PostgreSQL

0.594 ms

7.978 ms

1.612 ms

17.413 ms

17.2ms

openGauss(全局索引)

0.612 ms

0.758 ms

10.450 ms

88.151 ms

78.082 ms

openGauss(本地索引)

5.635 ms

6.765 ms

15.187 ms

94.614 ms

84.927 ms

结果对比发现,

1、Postgresql13.1 版本在分区方面总来看优越于 openGauss1.1.0。

2、opengauss 全局索引会比本地索引性能更好,但全局索引维护成本高。

3、非分区键查询,带全局索引的 opengauss 查询性能最快。

此测试受限于服务器环境,数据仅做参考比对。