全部产品
云市场

DRDS TPC-H 50G 测试说明

更新时间:2019-09-19 16:03:37

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 秒。

  1. select c_name, c_custkey, o_orderkey, o_orderdate, o_totalprice, sum(l_quantity)
  2. from CUSTOMER, ORDERS, LINEITEM
  3. where o_orderkey in (
  4. select l_orderkey
  5. from LINEITEM
  6. group by l_orderkey
  7. having sum(l_quantity) > 314
  8. )
  9. and c_custkey = o_custkey
  10. and o_orderkey = l_orderkey
  11. group by c_name, c_custkey, o_orderkey, o_orderdate, o_totalprice
  12. order by o_totalprice desc, o_orderdate
  13. 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 58.97 115.38
Q02 8.21 15.06
Q03 10.23 19
Q04 17.61 34.73
Q05 12.97 25.92
Q06 8.33 16.25
Q07 20.72 36.26
Q08 15.46 30.23
Q09 66.89 134.46
Q10 8.52 15.59
Q11 11.73 21.5
Q12 9.39 18.86
Q13 18.14 39.47
Q14 8.9 17.88
Q15 21.31 41.77
Q16 2.34 4.15
Q17 207.34 332.03
Q18 11.24 22.1
Q19 13.76 28.07
Q20 42.34 65.4
Q21 41.2 76.65
Q22 7 11.73
总计 622.6 1122.49

如何运行 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:

  1. mysql --local-infile -hrm-XXXXXXXXXX.mysql.rds.aliyuncs.com -u<user> -p<password>
  1. LOAD DATA LOCAL INFILE 'customer.tbl' INTO TABLE customer FIELDS TERMINATED BY '|';

(其他几张表以此类推)

Step 3. 准备压测用的 DRDS

创建 DRDS 实例以及相应的 RDS 实例,注意要和 ECS 放在同一个 VPC 中。

