背景信息
TPC-H是业界常用的一套Benchmark,由TPC委员会制定发布,用于评测数据库的分析型查询能力。TPC-H查询包含8张数据表、22条复杂的SQL查询,大多数查询包含若干表Join、子查询和Group-by聚合等。
本文的TPC-H的实现基于TPC-H的基准测试,并不能与已发布的TPC-H基准测试结果相比较,本文中的测试并不符合TPC-H基准测试的所有要求。
测试设计
测试数据量
测试基于1 TB数据量(Scalar Factor=1000),其中主要表数据量如下:
LINEITEM约60亿行
ORDERS 15亿行
PART_SUPP 8亿行
测试所用实例规格
节点规格:16c128g
节点数:3/4/6
数据集大小:1000 GB
测试所用压力机规格
ecs.g7.4xlarge(16 vCPU,64 GB内存)
测试方法
步骤1:准备压力机ECS
需准备一个ECS,后续操作步骤中涉及的数据导入、运行压测等使用的都是这台ECS机器。
请将测试所用的ECS部署在VPC网络内,并记住该VPC的名称和ID,后续的所有实例都将部署在该VPC内。
建议ECS的操作系统为CentOS,并开放公网IP。
步骤2:准备压测所用PolarDB-X实例
创建PolarDB-X实例,具体步骤请参见创建实例。
需保证实例和压力机ECS在同一个VPC中。
为PolarDB-X实例的白名单添加压力机ECS的内网地址。
步骤3:调整实例参数
为了在压测场景下达到最佳性能,需要调整PolarDB-X计算层实例参数。
修改参数XPROTO_MAX_DN_CONCURRENT的值为4000,具体步骤请参见参数设置。
通过命令行连接到PolarDB-X实例,在同一会话内执行如下SQL语句,关闭日志记录、CPU采样统计与统计信息自动采集。
set global RECORD_SQL = false; set global MPP_METRIC_LEVEL = 0; set global ENABLE_CPU_PROFILE = false; set global ENABLE_BACKGROUND_STATISTIC_COLLECTION=false; set global ENABLE_STATISTIC_FEEDBACK=false;
步骤4:安装BenchmarkBoot压测工具
为压力机ECS安全组开放4121端口,具体步骤请参见添加安全组规则。
登录压力机ECS,执行
bash -c "$(curl -fsSL https://benchmark-boot.oss-cn-hangzhou.aliyuncs.com/setup.sh)"
安装BenchmarkBoot压测工具,具体步骤请参见BenchmarkBoot下载安装。在浏览器上打开http://{压力机公网IP}:4121,出现BenchmarkBoot首页代表安装成功。
步骤5:数据准备
在BenchmarkBoot的PolarDB-X连接串(主机ip、端口、用户名、密码),输入TPC-H库名、建库模式选择AUTO,单击提交。
界面中,配置在BenchmarkBoot的PolarDB-X主实例。
界面中,输入数据集规模(GB)为1000,物理分片数为16,单击提交,导入TPC-H 1000 GB数据到说明在数据导入完成后,BenchmarkBoot会自动执行analyze table收集统计信息。
确认上一步的TPC-H 1 TB数据集导入完成后,在PolarDB-X主实例上执行以下SQL创建列存索引,具体步骤请参见创建和使用CCI。
create clustered columnar index `nation_col_index` on nation(`n_nationkey`) partition by hash(`n_nationkey`) partitions 1; create clustered columnar index `region_col_index` on region(`r_regionkey`) partition by hash(`r_regionkey`) partitions 1; create clustered columnar index `customer_col_index` on customer(`c_custkey`) partition by hash(`c_custkey`) partitions 96; create clustered columnar index `part_col_index` on part(`p_size`) partition by hash(`p_partkey`) partitions 96; create clustered columnar index `partsupp_col_index` on partsupp(`ps_partkey`) partition by hash(`ps_partkey`) partitions 96; create clustered columnar index `supplier_col_index` on supplier(`s_suppkey`) partition by hash(`s_suppkey`) partitions 96; create clustered columnar index `orders_col_index` on orders(`o_orderdate`,`o_orderkey`) partition by hash(`o_orderkey`) partitions 96; create clustered columnar index `lineitem_col_index` on lineitem(`l_shipdate`,`l_orderkey`) partition by hash(`l_orderkey`) partitions 96;
说明可以执行
show columnar index
查看当前的列存索引状态,具体步骤请参见SHOW COLUMNAR INDEX。创建列存索引总耗时约为45分钟。
步骤6:添加列存只读实例
为PolarDB-X主实例添加列存只读实例,具体步骤请参见添加列存只读实例。
为PolarDB-X列存只读实例的白名单添加压力机ECS的内网地址。
步骤7:调整实例参数
为在压测场景下达到最佳性能,需要调整PolarDB-X列存只读实例参数。
通过命令行连接到PolarDB-X列存只读实例,在同一会话内执行如下SQL语句,设置参数:
set global SCHEDULE_BY_PARTITION=true;
set global BLOCK_CACHE_MEMORY_SIZE_FACTOR=0.3;
set global OSS_FS_USE_BYTES_CACHE=true;
set global OSS_FS_MEMORY_RATIO_OF_BYTES_CACHE=0.3;
set global ONLY_CACHE_PRIMARY_KEY_IN_BLOCK_CACHE=true;
set global MPP_TASK_LOCAL_MAX_BUFFER_SIZE=8000000000;
set global GLOBAL_RF_ROWS_UPPER_BOUND=50000000;
步骤8:进行TPC-H测试
在BenchmarkBoot的
界面中,配置列存只读实例连接串,输入TPC-H库名、建库模式选择自动判断,单击提交。在BenchmarkBoot的
界面中,选择所有查询、填入任务描述,单击提交,运行TPC-H测试的22条查询语句。在BenchmarkBoot的
界面中,查看最终压测结果。说明第一次运行TPC-H需要预热,建议运行多轮后,得到最终稳定的压测结果。
测试结果
以下结果的时间单位为:秒(s)
查询 | 3*16C128 GB | 4*16C128 GB | 6*16C128 GB |
Q1 | 28.15 | 24.81 | 14 |
Q2 | 11.55 | 9.02 | 5.12 |
Q3 | 20.98 | 16.54 | 8.73 |
Q4 | 16.26 | 14.59 | 7.06 |
Q5 | 28.25 | 21.28 | 14.01 |
Q6 | 7.76 | 6.84 | 1.95 |
Q7 | 25.81 | 17.83 | 11.14 |
Q8 | 23.97 | 21.38 | 10.37 |
Q9 | 71.63 | 57.86 | 36.24 |
Q10 | 35.98 | 27.91 | 16.85 |
Q11 | 6.61 | 4.65 | 2.54 |
Q12 | 8.46 | 7.1 | 3.37 |
Q13 | 33.15 | 23.87 | 16.8 |
Q14 | 9.32 | 8.1 | 3.31 |
Q15 | 7.44 | 6.2 | 3.11 |
Q16 | 10.18 | 6.07 | 4.08 |
Q17 | 18.2 | 11.97 | 7.46 |
Q18 | 47.26 | 38.65 | 20.15 |
Q19 | 24.86 | 21.81 | 13.48 |
Q20 | 11.16 | 8.59 | 5.35 |
Q21 | 50.24 | 44.85 | 22.76 |
Q22 | 11.54 | 8.53 | 6.05 |
总时间 | 508.76 | 408.45 | 233.93 |