7天突破PolarDB for Postgre 2022版
第六讲 HTAP应用场景实践
分享人:渊云,阿里云智能数据库产品事业部PolarDB产品部内核开发工程师
视频地址:https://developer.aliyun.com/learning/course/992/detail/14980
目录
一、前期准备
二、导入数据
三、执行 PostgreSQL 单机并行执行
四、执行 PolarDB HTAP 单机并行执行
正文:
本节将利用 PolarDB for PostgreSQL 的 HTAP 能力来加速 TPC-H 的执行,实践将基于单机本地存储来运行。
一、前期准备
1、部署 PolarDB PG
- 在运行前默认已经通过前置文档部署好本地多节点 HTAP 实例。
- 也可以直接从 DockerHub 上拉取 HTAP 实例镜像:
docker pull polardb/polardb_pg_local_instance:htap
docker run -it --cap-add=SYS_PTRACE --privileged=true --name polardb_pg_htap polardb/polardb_pg_local_instance:htap bash
- 总计 1 个主节点(运行于 5432 端口),2 个只读节点(运行于 5433/5434 端口)。
- 可以通过下面的命令来验证:
ps xf
会看到如下的三个进程,1 个主节点(运行于 5432 端口),2 个只读节点(运行于 5433/5434 端口):
2、生成 TPC-H 测试数据集
TPC-H 是专门测试数据库分析型场景性能的数据集,一共有 22 条分析型场景下的 SQL。用 TPC-H 可以有效测试 PolarDB 的 HTAP 的能力。通过 tpch-dbgen 工具来生成任意大小的数据集。
TPC-H资料:https://www.tpc.org/tpch/default5.asp
tpch-dbgen:https://github.com/qiuyuhang/tpch-dbgen
# 下载 tpch-dbgen
git clone https://github.com/qiuyuhang/tpch-dbgen.git
# 编译代码
cd tpch-dbgen
make
执行如下命令,生成模拟数据:
# 生成 10GB 数据
./dbgen -s 10
说明:建议先按照该命令,从 10GB 大小的数据开始生成。体验完本案例后还可尝试 100GB 的数据,即将该命令行中的 10 替换为 100。这里需要注意不要超过本机外存容量。
简单说明一下tpch-dbgen 里面的各种文件:
- 后缀为 .tbl 表示生成的表数据;
- queries/ 中存放的是 TPC-H 的 22 条 SQL;
- 含有 explain 的 .sql 文件只打印计划,并不实际执行;
- answers/ 中存储了 TPC-H 中 22 条 SQL 的执行结果;
二、导入数据
通过 psql 导入 TPC-H 数据。
注意:一直要在 tpch-dbgen/ 目录下执行。
# 创建表
psql -f dss.ddl
# 进入 psql 命令行
psql
# 导入数据
\copy nation from 'nation.tbl' DELIMITER '|';
\copy region from 'region.tbl' DELIMITER '|';
\copy supplier from 'supplier.tbl' DELIMITER '|';
\copy part from 'part.tbl' DELIMITER '|';
\copy partsupp from 'partsupp.tbl' DELIMITER '|';
\copy customer from 'customer.tbl' DELIMITER '|';
\copy orders from 'orders.tbl' DELIMITER '|';
\copy lineitem from 'lineitem.tbl' DELIMITER '|';
数据导入完成后,逐行执行如下命令,对创建的表设置最大并行度:
# 对需要 PX 查询的表设置最大并行度(若不设置则不会进入 PX 查询)
alter table nation set (px_workers = 100);
alter table region set (px_workers = 100);
alter table supplier set (px_workers = 100);
alter table part set (px_workers = 100);
alter table partsupp set (px_workers = 100);
alter table customer set (px_workers = 100);
alter table orders set (px_workers = 100);
alter table lineitem set (px_workers = 100);
三、执行 PostgreSQL 单机并行执行
模拟数据导入到 PolarDB 后,先执行单机并行查询,观测一下查询速度。
1、psql 连入后,执行如下命令,开启计时。
\timing
2、通过 max_parallel_workers_per_gather 参数设置单机并行度:
set max_parallel_workers_per_gather=2; -- 并行度设置为 2
3、执行如下命令,查看执行计划。
\i queries/q18.explain.sql
可以看到如图所示的 2 个并行度的并行计划:
4、执行 SQL,可以看到部分结果(按 q 不查看全部结果)和运行时间,运行时间为 1 分 23 秒:
\i queries/q18.sql
提示:如果单机并行度太高,可能会出现如下的错误提示:pq: could not resize shared memory segment "/PostgreSQL.2058389254" to 12615680 bytes: No space left on device。原因是 Docker 预设的 shared memory 空间不足,可以设置参数并重启 Docker 进行解决,参考链接:https://stackoverflow.com/questions/56751565/pq-could-not-resize-shared-memory-segment-no-space-left-on-device
四、执行 PolarDB HTAP 单机并行执行
在体验完单机并行查询后,开启 PolarDB HTAP 的并行执行,在单机上重新体验一下查询性能。
1、在 psql 后,执行如下命令,开启计时(若已开启,可跳过)。
\timing
2、执行如下命令,开启跨机并行查询(PX)。
set polar_enable_px=on;
3、设置每个节点的并行度为 1。
set polar_px_dop_per_node=1;
4、执行如下命令,查看执行计划。
\i queries/q18.explain.sql
该引擎集群带有 2 个 RO 节点,开启 PX 后默认并行度为 2x1=2 个:
5、执行 SQL:
\i queries/q18.sql
可以看到部分结果(按 q 不查看全部结果)和运行时间,运行时间为 1 分钟,比单机并行的结果降低了 27.71% 的运行时间。感兴趣的同学也可加大并行度或者数据量查看提升程度。
跨机并行查询会去获取全局一致性视图,因此得到的数据是一致的,无需担心数据正确性。可以通过如下方式手动设置跨机并行查询的并行度:
set polar_px_dop_per_node = 1;
\i queries/q18.sql
set polar_px_dop_per_node = 2;
\i queries/q18.sql
set polar_px_dop_per_node = 4;
\i queries/q18.sql