TPC-DS生成执行的数据

工具介绍

安装相应的软件:

1
yum install gcc make flex bison byacc

进入 tools 目录,执行make命令,编译

./dsdgen –help:

  • DIR:数据存放目录。
  • SCALE:数据量,以GB为单位。
  • TABLE:生成哪张表的数据,一共有24张表哦。
  • PARALLEL:生成的数据一共分为多少份,一般生成TB级数据才会用到。
  • CHILD:当前数据是第几份,与PARALLEL配对使用。
  • FORCE:强制写入数据。

总体过程分这么几步:

  • 创建表结构
  • 通过 tpcds 工具,生成数据文件
  • 将数据导入到MySQL、PG 中
  • 通过 tpcds 工具,生成将要执行的SQL,默认生成过程会有问题,这里需要改下模板
  • 将所有的 SQL 拿出来,单独写一个执行程序,批量执行这些SQL,并打印出每条SQL的执行时间

下面分别介绍每步

创建表结构

创建 tpcds 库,将表结构导入
表结构在 tools目录下,tpcds.sql 这个文件
如果是普通的 MySQL导入没问题,对于TD-SQL会报错,因为 dbgen_version这个表没有主键
这个表就是一个生成文件的记录表,没什么意义,可以忽略,如果想创建,就手动把主键加上即可

生成数据文件

生成数据,这里生成的数据是5G

1
./dsdgen  -scale 5 -dir /tmp/data/

会生成 25个 dat 结尾的文件,这个文件是纯文本的
如果是在其他机器上生成的 dat 文件,可以通过 scp 拷贝到目标机器上:

1
2
3
4
5
6
7
8
#!/bin/bash

dir=/root/tmp_dat
for file in $dir/*;
do
    echo "scp $file "
    scp $file root@[dest machine ip]:/root/tpcds
done

将生成的数据文件导入

将 dat 文件导导入MySQL:

1
mysql -h 127.0.0.1 -P 3306 -u root --local-infile=1 -D tpcds -e "LOAD DATA LOCAL INFILE 'call_center.dat' INTO TABLE call_center FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';"

这里只导入了一张表的数据 call_center.dat
可以写一个脚本,完成批量导入

生成SQL

tpcds 生成 SQL:

1
./dsqgen  -DIRECTORY ../query_templates/ -TEMPLATE "query1.tpl" -DIALECT mysql -FILTER Y > ../sql/query1.sql

注意,默认是没有mysql方言的,需要在 query_templates 目录下执行

1
copy netezza.tpl mysql.tpl

github tpcds-kit项目的issues里面作者建议用netezza来替代mysql,这两者语法差不多
参考这里

批量生成 SQL 的脚本:

1
2
3
4
5
6
#!/bin/sh

for i in `seq 1 99`
do
./dsqgen  -DIRECTORY ../query_templates/ -TEMPLATE "query${i}.tpl" -DIALECT mysql -FILTER Y > /tmp/query${i}.sql
done

需要将模板文件中增加一段,否则生成 SQL 会报错
define _END = “”;
写个脚本批量替换:
注意,这个脚本只能执行一次

1
2
3
4
5
6
7
#!/bin/bash

for i in `seq 1 99`
do
  echo "replace query${i}.tpl"
  sed -i 's/define _LIMIT=100;/define _LIMIT=100;\ndefine _END = "";/' query${i}.tpl
done

再检查一下,是否每个脚本都有 define END了:

1
grep "define _END =" * | awk -F ":" '{print $1}' | awk -F "." '{print $1}' | sed 's/query//' | sort -n

检查一遍,发现这些少了,需要手动添加:

13   24    31    34
39   48    64
71  72  73  78
87  88   91    98

SQL兼容性对比

SQL 兼容性对比

查询编号 mysqlv5.7 PGv10 PGv12 hana Sql-Server Orale TeraData
query1 - yes yes yes yes - yes
query2 - - - yes - yes -
query3 yes yes yes yes yes - yes
query4 - yes yes yes yes - yes
query5 - - - - - - -
query6 yes yes yes yes yes - yes
query7 yes yes yes yes yes - yes
query8 - yes yes yes - - yes
query9 yes yes yes yes yes yes yes
query10 yes yes yes yes yes - yes
query11 - yes yes yes yes - yes
query12 - - - - - - -
query13 yes yes yes yes yes yes yes
query14 - - - - - - -
query15 yes yes yes yes - - yes
query16 - - - - - - -
query17 yes yes yes yes - - yes
query18 - yes yes yes yes - yes
query19 yes yes yes yes - - yes
query20 - - - - - - -
query21 - - - - - - -
query22 - yes yes yes yes - yes
query23 - - - - - - -
query24 - - - - yes - -
query25 yes yes yes yes yes - yes
query26 yes yes yes yes yes - yes
query27 - yes yes yes yes - yes
query28 yes yes yes yes yes - yes
query29 yes yes yes yes yes - yes
query30 - - - - - - -
query31 - yes yes yes yes yes -
query32 - - - - - - -
query33 - yes yes yes yes - -
query34 yes yes yes yes yes yes yes
query35 yes yes yes yes yes - yes
query36 - - - - - - -
query37 - - - - - - -
query38 - yes yes yes yes - yes
query39 - - - - - - -
query40 - - - - - - -
query41 yes yes yes yes - - -
query42 yes yes yes yes yes - yes
query43 yes yes yes yes yes - yes
query44 - yes yes yes yes - yes
query45 yes yes yes yes - - yes
query46 yes yes yes yes yes - yes
query47 - yes yes yes yes - yes
query48 - yes yes yes yes yes yes
query49 - - - yes - - -
query50 yes yes yes yes yes - yes
query51 - yes yes yes yes - yes
query52 yes yes yes yes yes - yes
query53 - yes yes yes yes - yes
query54 - yes yes yes yes - yes
query55 yes yes yes yes yes - yes
query56 - yes yes yes yes - -
query57 - yes yes yes yes - yes
query58 - yes yes yes yes - -
query59 - yes yes yes yes - yes
query60 - yes yes yes yes - -
query61 yes yes yes yes yes - yes
query62 yes yes yes yes - - yes
query63 - yes yes yes yes - yes
query64 - yes yes yes yes yes yes
query65 yes yes yes yes yes - -
query66 yes yes yes - - - -
query67 - yes yes yes yes - yes
query68 yes yes yes yes yes - yes
query69 yes yes yes yes yes - yes
query70 - - - - - - -
query71 yes yes yes yes yes yes -
query72 yes yes yes - - - -
query73 yes yes yes yes yes yes yes
query74 - yes yes yes yes - -
query75 - yes yes yes yes - -
query76 yes yes yes yes yes - yes
query77 - - - - - - -
query78 - yes yes yes yes - -
query79 yes yes yes yes - - yes
query80 - - - - - - -
query81 - yes yes yes yes - yes
query82 - - - - - - -
query83 - yes yes yes yes - -
query84 yes yes yes yes - - yes
query85 yes yes yes yes - - yes
query86 - - - - - - -
query87 - yes yes yes yes - yes
query88 yes yes yes yes yes yes yes
query89 - yes yes yes yes - yes
query90 yes - - yes yes - -
query91 yes yes yes yes yes yes yes
query92 - - - - - - -
query93 yes yes yes yes yes - yes
query94 - - - - - - -
query95 - - - - - - -
query96 yes yes yes yes yes - yes
query97 - yes yes yes yes - yes
query98 - - - - - - -
query99 yes yes yes yes - - yes
总计 42 73 73 74 62 11 59