12313202 曾子华
github仓库地址:sgweo8ys/CS213project3
[TOC]
用于评估数据库的标准有很多,如性能,可拓展性,安全性,易用性和用户社区等。
其中最重要的是数据库的性能,本次 project 重点比较了两种数据库的性能差异。
首先使用对数据库命令进行记时统计的方法,得到两种数据库在运行数据库命令时的速度比值。
之后使用 benchmarksql 对两个数据库进行 TPC-C 压力测试,测试两种数据库在处理复杂事务时的效率差距。
最后使用华为云监测功能,测试两种数据库在运行复杂命令时的硬件使用情况。
使用华为云服务器完成本次 project,型号与下发文档一致。
按照下发文档的过程,安装 OpenGauss 5.0.1 版本至服务器目录 /opt/sofware/openGauss
-
安装依赖包
yum install -y perl-ExtUtils-Embed readline-devel zlib-devel pam-devel libxml2-devel libxslt-devel openldap-devel python-devel gcc-c++ openssl-devel cmake
-
类似安装 OpenGauss 的过程,在
/opt/software目录下新建目录pgsql,并从官网下载压缩包并解压wget https://ftp.postgresql.org/pub/source/v12.4/postgresql-12.4.tar.gz tar -xvf postgresql-12.4.tar.gz
-
进入解压后的文件夹,编译源码,安装
cd postgresql-12.4 ./configure --prefix=/opt/software/pgsql/postgresql make && make install
-
创建 postgres 用户操作 postgresql
groupadd postgres useradd -g postgres postgres mkdir /opt/software/pgsql/postgresql/data chown postgres:postgres /opt/software/pgsql/postgresql/data
-
将 postgresql 放入环境变量
vim .bash_profile
加入
export PGHOME=/opt/software/pgsql/postgresql export PGDATA=/opt/software/pgsql/postgresql/data PATH=$PATH:$HOME/bin:$PGHOME/bin
source .bash_profile
使用一张大小为
在服务器上使用 C++ 程序随机生成一张大小为
| 名称 | 类型 |
|---|---|
| id | integer |
| name | string |
| value | int |
并将其输出到 /opt/test/tu1.csv 中:
#include <cstdio>
#include <ctime>
#include <cstdlib>
int main()
{
srand((int)time(0));
freopen("tu1.csv", "w", stdout);
puts("id,name,value");
int n = 100000;
for(int i = 1; i <= n; i++){
char s[30];
for(int j = 0; j < 20; j++) s[j] = rand() % 26 + 'a';
printf("%d,", i);
for(int j = 0; j < 20; j++) printf("%c",s[j]);
printf(",%d\n",rand() % 300);
}
return 0;
}将数据分别导入 postgresql 和 opengauss 后,运行数据库命令。
create table test(id int, name varchar(30), value int);
copy test(id, name, value) from '/opt/test/tu1.csv' DELIMITER ',' CSV HEADER;使用 explain analyse 命令统计在两种不同数据库下命令的运行时间,单位均为毫秒。
-
查询命令/精确查询
测试命令1:
explain analyse select * from test where id = 1;
数据库/运行次数编号 1 2 3 平均用时 postgresql 7.69 7.387 7.389 7.489 opengauss 26.211 16.607 16.561 19.793 速度比值:2.64
测试命令2:
explain analyse select * from test where id = 67364;
数据库/运行次数编号 1 2 3 平均用时 postgresql 7.374 7.436 7.377 7.396 opengauss 16.721 16.518 16.428 16.556 速度比值:2.24
测试命令3:
explain analyse select * from test where name = 'okvqibkayswynkfbkprk';
数据库/运行次数编号 1 2 3 平均用时 postgresql 11.553 11.438 11.441 11.477 opengauss 20.663 20.75 20.566 20.660 速度比值:1.80
-
查询命令/其他查询
测试命令1:
explain analyse select * from test where id > 46736 and id < 46759;
数据库/运行次数编号 1 2 3 平均用时 postgresql 8.125 8.117 8.088 8.110 opengauss 19.166 19.213 19.427 19.269 速度比值:2.38
测试命令2:
explain analyse select * from test where name like '%abc%';
数据库/运行次数编号 1 2 3 平均用时 postgresql 19.156 19.198 19.078 19.144 opengauss 27.486 27.457 27.603 27.515 速度比值:1.44
-
更新命令
begin; explain analyse update test set name = 'hello' where id = 4762; rollback;
数据库/运行次数编号 1 2 3 平均用时 postgresql 7.392 7.387 7.358 7.379 opengauss 17.597 16.46 16.581 16.879 速度比值:2.29
-
单行插入命令
begin; explain analyse insert into test values(100001, 'hello world', 176); rollback;
数据库/运行次数编号 1 2 3 平均用时 postgresql 0.057 0.057 0.054 0.056 opengauss 0.126 0.116 0.133 0.125 速度比值:2.23
-
删除命令
begin; explain analyse delete from test where value < 100; rollback;
数据库/运行次数编号 1 2 3 平均用时 postgresql 38.735 33.464 34.043 35.414 opengauss 77.596 78.14 84.287 80.008 速度比值:2.26
结论:少量数据下的各种命令,postgresql 均明显快于 opengauss,二者的速度比值在 1.44 到 2.64之间。
使用一张大小为
使用三张大小为 join 合并得到一张大小约为
使用与少量数据类似的方法,生成列一样但行数为
用 C++ 程序生成用于测试 join 的数据,并将其输出到 csv 文件中,下面展示第一个数据的生成代码:
// joindata1.cpp
#include <cstdio>
#include <ctime>
#include <cstdlib>
int main()
{
srand((int)time(0));
freopen("jointest1.csv", "w", stdout);
int n = 100000;
puts("id1,name,grp");
for(int i = 1; i <= n; i++){
char s[30];
for(int j = 0; j < 20; j++) s[j] = rand() % 26 + 'a';
printf("%d,", i);
for(int j = 0; j < 20; j++) printf("%c",s[j]);
printf(",%d\n", i / 3);
}
return 0;
}这样生成的表具有 join 得到的表不会太大。
同样的,将数据分别导入 postgresql 和 opengauss 后,运行数据库命令。
delete from test;
copy test(id, name, value) from '/opt/test/tu1.csv' DELIMITER ',' CSV HEADER;使用 explain analyse 命令统计在两种不同数据库下命令的运行时间,单位均为毫秒。
-
精确查询命令
explain analyse select * from test where id = 3987654;
数据库/运行次数编号 1 2 3 平均用时 postgresql 424.025 427.914 424.186 425.375 opengauss 2088.824 2085.112 2082.3 2085.412 速度比值:4.90
-
更新命令
begin; explain analyse update test set name = 'hello' where value = 101; rollback;
数据库/运行次数编号 1 2 3 平均用时 postgresql 424.025 427.914 424.186 425.375 opengauss 2088.824 2085.112 2082.3 2085.412 速度比值:15.35
-
删除命令
begin; explain analyse delete from test where value < 15; rollback;
数据库/运行次数编号 1 2 3 平均用时 postgresql 7277.684 3678.181 4053.929 5003.265 opengauss 41663.23 41112.84 42309.1 41695.06 速度比值:8.33
-
单条多行插入命令
使用 C++ 程序生成一条进行 1000 行插入的命令:
#include <cstdio> int main() { freopen("insertsql.out", "w", stdout); int n = 1000; printf("begin;\n" "explain analyse insert into test values\n"); for(int i = 1; i <= n; i++){ printf("(%d,'cstowonethree',%d)", i, i % 300); if(i < n) printf(",\n"); else printf(";\n"); } printf("rollback;\n"); }
比较二者的运行时间:
数据库/运行次数编号 1 2 3 平均用时 postgresql 3.291 2.632 2.565 2.829 opengauss 2.786 2.873 2.87 2.843 速度比值:1.00
-
循环插入命令
由于循环无法使用
explain analyse命令,故使用\timing进行记时。begin; \timing on do $$ begin for i in 1..100000 loop insert into test values(i, 'hello', i % 300); end loop; end; $$; \timing off rollback;
数据库/运行次数编号 1 2 3 平均用时 postgresql 396.13 396.301 396.309 396.2467 opengauss 2782.759 2846.032 2730.429 2786.407 速度比值:7.03
-
带索引的精确查询:
create index ind1 on test(id);
explain analyse select * from test where id = 3987655;
数据库/运行次数编号 1 2 3 平均用时 postgresql 0.09 0.092 0.104 0.095 opengauss 0.074 0.071 0.071 0.072 速度比值:0.76
-
join 查询:
create table jointable1(id1 int, name varchar(30), grp int); copy jointable1(id1, name, grp) from '/opt/test/jointest1.csv' DELIMITER ',' CSV HEADER; create table jointable2(id2 int, name varchar(30), grp int); copy jointable2(id2, name, grp) from '/opt/test/jointest2.csv' DELIMITER ',' CSV HEADER; create table jointable3(id3 int, name varchar(30), grp int); copy jointable3(id3, name, grp) from '/opt/test/jointest3.csv' DELIMITER ',' CSV HEADER;
explain analyse select * from jointable1 join jointable2 on jointable2.grp = jointable1.grp join jointable3 on jointable3.grp = jointable2.grp where id1 + id2 + id3 = 8297;
数据库/运行次数编号 1 2 3 平均用时 postgresql 341.229 342.213 339.905 341.1157 opengauss 540.417 503.93 501.569 515.3053 速度比值:1.51
结论:大量数据下的情况较为复杂,整体表现为大部分命令 postgresql 远远快于 opengauss,少部分命令二者相差不大或者 opengauss 略快于 postgresql。
大量数据下的精确查询,修改和删除命令,以及使用循环完成的大量插入命令,postgresql 远远快于 opengauss, 二者的速度比值在 4.9 到 15.35 之间。
多表 join 后查询的命令,postgresql 略快于 opengauss,单条多行插入命令下二者速度相差无几。速度比值在 1 到 1.44 之间
建立索引后的精确查询命令,opengauss 略快于 potgresql,二者的速度比值为 0.76。
使用 benchmarksql 分别对 opengauss 和 postgresql 进行测试。
使用的 benchmarksql 版本为 5.0.1。
在安装后的 run 文件下配置测试 postgresql 的 props.pg 文件。
设置仓库数 warehouse 为 10,其中每个仓库的大小大约为 76823.04KB。
设置终端数量 terimnals 为 50,这也是并发客户数量,可以测试数据库在高并发情况下的表现。
设置运行时间 runMins 为 5,测试 5 分钟,统计两种数据库处理的事务数量和处理速度。
运行测试,测试完成之后生成报告。
postgresql 测试结果:
| Overall tpmC: | 12105.80 |
|---|---|
| Overall tpmTotal: | 26877.20 |
opengauss 测试结果:
| Overall tpmC: | 2922.00 |
|---|---|
| Overall tpmTotal: | 6457.00 |
结论:在 TPC-C 测试中,postgresql 的速度显著快于 opengauss,二者的 TPC-C 比值为 4.14。
从图上可以看出,opengauss 处理速度较 postgresql 更加稳定。
使用华为云监测功能,测试两种数据库的硬件使用情况。
分别用两种数据库运行以下查询命令:
explain analyse
select id, name, value, id * value, id % (value + 1) from test
where log(id) * value < 1000;之后使用华为云监控功能,取两种数据库在运行时间内的 CPU 使用率峰值和磁盘读写带宽峰值。
postgresql:
| 情况/项目 | CPU使用率 | 磁盘读带宽 | 磁盘写带宽 |
|---|---|---|---|
| 对照值 | 3% | 0 Mib/s | 0 Mib/s |
| 运行时峰值 | 3.99% | 2.059Mib/s | 0.056 Mib/s |
opengauss:
| 情况/项目 | CPU使用率 | 磁盘读带宽 | 磁盘写带宽 |
|---|---|---|---|
| 对照值 | 3% | 0 Mib/s | 0 Mib/s |
| 运行时峰值 | 8.68% | 0.417Mib/s | 1.479 Mib/s |
postgresql 的 CPU 使用率较 opengauss 更低,磁盘读带宽较 opengauss 更高,写带宽更低。
经过比较,可以得出结论:
- 少量数据下,postgresql 的各种命令运行速度显著快于 opengauss。
- 大量数据下,绝大部分命令 postgresql 运行速度远远快于 opengauss。但是在建立索引之后的查询下 opengauss 略快于 postgresql 。
- 在 TPC-C 测试中,postgresql 在高并发操作下处理事务效率远快于 opengauss,但是 opengauss 处理效率更加稳定。
- 运行查询命令时,postgresql 的 CPU 占用率较 opengauss 更低,更能节约硬件资源。
总的来说,postgresql 相较 opengauss 在性能上仍有较大优势,opengauss 在 TPC-C 测试中表现更加稳定,postgresql 的硬件占用率更低,读带宽更高,写带宽更低。