• 【openGauss/MogDB的TPCH测试】


    TPC-H是一个决策支持基准(Decision Support Benchmark),它由一套面向业务的特别查询和并发数据修改组成。查询和填充数据库的数据具有广泛的行业相关性。这个基准测试演示了检查大量数据、执行高度复杂的查询并回答关键业务问题的决策支持系统。TPC-H报告的性能指标称为TPC-H每小时复合查询性能指标(QphH@Size),反映了系统处理查询能力的多个方面。这些方面包括执行查询时所选择的数据库大小,由单个流提交查询时的查询处理能力,以及由多个并发用户提交查询时的查询吞吐量。

    TPC-H 测试标准模拟了一个零部件在线销售的系统,共定义了8个表:

    表名称说明
    REGION区域表
    NATION国家表
    SUPPLIER供应商表
    PART零部件表
    PARTSUPP零部件供应表
    CUSTOMER客户表
    ORDERS订单表
    LINEITEM订单明细表

    对应测试有22条SQL,涉及不同类型的业务。

    查询语句说明主要涉及业务
    Q1价格统计报告查询带有分组、排序、聚集操作并存的单表查询操作。这个查询会导致表上的数据有95%到97%行被读取到。
    Q2最小代价供货商查询带有排序、聚集操作、子查询并存的多表查询操作。查询语句没有从语法上限制返回多少条元组,但是TPC-H标准规定,查询结果只返回前100行(通常依赖于应用程序实现)。
    Q3运送优先级查询带有分组、排序、聚集操作并存的三表查询操作。查询语句没有从语法上限制返回多少条元组,但是TPC-H标准规定,查询结果只返回前10行(通常依赖于应用程序实现)。
    Q4订单优先级查询带有分组、排序、聚集操作、子查询并存的单表查询操作。子查询是相关子查询。
    Q5本地供应商收入量查询带有分组、排序、聚集操作、子查询并存的多表连接查询操作。
    Q6预测收入变化查询带有聚集操作的单表查询操作。查询语句使用了BETWEEN-AND操作符,有的数据库可以对BETWEEN-AND进行优化。
    Q7批量出货查询带有分组、排序、聚集、子查询操作并存的多表查询操作。子查询的父层查询不存在其他查询对象,是格式相对简单的子查询。
    Q8国家市场份额查询带有分组、排序、聚集、子查询操作并存的查询操作。子查询的父层查询不存在其他查询对象,是格式相对简单的子查询,但子查询自身是多表连接的查询。
    Q9产品类型利润估量查询带有分组、排序、聚集、子查询操作并存的查询操作。子查询的父层查询不存在其他查询对象,是格式相对简单的子查询,但子查询自身是多表连接的查询。子查询中使用了LIKE操作符,有的查询优化器不支持对LIKE操作符进行优化。
    Q10货运存在问题的查询带有分组、排序、聚集操作并存的多表连接查询操作。查询语句没有从语法上限制返回多少条元组,但是TPC-H标准规定,查询结果只返回前10行(通常依赖于应用程序实现)。
    Q11库存价值查询带有分组、排序、聚集、子查询操作并存的多表连接查询操作。子查询位于分组操作的HAVING条件中。
    Q12货运模式和订单优先级查询带有分组、排序、聚集操作并存的两表连接查询操作。
    Q13消费者订单数量查询带有分组、排序、聚集、子查询、左外连接操作并存的查询操作。
    Q14促销效果查询带有分组、排序、聚集、子查询、左外连接操作并存的查询操作。
    Q15头等供货商查询带有分排序、聚集、聚集子查询操作并存的普通表与视图的连接操作。
    Q16零件/供货商关系查询带有分组、排序、聚集、去重、NOT IN子查询操作并存的两表连接操作。
    Q17小订单收入查询带有聚集、聚集子查询操作并存的两表连接操作。
    Q18大订单顾客查询带有分组、排序、聚集、IN子查询操作并存的三表连接操作。查询语句没有从语法上限制返回多少条元组,但是TPC-H标准规定,查询结果只返回前100行(通常依赖于应用程序实现)。
    Q19折扣收入查询带有分组、排序、聚集、IN子查询操作并存的三表连接操作。
    Q20供货商竞争力查询带有排序、聚集、IN子查询、普通子查询操作并存的两表连接操作。
    Q21供应商留单等待查询带有分组、排序、聚集、EXISTS子查询、NOT EXISTS子查询操作并存的四表连接操作。查询语句没有从语法上限制返回多少条元组,但是TPC-H标准规定,查询结果只返回前100行(通常依赖于应用程序实现)。
    Q22全球销售机会查询带有分组、排序、聚集、EXISTS子查询、NOT EXISTS子查询操作并存的四表连接操作。

    如下是openGaus/MogDB测试TPCH的流程。可供参考:

    上传TPCH的工具包

    链接: https://pan.baidu.com/s/1REqknBiMWtkE5ECbQPXJzg 提取码: qjbc

    一、创建压测的数据库和用户

    1. MogDB=# create database tpch_db;
    2. CREATE DATABASE
    3. MogDB=# create user tpch with password 'Abcd@1234' sysadmin;
    4. NOTICE: The encrypted password contains MD5 ciphertext, which is not secure.
    5. CREATE ROLE
    6. MogDB=# alter database tpch_db owner to tpch ;
    7. ALTER DATABASE
    8. tpch_db=# alter schema public owner to tpch ;
    9. ALTER SCHEMA

    二、建测试表

    gsql -p 23000 -d tpch_db -U tpch < createtab_og.sql
    

    Pasted Graphic 2.png

    image.png

    三、编译dbgen软件

    解压TPCH的包,进入dbgen的目录

    1.修改makefile文件

    1. [om3@lmt0003 TPC-H_Tools_v3.0.0]$ pwd
    2. /home/om3/TPCH-openGauss-TestTools/TPCH-openGauss-TestTools/TPC-H_Tools_v3.0.0
    3. [om3@lmt0003 TPC-H_Tools_v3.0.0]$ cd dbgen/
    4. [om3@lmt0003 dbgen]$ ls
    5. answers build.c dists.dss dsstypes.h permute.h queries rnd.h tests tpch.vcproj
    6. bcd2.c check_answers driver.c HISTORY PORTING.NOTES README rng64.c text.c update_release.sh
    7. bcd2.h column_split.sh dss.ddl load_stub.c print.c reference rng64.h tpcd.h variants
    8. bm_utils.c config.h dss.h makefile.suite qgen.c release.h shared.h tpch.dsw varsub.c
    9. BUGS dbgen.dsp dss.ri permute.c qgen.vcproj rnd.c speed_seed.c tpch.sln
    10. [om3@lmt0003 dbgen]$ cp makefile.suite makefile
    11. [om3@lmt0003 dbgen]$ vi makefile

    Pasted Graphic 4.png

    修改其中103到112行

    image.png

    2.修改tpcd.h

    [om3@lmt0003 dbgen]$ vi tpcd.h 
    

    在文件末尾加上

    1. #ifdef POSTGRESQL
    2. #define GEN_QUERY_PLAN "EXPLAIN PLAN"
    3. #define START_TRAN "SET TRANSACTION"
    4. #define END_TRAN "COMMIT;"
    5. #define SET_OUTPUT ""
    6. #define SET_ROWCOUNT "LIMIT %d\n"
    7. #define SET_DBASE ""
    8. #endif

    修改完编译配置文件,可以编译出程序
    3.编译dbgen

    [om3@lmt0003 dbgen]$ make -f makefile
    

    image.png

    image.png

    参数说明:
    -v:详细信息
    -f:覆盖之前的文件
    -s:生成数据大小,单位GB
    -C参数:表示把生成的数据分为几份
    -S参数:切分数据用,表示第几个文件,例如:“-S 1”表示第1个文件,“-S 2”表示第2个文件

    四、生成数据

    例:
    1.生成1G数据

    ./dbgen vf -s 1
    

    image.png

    image.png

    生成8个tbl文件,对应8张表的数据。

    也可以使用多个线程产生数据,加块速率。例:8线程生成500G数据

    1. #!/bin/sh
    2. ./dbgen -vf -s 500 -S 1 -C 8 &
    3. ./dbgen -vf -s 500 -S 2 -C 8 &
    4. ./dbgen -vf -s 500 -S 3 -C 8 &
    5. ./dbgen -vf -s 500 -S 4 -C 8 &
    6. ./dbgen -vf -s 500 -S 5 -C 8 &
    7. ./dbgen -vf -s 500 -S 6 -C 8 &
    8. ./dbgen -vf -s 500 -S 7 -C 8 &
    9. ./dbgen -vf -s 500 -S 8 -C 8 &

    2.转换数据(把tbl文件转换为csv文件)

    for i in `ls *.tbl`;do sed 's/|$//' $i > ${i/tbl/csv};echo $i;done;
    

    image.png

    五、导入数据

    创建脚本,导入数据

    [om3@lmt0003 dbgen]$ vi copyin_tpch_db.sh 
    

    下面需要修改的部分为dir和opts部分,dir为上述csv的路径。opts是gsql后需要加的参数,包含端口,数据库名等,sch是指定schema。

    1. dir=/home/om3/TPCH-openGauss-TestTools/TPCH-openGauss-TestTools/TPC-H_Tools_v3.0.0/dbgen
    2. opts='-p 23000 -d tpch_db'
    3. sch=public
    4. gsql $opts -c "COPY $sch.region FROM '$dir/region.csv' WITH (FORMAT csv,DELIMITER '|')"
    5. gsql $opts -c "COPY $sch.nation FROM '$dir/nation.csv' WITH (FORMAT csv,DELIMITER '|')"
    6. gsql $opts -c "COPY $sch.part FROM '$dir/part.csv' WITH (FORMAT csv,DELIMITER '|')"
    7. gsql $opts -c "COPY $sch.supplier FROM '$dir/supplier.csv' WITH (FORMAT csv,DELIMITER '|')"
    8. gsql $opts -c "COPY $sch.customer FROM '$dir/customer.csv' WITH (FORMAT csv,DELIMITER '|')"
    9. gsql $opts -c "COPY $sch.partsupp FROM '$dir/partsupp.csv' WITH (FORMAT csv,DELIMITER '|')"
    10. gsql $opts -c "COPY $sch.orders FROM '$dir/orders.csv' WITH (FORMAT csv,DELIMITER '|')"
    11. gsql $opts -c "COPY $sch.lineitem FROM '$dir/lineitem.csv' WITH (FORMAT csv,DELIMITER '|')"

    image.png

    六、创建所需函数

    1. create or replace function NUMTOYMINTERVAL(float8, text) returns interval as $$ select ($1||' '||$2)::interval;
    2. $$ language sql strict immutable;
    3. create or replace function NUMTODSINTERVAL(float8, text) returns interval as $$ select ($1||' '||$2)::interval;
    4. $$ language sql strict immutable;

    image.png

    七、执行SQL文件夹下SQL(共22种SQL)

    image.png

    如下是遍历执行全部22种SQL的脚本

    1. #!/bin/bash
    2. opts='-p 23000 -d tpch_db -U tpch -W 'Abcd@1234''
    3. for i in `seq 1 22`
    4. do
    5. echo $i"'s result"
    6. gsql ${opts} -f ${i}.sql
    7. done

    image.png

    可以将8张表的导入耗时以及22种SQL的执行耗时记录下来,并做相应对比(测表导入耗时可以copy前开启\timing)。

  • 相关阅读:
    PhpStorm环境配置与应用
    PyCharm 常用快捷键
    29、Nio(seletor为什么要处理完的key要手动清除(remove))
    【FISCO BCOS】二十一、JAVA与FISCO BCOS交互(节点前置篇)
    消息队列的原理与基本使用
    安卓学习中遇到的问题【bug】
    算符与数据结构 --- 类C语言有关操作和补充
    【Python]】地图热力图如何绘制?(含源代码)
    壳聚糖-聚乙二醇-N-羟基琥珀酰亚胺|Chitosan-PEG-NHS
    OceanBase存储层代码解读(四):宏块的垃圾回收和坏块检查
  • 原文地址:https://blog.csdn.net/weixin_47308871/article/details/134500801