DRDS TPC-H 50G 测试说明
TPC-H 说明
TPC-H 是业界常用的一套 Benchmark,由 TPC 委员会制定发布,用于评测数据库的分析型查询能力。TPC-H 查询包含 8 张数据表、22 条复杂的 SQL 查询,大多数查询包含若干表 Join、子查询和 Group-by 聚合等。
测试设计
以下测试结果基于 50G 数据量(Scalar Factor = 50),其中主要表数据量如下:LINEITEM 表约 3 亿行,ORDERS 表 7500 万行,PARSUPP 表 4000 万行。
以 Q18 为例(下方),包含 4 张千万到亿级表的 Join (含一个子查询 SemiJoin)和 Group-by 聚合。在 DRDS 企业级实例上查询执行时间约 11 秒。
select c_name, c_custkey, o_orderkey, o_orderdate, o_totalprice, sum(l_quantity)
from CUSTOMER, ORDERS, LINEITEM
where o_orderkey in (
select l_orderkey
from LINEITEM
group by l_orderkey
having sum(l_quantity) > 314
)
and c_custkey = o_custkey
and o_orderkey = l_orderkey
group by c_name, c_custkey, o_orderkey, o_orderdate, o_totalprice
order by o_totalprice desc, o_orderdate
limit 100;
更多关于 TPCH 的信息可以参考文章:TPCH 22条SQL语句分析
测试结果
- 企业版测试环境:DRDS 企业版 32c128G(单节点 16c64G) + 4 台 RDS MySQL 5.7 实例(8c32g 独享型)
- 标准版测试环境:DRDS 标准版 16c64G(单节点 8c32G)+ 4 台 RDS MySQL 5.7 实例(4c32g 独享型)
注:DRDS 入门版不具备 Parallel Query 能力,不建议用于执行分析型查询。
Query | 企业版(单位:秒) | 标准版(单位:秒) |
---|---|---|
Q01 | 55.82 | 111.84 |
Q02 | 6.12 | 11.54 |
Q03 | 15.99 | 30 |
Q04 | 17.71 | 36.56 |
Q05 | 10.89 | 23.01 |
Q06 | 8.06 | 16.76 |
Q07 | 17.09 | 34.80 |
Q08 | 13.44 | 26.09 |
Q09 | 53.81 | 101.51 |
Q10 | 8.73 | 19.67 |
Q11 | 18.25 | 19.74 |
Q12 | 8.80 | 18.60 |
Q13 | 14.15 | 31.33 |
Q14 | 17.49 | 42.43 |
Q15 | 20.62 | 42.79 |
Q16 | 2.13 | 4.15 |
Q17 | 1.93 | 4.07 |
Q18 | 11.01 | 22.82 |
Q19 | 12.97 | 27.61 |
Q20 | 27.77 | 49.25 |
Q21 | 38.84 | 68.08 |
Q22 | 5.27 | 11.29 |
总计 | 386.77 | 754.65 |
如何运行 TPCH 测试?
Step 1. 准备压力机 ECS
首先准备一个 ECS,这是以下所有操作的基础,准备数据、运行压测等都用的是这台机器。
建议选择 VPC 网络,经典网络有可能遇到 RDS 某些规格没有库存。记住这个 VPC 的 ID 和名称,之后我们所有的东西都部署在这个 VPC 里面。
建议使用最新的 Debian 或者 CentOS 镜像,防止编译时缺少依赖库。
Step 2. 准备数据中转的 RDS
首先准备一个 RDS 用于导入数据,因为 TPC-H DBGEN 生成的是 .tbl
文件,需要用 LOAD DATA
命令导入到 MySQL,而 DRDS 暂不支持这个命令。
创建 RDS,注意要和 ECS 放在同一个 VPC 中。
在 ECS 上下载编译 TPC-H DBGEN,参见这些文章:使用TPC-H测试性能,TPC-H数据导入MySQL教程
最后用 LOAD DATA
命令将生成的数据导入 RDS:
mysql --local-infile -hrm-XXXXXXXXXX.mysql.rds.aliyuncs.com -u<user> -p<password>
LOAD DATA LOCAL INFILE 'customer.tbl' INTO TABLE customer FIELDS TERMINATED BY '|';
(其他几张表以此类推)
Step 3. 准备压测用的 DRDS
创建 DRDS 实例以及相应的 RDS 实例,注意要和 ECS 放在同一个 VPC 中。
在 DRDS 上创建库和表,注意要指定分库分表方式,建议使用以下表结构:
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 dbpartition by hash(`c_custkey`) tbpartition by hash(`c_custkey`) tbpartitions 4;
CREATE TABLE `lineitem` (
`l_orderkey` int(11) NOT NULL,
`l_partkey` int(11) NOT NULL,
`l_suppkey` int(11) NOT NULL,
`l_linenumber` int(11) 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,
PRIMARY KEY (`l_orderkey`,`l_linenumber`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 dbpartition by RIGHT_SHIFT(`l_orderkey`,6) tbpartition by RIGHT_SHIFT(`l_orderkey`,6) tbpartitions 4;
CREATE TABLE `orders` (
`o_orderkey` int(11) 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` int(11) NOT NULL,
`o_comment` varchar(79) NOT NULL,
PRIMARY KEY (`O_ORDERKEY`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 dbpartition by RIGHT_SHIFT(`O_ORDERKEY`,6) tbpartition by RIGHT_SHIFT(`O_ORDERKEY`,6) tbpartitions 4;
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 dbpartition by hash(`p_partkey`) tbpartition by hash(`p_partkey`) tbpartitions 4;
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,
PRIMARY KEY (`ps_partkey`,`ps_suppkey`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 dbpartition by hash(`ps_partkey`) tbpartition by hash(`ps_partkey`) tbpartitions 4;
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 dbpartition by hash(`s_suppkey`) tbpartition by hash(`s_suppkey`) tbpartitions 4;
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;
Step 4. 使用 DTS 同步数据到 DRDS
Step 4.1. 登陆 DTS 控制台,选择【数据迁移】-【创建迁移任务】
Step 4.2. 填入刚刚创建的 RDS 和 DRDS 信息:
Step 4.3.选择所有要同步的表(选择左边的项目,点 >
按钮放到右边),然后点【高级设置】
Step 4.4.点【预览】,确认下源端、目标端的库名和表名符合预期
Step 4.5.点【预检查并启动】,规格建议选 large,等待同步任务完成。
同步完成后,DTS 和中转数据使用的 RDS 可以释放。
Step 5. 测试
运行 TPCH 测试前,使用 ANALYZE 命令采集统计信息:(由于刚刚导入了大量数据,当前统计信息可能不准确,影响执行计划生成)
analyze table customer;
analyze table lineitem;
analyze table nation;
analyze table orders;
analyze table part;
analyze table partsupp;
analyze table region;
analyze table supplier;
最后,在压力机上使用 MySQL 客户端连接到 DRDS 运行 TPCH 查询。
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
评论