鲲鹏社区首页
中文
注册
开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

编译和安装TPC-H测试工具包

编译和安装TPC-H测试工具包之前,需要对工具包做一些修改。

  1. 将TPC-H测试工具包放到MySQL环境“/home”目录或者其他目录下。要求磁盘空间大于后续5中生成的.tbl数据文件的大小。
  2. 修改makefile文件。
    1. 解压zip文件,进入dbgen目录并打开makefile.suite文件。tpch-pq.zip为TPC-H测试工具包的名称,“/home/tpch-pq/2.18.0_rc2/dbgen/”为dbgen目录,请根据实际情况填写。
      1
      2
      3
      unzip tpch-pq.zip
      cd /home/tpch-pq/2.18.0_rc2/dbgen/
      vim makefile.suite
      
    2. 按“i”进入编辑模式,将第103~112行修改为如下内容。
      CC      = gcc
      # Current values for DATABASE are: INFORMIX, DB2, TDAT (Teradata)
      #                                  SQLSERVER, SYBASE, ORACLE, VECTORWISE
      # Current values for MACHINE are:  ATT, DOS, HP, IBM, ICL, MVS,
      #                                  SGI, SUN, U2200, VMS, LINUX, WIN32
      # Current values for WORKLOAD are:  TPCH
      DATABASE = MYSQL
      MACHINE  = LINUX
      WORKLOAD = TPCH
      #
    3. “Esc”键,输入:wq!,按“Enter”保存并退出编辑。
    4. 将文件名从makefile.suite更改为makefile。这样,在4.b中使用make命令时,才能正确地应用修改后的内容。
      1
      cp makefile.suite makefile
      
  3. 修改tpcd.h文件。
    1. 打开tpcd.h文件。
      1
      vim tpcd.h
      
    2. 按“i”进入编辑模式,在文件最上方添加如下宏定义。
      1
      2
      3
      4
      5
      6
      7
      8
      #ifdef MYSQL
      #define GEN_QUERY_PLAN ""
      #define START_TRAN "START TRANSACTION"
      #define END_TRAN "COMMIT"
      #define SET_OUTPUT ""
      #define SET_ROWCOUNT "limit %d;\n"
      #define SET_DBASE "use %s;\n"
      #endif
      
    3. “Esc”键,输入:wq!,按“Enter”保存并退出编辑。
  4. 生成dbgen可执行文件。
    1. 进入dbgen目录。“/home/tpch-pq/2.18.0_rc2/dbgen/”为dbgen目录,请根据实际情况填写。
      1
      cd /home/tpch-pq/2.18.0_rc2/dbgen/
      
    2. 执行make命令。命令执行完成后,您将在dbgen文件夹中看到许多.o格式的文件和一个dbgen可执行文件。
      1
      make
      
  5. 在dbgen目录下,使用如下命令生成.tbl数据文件。在本例中,-s 1表示生成1GB的数据。如果需要生成10GB的数据,将1改为10即可。
    1
    ./dbgen -s 1
    

    执行上述命令后,dbgen工具将开始生成数据文件并保存在当前目录下。生成的数据文件包括8个表,分别是:supplier.tbl、region.tbl、part.tbl、partsupp.tbl、orders.tbl、nation.tbl、lineitem.tbl、customer.tbl。

  6. 修改初始化脚本。

    压缩包中包含两个脚本:dss.ddl用于创建表,dss.ri用于关联表中的主键和外键。这些脚本需要进行修改才能在MySQL中使用。

    修改dss.ddl

    1. 为了建立MySQL数据库连接,需要在dss.ddl的开头添加一些命令。在dss.ddl的最前面加上以下代码:
      1
      2
      3
      DROP DATABASE tpch;
      CREATE DATABASE tpch;
      USE tpch;
      
    2. 考虑到TPC-H自带的测试用表名是小写的,而DSS.DDL中的表名是大写的,为了保持一致性,建议将表名改为小写。
      打开dss.ddl。
      1
      vi dss.ddl
      
      “ESC”键进入命令行模式,输入以下命令将表名改为小写,按回车键完成输入。
      1
      :%s/TABLE\(.*\)/TABLE\L\1
      

    修改dss.ri

    1. 打开dss.ri。
      1
      vi dss.ri
      
    2. 按“i”进入编辑模式,将初始版本内容替换为以下全部内容。
      1. 下面“-- ALTER TABLE tpch.* DROP PRIMARY KEY;”这8行语句,需要注意每行语句前3个字符是“-- ”。
      2. 格式:--空格ALTER TABLE tpch.* DROP PRIMARY KEY;
      -- Sccsid:     @(#)dss.ri   2.1.8.1
      -- tpch Benchmark Version 8.0
      
      USE tpch;
      
      -- ALTER TABLE tpch.region DROP PRIMARY KEY;
      -- ALTER TABLE tpch.nation DROP PRIMARY KEY;
      -- ALTER TABLE tpch.part DROP PRIMARY KEY;
      -- ALTER TABLE tpch.supplier DROP PRIMARY KEY;
      -- ALTER TABLE tpch.partsupp DROP PRIMARY KEY;
      -- ALTER TABLE tpch.orders DROP PRIMARY KEY;
      -- ALTER TABLE tpch.lineitem DROP PRIMARY KEY;
      -- ALTER TABLE tpch.customer DROP PRIMARY KEY;
      
      
      -- For table region
      ALTER TABLE tpch.region
      ADD PRIMARY KEY (R_REGIONKEY);
      
      -- For table nation
      ALTER TABLE tpch.nation
      ADD PRIMARY KEY (N_NATIONKEY);
      
      ALTER TABLE tpch.nation
      ADD FOREIGN KEY NATION_FK1 (N_REGIONKEY) references
      tpch.region(R_REGIONKEY);
      
      COMMIT WORK;
      
      -- For table part
      ALTER TABLE tpch.part
      ADD PRIMARY KEY (P_PARTKEY);
      
      COMMIT WORK;
      
      -- For table supplier
      ALTER TABLE tpch.supplier
      ADD PRIMARY KEY (S_SUPPKEY);
      ALTER TABLE tpch.supplier
      ADD FOREIGN KEY SUPPLIER_FK1 (S_NATIONKEY) references
      tpch.nation(N_NATIONKEY);
      
      COMMIT WORK;
      
      -- For table partsupp
      ALTER TABLE tpch.partsupp
      ADD PRIMARY KEY (PS_PARTKEY,PS_SUPPKEY);
      
      COMMIT WORK;
      
      -- For table customer
      ALTER TABLE tpch.customer
      ADD PRIMARY KEY (C_CUSTKEY);
      
      ALTER TABLE tpch.customer
      ADD FOREIGN KEY CUSTOMER_FK1 (C_NATIONKEY) references
      tpch.nation(N_NATIONKEY);
      
      COMMIT WORK;
      
      -- For table lineitem
      ALTER TABLE tpch.lineitem
      ADD PRIMARY KEY (L_ORDERKEY,L_LINENUMBER);
      
      COMMIT WORK;
      
      -- For table orders
      ALTER TABLE tpch.orders
      ADD PRIMARY KEY (O_ORDERKEY);
      
      COMMIT WORK;
      
      -- For table partsupp
      ALTER TABLE tpch.partsupp
      ADD FOREIGN KEY PARTSUPP_FK1 (PS_SUPPKEY) references
      tpch.supplier(S_SUPPKEY);
      COMMIT WORK;
      
      ALTER TABLE tpch.partsupp
      ADD FOREIGN KEY PARTSUPP_FK2 (PS_PARTKEY) references
      tpch.part(P_PARTKEY);
      
      COMMIT WORK;
      
      -- For table orders
      ALTER TABLE tpch.orders
      ADD FOREIGN KEY ORDERS_FK1 (O_CUSTKEY) references
      tpch.customer(C_CUSTKEY);
      
      COMMIT WORK;
      
      -- For table lineitem
      ALTER TABLE tpch.lineitem
      ADD FOREIGN KEY LINEITEM_FK1 (L_ORDERKEY) references
      tpch.orders(O_ORDERKEY);
      
      COMMIT WORK;
      
      ALTER TABLE tpch.lineitem
      ADD FOREIGN KEY LINEITEM_FK2 (L_PARTKEY,L_SUPPKEY) references
      tpch.partsupp(PS_PARTKEY,PS_SUPPKEY);
      
      COMMIT WORK;
    3. “Esc”键,输入:wq!,按“Enter”保存并退出编辑。
  7. 创建tpch数据库和数据表,并在MySQL数据库中导入ddl文件。在本例中,“/home/tpch-pq/2.18.0_rc2”为服务器上的实际路径,请根据实际情况修改。
    \. /home/tpch-pq/2.18.0_rc2/dbgen/dss.ddl
    查看数据库。使用如下语句查询是否创建成功,可以看到新增了一个名为tpch的数据库。
    1
    SHOW DATABASES;
    
  8. 在MySQL数据库中导入dds.ri文件。在本例中,“/home/tpch-pq/2.18.0_rc2”为服务器上的实际路径,请根据实际情况修改。
    1
    \. /home/tpch-pq/2.18.0_rc2/dbgen/dss.ri
    
  9. 导入数据。
    1. 在dbgen目录下创建一个load.sh脚本文件。
      1
      vi load.sh
      
    2. 按“i”进入编辑模式,输入以下代码。tpch为数据库名称,请根据实际情况填写。
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      #!/bin/bash
      
      write_to_file()
      {
      file="loaddata.sql"
      
      if [ ! -f "$file" ] ; then
      touch "$file"
      fi
      
      echo 'USE tpch;' >> $file
      echo 'SET FOREIGN_KEY_CHECKS=0;' >> $file
      
      DIR=`pwd`
      for tbl in `ls *.tbl`; do
      table=$(echo "${tbl%.*}")
      echo "LOAD DATA LOCAL INFILE '$DIR/$tbl' INTO TABLE $table" >> $file
      echo "FIELDS TERMINATED BY '|' LINES TERMINATED BY '|\n';" >> $file
      done
      echo 'SET FOREIGN_KEY_CHECKS=1;' >> $file
      }
      
      write_to_file
      
    3. “Esc”键,输入:wq!,按“Enter”保存并退出编辑。
    4. 执行load.sh脚本。
      1
      sh load.sh
      

      同目录下将会生成一个loaddata.sql文件,里面是从8个tbl里导入数据的SQL语句。

    5. 导入数据:
      1
      mysql --local-infile -uroot -p123456 -S /data/mysql/run/mysql.sock < loaddata.sql
      

      数据量越大,导入时间越久。请耐心等待。

    6. 验证是否导入成功。可以登录数据库里查看8个表,如果有数据,表示数据导入成功。
  10. 在dbgen目录下生成查询SQL语句。
    1. 将qgen执行文件和dists.dss文件拷贝到queries模板目录中。
      1
      cp qgen dists.dss queries/
      

      通过ll命令可以查看到已经拷贝成功。

      1
      ll
      

    2. 在dbgen目录下创建saveSql文件夹。
      1
      mkdir ../saveSql
      
    3. 进入queries目录。
      1
      cd queries
      
    4. 在queries目录下生成查询SQL语句。
      • 如果需要生成22条SQL语句,请执行如下命令:
        1
        for i in {1..22};do ./qgen -d ${i} > ../../saveSql/${i}.sql;done
        
      • 如果需要生成指定的SQL语句,请执行对应序号的命令,例如需要生成1.sql的查询语句:
        1
        ./qgen -d 1 > ../../saveSql/1.sql
        

      由于TPC-H没有适配MySQL,因此生成的SQL文件无法在MySQL上运行,需要到saveSql目录下打开生成的SQL文件,并按照表1修改并保存,以适配MySQL。在本例中,SQL文件的路径为“/home/tpch-pq/2.18.0_rc2/saveSql/”

      表1 SQL文件修改说明

      SQL文件名称

      对应修改说明

      1.sql

      删除day后面的(3)

      1.sql、4.sql、5.sql、6.sql、7.sql、8.sql、9.sql、11.sql、12.sql、13.sql、14.sql、15.sql、16.sql、17.sql、19.sql、20.sql、22.sql、

      删除最后一行的limit -1;

      可以在saveSql目录下快速删除,输入命令:

      1
      sed -i "s/limit\ -1;//g" *.sql
      

      2.sql、3.sql、10.sql、18.sql、21.sql

      删除倒数第二行的分号

      例如在1.sql文件中删除(3)limit -1;