在 DRDS 上创建库和表,注意要指定分库分表方式,建议使用以下表结构:

  1. CREATE TABLE `customer` (
  2. `c_custkey` int(11) NOT NULL,
  3. `c_name` varchar(25) NOT NULL,
  4. `c_address` varchar(40) NOT NULL,
  5. `c_nationkey` int(11) NOT NULL,
  6. `c_phone` varchar(15) NOT NULL,
  7. `c_acctbal` decimal(15,2) NOT NULL,
  8. `c_mktsegment` varchar(10) NOT NULL,
  9. `c_comment` varchar(117) NOT NULL,
  10. PRIMARY KEY (`c_custkey`)
  11. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 dbpartition by hash(`c_custkey`) tbpartition by hash(`c_custkey`) tbpartitions 4;
  12. CREATE TABLE `lineitem` (
  13. `l_orderkey` int(11) NOT NULL,
  14. `l_partkey` int(11) NOT NULL,
  15. `l_suppkey` int(11) NOT NULL,
  16. `l_linenumber` int(11) NOT NULL,
  17. `l_quantity` decimal(15,2) NOT NULL,
  18. `l_extendedprice` decimal(15,2) NOT NULL,
  19. `l_discount` decimal(15,2) NOT NULL,
  20. `l_tax` decimal(15,2) NOT NULL,
  21. `l_returnflag` varchar(1) NOT NULL,
  22. `l_linestatus` varchar(1) NOT NULL,
  23. `l_shipdate` date NOT NULL,
  24. `l_commitdate` date NOT NULL,
  25. `l_receiptdate` date NOT NULL,
  26. `l_shipinstruct` varchar(25) NOT NULL,
  27. `l_shipmode` varchar(10) NOT NULL,
  28. `l_comment` varchar(44) NOT NULL,
  29. PRIMARY KEY (`l_orderkey`,`l_linenumber`)
  30. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 dbpartition by RIGHT_SHIFT(`l_orderkey`,6) tbpartition by RIGHT_SHIFT(`l_orderkey`,6) tbpartitions 4;
  31. CREATE TABLE `orders` (
  32. `o_orderkey` int(11) NOT NULL,
  33. `o_custkey` int(11) NOT NULL,
  34. `o_orderstatus` varchar(1) NOT NULL,
  35. `o_totalprice` decimal(15,2) NOT NULL,
  36. `o_orderdate` date NOT NULL,
  37. `o_orderpriority` varchar(15) NOT NULL,
  38. `o_clerk` varchar(15) NOT NULL,
  39. `o_shippriority` int(11) NOT NULL,
  40. `o_comment` varchar(79) NOT NULL,
  41. PRIMARY KEY (`O_ORDERKEY`)
  42. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 dbpartition by RIGHT_SHIFT(`O_ORDERKEY`,6) tbpartition by RIGHT_SHIFT(`O_ORDERKEY`,6) tbpartitions 4;
  43. CREATE TABLE `part` (
  44. `p_partkey` int(11) NOT NULL,
  45. `p_name` varchar(55) NOT NULL,
  46. `p_mfgr` varchar(25) NOT NULL,
  47. `p_brand` varchar(10) NOT NULL,
  48. `p_type` varchar(25) NOT NULL,
  49. `p_size` int(11) NOT NULL,
  50. `p_container` varchar(10) NOT NULL,
  51. `p_retailprice` decimal(15,2) NOT NULL,
  52. `p_comment` varchar(23) NOT NULL,
  53. PRIMARY KEY (`p_partkey`)
  54. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 dbpartition by hash(`p_partkey`) tbpartition by hash(`p_partkey`) tbpartitions 4;
  55. CREATE TABLE `partsupp` (
  56. `ps_partkey` int(11) NOT NULL,
  57. `ps_suppkey` int(11) NOT NULL,
  58. `ps_availqty` int(11) NOT NULL,
  59. `ps_supplycost` decimal(15,2) NOT NULL,
  60. `ps_comment` varchar(199) NOT NULL,
  61. PRIMARY KEY (`ps_partkey`,`ps_suppkey`)
  62. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 dbpartition by hash(`ps_partkey`) tbpartition by hash(`ps_partkey`) tbpartitions 4;
  63. CREATE TABLE `supplier` (
  64. `s_suppkey` int(11) NOT NULL,
  65. `s_name` varchar(25) NOT NULL,
  66. `s_address` varchar(40) NOT NULL,
  67. `s_nationkey` int(11) NOT NULL,
  68. `s_phone` varchar(15) NOT NULL,
  69. `s_acctbal` decimal(15,2) NOT NULL,
  70. `s_comment` varchar(101) NOT NULL,
  71. PRIMARY KEY (`s_suppkey`)
  72. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 dbpartition by hash(`s_suppkey`) tbpartition by hash(`s_suppkey`) tbpartitions 4;
  73. CREATE TABLE `nation` (
  74. `n_nationkey` int(11) NOT NULL,
  75. `n_name` varchar(25) NOT NULL,
  76. `n_regionkey` int(11) NOT NULL,
  77. `n_comment` varchar(152) DEFAULT NULL,
  78. PRIMARY KEY (`n_nationkey`)
  79. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 broadcast;
  80. CREATE TABLE `region` (
  81. `r_regionkey` int(11) NOT NULL,
  82. `r_name` varchar(25) NOT NULL,
  83. `r_comment` varchar(152) DEFAULT NULL,
  84. PRIMARY KEY (`r_regionkey`)
  85. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 broadcast;

Step 4. 使用 DTS 同步数据到 DRDS

Step 4.1. 登陆 DTS 控制台,选择【数据迁移】-【创建迁移任务】

4.1

Step 4.2. 填入刚刚创建的 RDS 和 DRDS 信息:

4.2

Step 4.3.选择所有要同步的表(选择左边的项目,点 > 按钮放到右边),然后点【高级设置】

4.3

Step 4.4.点【预览】,确认下源端、目标端的库名和表名符合预期

4.4

Step 4.5.点【预检查并启动】,规格建议选 large,等待同步任务完成。

同步完成后,DTS 和中转数据使用的 RDS 可以释放。

Step 5. 测试

运行 TPCH 测试前,使用 ANALYZE 命令采集统计信息:(由于刚刚导入了大量数据,当前统计信息可能不准确,影响执行计划生成)

  1. analyze table customer;
  2. analyze table lineitem;
  3. analyze table nation;
  4. analyze table orders;
  5. analyze table part;
  6. analyze table partsupp;
  7. analyze table region;
  8. analyze table supplier;

最后,在压力机上使用 MySQL 客户端连接到 DRDS 运行 TPCH 查询。