本文详细介绍了PolarDB-X的TPC-H测试设计、测试过程和测试结果。
背景信息
TPC-H是业界常用的一套Benchmark,由TPC委员会制定发布,用于评测数据库的分析型查询能力。TPC-H查询包含8张数据表、22条复杂的SQL查询,大多数查询包含若干表Join、子查询和Group-by聚合等。
本文中TPC-H的实现基于TPC-H的基准测试,并不能与已发布的TPC-H基准测试结果相比较,本文中的测试并不符合TPC-H基准测试的所有要求。
测试设计
测试数据量
测试基于100 GB数据量(Scalar Factor=100),其中主要表数据量如下:
LINEITEM表约6亿行
ORDERS表1.5亿行
PART_SUPP表8000万行
测试所用实例规格
节点规格
节点数
数据集大小
8C64G
6
100 GB
测试所用压力机规格
ecs.g7.4xlarge(16 vCPU,64 GB内存,存储盘大于200 GB)
测试方法
准备压力机ECS
准备一个ECS(存储盘要求大于200 GB,需要存放工具生成的csv格式数据集),后续操作步骤中涉及的数据准备、运行压测等使用的都是这台ECS机器。
说明测试所用ECS需要部署在VPC网络内。请记录该VPC的名称和ID,后续的所有实例都将部署在该VPC内。
准备压测所用PolarDB-X实例
创建PolarDB-X实例,详细操作步骤请参见创建实例。
说明需保证ECS和PolarDB-X实例在同一个VPC中。
在实例中创建一个待压测的数据库(本测试中数据库名为tpch_100g),详细操作步骤请参见创建数据库。
CREATE DATABASE tpch_100g MODE = 'auto';
在数据库tpch_100g中创建对应的表,方法如下:
CREATE TABLE `customer` ( `c_custkey` int(11) NOT NULL, `c_name` varchar(25) NOT NULL, `c_address` varchar(40) NOT NULL, `c_nationkey` int(11) NOT NULL, `c_phone` varchar(15) NOT NULL, `c_acctbal` decimal(15,2) NOT NULL, `c_mktsegment` varchar(10) NOT NULL, `c_comment` varchar(117) NOT NULL, PRIMARY KEY (`c_custkey`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 PARTITION BY KEY(`c_custkey`) PARTITIONS 192; CREATE TABLE `lineitem` ( `l_orderkey` bigint(20) NOT NULL, `l_partkey` int(11) NOT NULL, `l_suppkey` int(11) NOT NULL, `l_linenumber` bigint(20) NOT NULL, `l_quantity` decimal(15,2) NOT NULL, `l_extendedprice` decimal(15,2) NOT NULL, `l_discount` decimal(15,2) NOT NULL, `l_tax` decimal(15,2) NOT NULL, `l_returnflag` varchar(1) NOT NULL, `l_linestatus` varchar(1) NOT NULL, `l_shipdate` date NOT NULL, `l_commitdate` date NOT NULL, `l_receiptdate` date NOT NULL, `l_shipinstruct` varchar(25) NOT NULL, `l_shipmode` varchar(10) NOT NULL, `l_comment` varchar(44) NOT NULL, KEY `IDX_LINEITEM_PARTKEY` (`l_partkey`), KEY `IDX_SUPPKEY` (`l_suppkey`), KEY `IDX_LINEITEM_SHIPDATE` (`l_shipdate`), PRIMARY KEY (`l_orderkey`,`l_linenumber`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 PARTITION BY KEY(`l_orderkey`) PARTITIONS 192; CREATE TABLE `orders` ( `o_orderkey` bigint(20) NOT NULL, `o_custkey` int(11) NOT NULL, `o_orderstatus` varchar(1) NOT NULL, `o_totalprice` decimal(15,2) NOT NULL, `o_orderdate` date NOT NULL, `o_orderpriority` varchar(15) NOT NULL, `o_clerk` varchar(15) NOT NULL, `o_shippriority` bigint(20) NOT NULL, `o_comment` varchar(79) NOT NULL, PRIMARY KEY (`O_ORDERKEY`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 PARTITION BY KEY(`o_orderkey`) PARTITIONS 192; CREATE TABLE `part` ( `p_partkey` int(11) NOT NULL, `p_name` varchar(55) NOT NULL, `p_mfgr` varchar(25) NOT NULL, `p_brand` varchar(10) NOT NULL, `p_type` varchar(25) NOT NULL, `p_size` int(11) NOT NULL, `p_container` varchar(10) NOT NULL, `p_retailprice` decimal(15,2) NOT NULL, `p_comment` varchar(23) NOT NULL, PRIMARY KEY (`p_partkey`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 PARTITION BY KEY(`p_partkey`) PARTITIONS 192; CREATE TABLE `partsupp` ( `ps_partkey` int(11) NOT NULL, `ps_suppkey` int(11) NOT NULL, `ps_availqty` int(11) NOT NULL, `ps_supplycost` decimal(15,2) NOT NULL, `ps_comment` varchar(199) NOT NULL, KEY `IDX_PARTSUPP_SUPPKEY` (`PS_SUPPKEY`), PRIMARY KEY (`ps_partkey`,`ps_suppkey`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 PARTITION BY KEY(`ps_partkey`) PARTITIONS 192; CREATE TABLE `supplier` ( `s_suppkey` int(11) NOT NULL, `s_name` varchar(25) NOT NULL, `s_address` varchar(40) NOT NULL, `s_nationkey` int(11) NOT NULL, `s_phone` varchar(15) NOT NULL, `s_acctbal` decimal(15,2) NOT NULL, `s_comment` varchar(101) NOT NULL, PRIMARY KEY (`s_suppkey`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 PARTITION BY KEY(`s_suppkey`) PARTITIONS 192; CREATE TABLE `nation` ( `n_nationkey` int(11) NOT NULL, `n_name` varchar(25) NOT NULL, `n_regionkey` int(11) NOT NULL, `n_comment` varchar(152) DEFAULT NULL, PRIMARY KEY (`n_nationkey`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 broadcast; CREATE TABLE `region` ( `r_regionkey` int(11) NOT NULL, `r_name` varchar(25) NOT NULL, `r_comment` varchar(152) DEFAULT NULL, PRIMARY KEY (`r_regionkey`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 broadcast;
调整实例参数
说明为了在压测场景下达到最佳性能,需要调整PolarDB-X计算层实例参数。
修改参数XPROTO_MAX_DN_CONCURRENT和XPROTO_MAX_DN_WAIT_CONNECTION的值为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_SORT_AGG=false; set GLOBAL MPP_PARALLELISM=192; set GLOBAL ENABLE_MASTER_MPP=true; set GLOBAL GROUP_PARALLELISM=8;
数据准备
下载脚本tpchData.tar.gz至压力机ECS上,并解压:
tar xzvf tpchData.tar.gz cd tpchData/ vi params.conf
修改params.conf配置文件,填入PolarDB-X实例的连接信息:
#!/bin/bash ### remote generating directory export remoteGenDir=./ ### target path export targetPath=../tpch/tpchRaw ### cores per worker, default value is 1 export coresPerWorker=`cat /proc/cpuinfo| grep "processor"| wc -l` ### threads per worker, default value is 1 export threadsPerWorker=`cat /proc/cpuinfo| grep "processor"| wc -l` #export threadsPerWorker=1 export hint="" export insertMysql="mysql -h{HOST} -P{PORT} -u{USER} -p{PASSWORD} -Ac --local-infile tpch_100g -e"
具体填入的值包括:
{HOST}:主机名
{PORT}:端口号
{USER}:用户名
{PASSWORD}:密码
如果希望更高效地生成数据,可调大脚本中threadsPerWorker的值(如调整为压测机的CPU核数)。
执行脚本,多进程生成100 GB的数据:
cd datagen sh generateTPCH.sh 100
可以在tpch/tpchRaw/SF100/目录下查看到生成的数据:
ls ../tpch/tpchRaw/SF100/ customer lineitem nation orders part partsupp region supplier
导入数据到PolarDB-X实例:
cd ../loadTpch sh loadTpch.sh 100
校验数据完整性
通过命令行连接到PolarDB-X实例,查询每张表的数据量是否符合预期:
MySQL [tpch_100g]> select (select count(*) from customer) as customer_cnt, (select count(*) from lineitem) as lineitem_cnt, (select count(*) from nation) as nation_cnt, (select count(*) from orders) as order_cnt, (select count(*) from part) as part_cnt, (select count(*) from partsupp) as partsupp_cnt, (select count(*) from region) as region_cnt, (select count(*) from supplier) as supplier_cnt; +--------------+--------------+------------+-----------+----------+--------------+------------+--------------+ | customer_cnt | lineitem_cnt | nation_cnt | order_cnt | part_cnt | partsupp_cnt | region_cnt | supplier_cnt | +--------------+--------------+------------+-----------+----------+--------------+------------+--------------+ | 15000000 | 600037902 | 25 | 150000000 | 20000000 | 80000000 | 5 | 1000000 | +--------------+--------------+------------+-----------+----------+--------------+------------+--------------+
采集统计信息
通过命令行连接到PolarDB-X实例,执行analyze table收集表的统计信息:
analyze table customer; analyze table lineitem; analyze table nation; analyze table orders; analyze table part; analyze table partsupp; analyze table region; analyze table supplier;
进行测试
下载测试脚本tpch-queries.tar.gz并解压:
tar xzvf tpch-queries.tar.gz
运行脚本,执行查询并计时:
cd tpch-queries 'time' -f "%e" sh all_query.sh {HOST} {USER} {PASSWORD} {DB} {PORT}
测试结果(5.4.15-16704996)
以下结果的时间单位为:秒(s)
Q1 | 48.45 |
Q2 | 2.06 |
Q3 | 14.49 |
Q4 | 3.35 |
Q5 | 9.11 |
Q6 | 10.32 |
Q7 | 29.77 |
Q8 | 10.82 |
Q9 | 52.06 |
Q10 | 6.47 |
Q11 | 9.76 |
Q12 | 11.88 |
Q13 | 6.69 |
Q14 | 2.86 |
Q15 | 6.8 |
Q16 | 1.92 |
Q17 | 2.12 |
Q18 | 13.35 |
Q19 | 4.26 |
Q20 | 13.66 |
Q21 | 18.69 |
Q22 | 3.22 |
总时间 | 280.21 |
测试结果(5.4.15-16715927)
以下结果的时间单位为:秒(s)
Q1 | 49.62 |
Q2 | 2.08 |
Q3 | 14.67 |
Q4 | 3.36 |
Q5 | 9.26 |
Q6 | 10.48 |
Q7 | 30.34 |
Q8 | 10.94 |
Q9 | 50.84 |
Q10 | 6.37 |
Q11 | 9.27 |
Q12 | 12.17 |
Q13 | 7.06 |
Q14 | 2.9 |
Q15 | 6.76 |
Q16 | 2.01 |
Q17 | 2.1 |
Q18 | 13.7 |
Q19 | 4.05 |
Q20 | 13.62 |
Q21 | 18.42 |
Q22 | 3.33 |
总时间 | 280.21 |
测试结果(5.4.16-16717637)
以下结果的时间单位为:秒(s)
Q1 | 49.37 |
Q2 | 2.18 |
Q3 | 14.82 |
Q4 | 3.34 |
Q5 | 9.4 |
Q6 | 10.21 |
Q7 | 30.77 |
Q8 | 10.99 |
Q9 | 51.17 |
Q10 | 6.58 |
Q11 | 9.91 |
Q12 | 11.97 |
Q13 | 7.97 |
Q14 | 3.06 |
Q15 | 6.89 |
Q16 | 2.08 |
Q17 | 2.02 |
Q18 | 13.83 |
Q19 | 4.3 |
Q20 | 13.6 |
Q21 | 18.78 |
Q22 | 3.31 |
总时间 | 286.55 |
测试结果(5.4.17-16835173)
以下结果的时间单位为:秒(s)
Q1 | 47.37 |
Q2 | 1.84 |
Q3 | 15.31 |
Q4 | 3.33 |
Q5 | 9.17 |
Q6 | 9.58 |
Q7 | 30.32 |
Q8 | 10.95 |
Q9 | 52.17 |
Q10 | 7.04 |
Q11 | 9.43 |
Q12 | 12.11 |
Q13 | 7.41 |
Q14 | 3.08 |
Q15 | 6.87 |
Q16 | 2.04 |
Q17 | 2.08 |
Q18 | 14.06 |
Q19 | 4.43 |
Q20 | 13 |
Q21 | 18.9 |
Q22 | 3.39 |
总时间 | 283.88 |
测试结果(5.4.18-16977056)
以下结果的时间单位为:秒(s)
Q1 | 50.63 |
Q2 | 3.15 |
Q3 | 15.36 |
Q4 | 3.62 |
Q5 | 10.06 |
Q6 | 10.03 |
Q7 | 30.51 |
Q8 | 10.91 |
Q9 | 49.74 |
Q10 | 8.05 |
Q11 | 4.1 |
Q12 | 12.2 |
Q13 | 5.45 |
Q14 | 2.68 |
Q15 | 7.02 |
Q16 | 2.18 |
Q17 | 2.16 |
Q18 | 14.2 |
Q19 | 3.66 |
Q20 | 14.07 |
Q21 | 19.04 |
Q22 | 3.46 |
总时间 | 282.28 |
- 本页导读 (0)