利用TPC-H为MYSQL生成数据


导言

这篇文章是看了joyee写的TPC-H数据导入MySQL教程以及另一篇网上的MySQL TPCH测试工具简要手册 后写的,有些内容是完全转载自以上两篇文章的,这里我写这篇文章主要写下自己的归纳和更改。

TPC-H简介

TCP-H是一个决策支持的测试基准,由一系列面向商务应用的查询和并发数据修改组成,其选择的查询和组成数据库的数据在商业上都具有广泛的代表性并且易于实现。该基准描述了决策支持系统的三个方面:分析大量的数据,执行高复杂度的查询,回答关键的商业问题。

我主要是想用TPC-H生成数据库样本,用于进行数据库实验。但是TPC-H是不支持为MYSQL生成数据的,所以我们需要对它的配置文件进行一些“魔改”。

TPC-H的安装包可以从官网免费获取。

过程

1、解压和编译

解压tpch文件,进入dbgen目录。

首先,我们需要更改TPC-H编译文件,

cp makefile.suite makefile

接着修改makefile文件

将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

第一行的意思是设定C语言编译器为gcc。

我们从这里也看到,DATABASE其实是没有MYSQL选项的,所以,我们后面需要为MYSQL添加依赖。

修改tpcd.h

在文件末尾加上

#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

修改完编译配置文件,我们可以编译出程序。

命令行执行make

这个过程中会有一些关于数据类型的警告,无视它。

make完dbgen目录下之后就会多出很多.o 文件,dbgen、qgen可执行程序,dss.ri,dss.dll文件。

2.生成数据

dbgen:数据生成工具。可以用该工具生成tpch相关表数据。

我们使用dbgen生成数据,共生成8个表(.tbl)。

./dbgen -s 1

-s 1表示生产1G数据,我们也可以根据我们需要更改大小。

3.修改相关脚本

接着,

dss.ddl – DSS库初始化DDL脚本

dss.ri – DSS数据表创建索引、外键脚本

由于我们用的是MYSQL,所以需要对这些脚本进行适当修改。

dss.dll 需要在开头添加

drop database tpch;
create database tpch;
use tpch;

成品文件 https://gist.github.com/MR-HOWE/9cd5c3438a1e2c79c66d2526e3ae30e3

dss.ri 的情况复杂一些。

首先,更改第6~13行命令(原来的与MYSQL不兼容),在所有的SQL注释符 “--” 后面再加一个空格

-- ALTER TABLE TPCD.REGION DROP PRIMARY KEY;
-- ALTER TABLE TPCD.NATION DROP PRIMARY KEY;
-- ALTER TABLE TPCD.PART DROP PRIMARY KEY;
-- ALTER TABLE TPCD.SUPPLIER DROP PRIMARY KEY;
-- ALTER TABLE TPCD.PARTSUPP DROP PRIMARY KEY;
-- ALTER TABLE TPCD.ORDERS DROP PRIMARY KEY;
-- ALTER TABLE TPCD.LINEITEM DROP PRIMARY KEY;
-- ALTER TABLE TPCD.CUSTOMER DROP PRIMARY KEY;

接着,因为MySQL里添加外键要指明键的名字,所以每个加外键的指令都需要改。

修改第25行:

ADD FOREIGN KEY NATION_FK1 (N_REGIONKEY) references TPCD.REGION;
=>
ADD FOREIGN KEY NATION_FK1 (N_REGIONKEY) references TPCD.REGION(R_REGIONKEY); 修改第40行: ADD FOREIGN KEY SUPPLIER_FK1 (S_NATIONKEY) references TPCD.NATION;
=>
ADD FOREIGN KEY SUPPLIER_FK1 (S_NATIONKEY) references TPCD.NATION(N_NATIONKEY); 修改第55行: ADD FOREIGN KEY CUSTOMER_FK1 (C_NATIONKEY) references TPCD.NATION;
=>
ADD FOREIGN KEY CUSTOMER_FK1 (C_NATIONKEY) references TPCD.NATION(N_NATIONKEY); 修改第73行: ADD FOREIGN KEY PARTSUPP_FK1 (PS_SUPPKEY) references TPCD.SUPPLIER;
=>
ADD FOREIGN KEY PARTSUPP_FK1 (PS_SUPPKEY) references TPCD.SUPPLIER(S_SUPPKEY); 修改第78行: ADD FOREIGN KEY PARTSUPP_FK2 (PS_PARTKEY) references TPCD.PART;
=>
ADD FOREIGN KEY PARTSUPP_FK2 (PS_PARTKEY) references TPCD.PART(P_PARTKEY); 修改第84行: ADD FOREIGN KEY ORDERS_FK1 (O_CUSTKEY) references TPCD.CUSTOMER;
=>
ADD FOREIGN KEY ORDERS_FK1 (O_CUSTKEY) references TPCD.CUSTOMER(C_CUSTKEY); 修改第90行: ADD FOREIGN KEY LINEITEM_FK1 (L_ORDERKEY) references TPCD.ORDERS;
=>
ADD FOREIGN KEY LINEITEM_FK1 (L_ORDERKEY) references TPCD.ORDERS(O_ORDERKEY); 修改第96行: TPCD.PARTSUPP;
=>
TPCD.PARTSUPP(PS_PARTKEY,PS_SUPPKEY);
另外,由于TPC-H生成的表名是大写的,基于MYSQL的标准,我们最好把表名修改为小写的,因此在文件末尾添加:

ALTER TABLE CUSTOMER rename to customer;
ALTER TABLE LINEITEM rename to lineitem;
ALTER TABLE NATION rename to nation;
ALTER TABLE ORDERS rename to orders;
ALTER TABLE PART rename to part;
ALTER TABLE PARTSUPP rename to partsupp;
ALTER TABLE REGION rename to region;
ALTER TABLE SUPPLIER rename to supplier;

成品文件 https://gist.github.com/MR-HOWE/18dc736352183f3a3447db8f49b397d1

接着打开mysql,执行

mysql> \. 路径/dss.ddl

然后可以用

mysql> SHOW DATABASES;

如果看到tcph数据库,所以建库成功。

再执行

mysql> USE tpch;

mysql> SHOW TABLES;

可以看到生成的8个表就说明建表成功。

下一步需要添加外键和主键,执行

mysql> \. 路径/dss.ri

4.导入数据

现在,数据库tcph只是建好了表,设定好了主键和外键,内容还是为空。我们需要将之前生成的tbl文件导入。

8个表就需要输入执行8条命令,这里joyee写了一个脚本,可以方便的生成sql命令,脚本如下(这里表示要向大佬学习,发挥“偷懒精神”)

#!/bin/bash

write_to_file()
{
file="loaddata.sql" if [ ! -f "$file" ] ; then
touch "$file"
fi echo 'USE tpch;' >> $file
DIR=`pwd`
for tbl in `ls *.tbl`; do
table=$(echo "${tbl%.*}" | tr '[:lower:]' '[:upper:]')
echo "LOAD DATA LOCAL INFILE '$DIR/$tbl' INTO TABLE $table" >> $file
echo "FIELDS TERMINATED BY '|' LINES TERMINATED BY '|\n';" >> $file
done
} write_to_file

这里由于我之前把表名改为小写了,所以我们不需要大写表名。同时,因为有外键约束,表的导入需要安装约束顺序来,为了方便导入,我们可以先把外键约束关了,导入完表再重新打开外键约束,代码如下:

#!/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

将以上代码保存到dbgen目录下,保存为“load.sh”,然后执行

sh load.sh

同目录下就会生成一个loaddata.sql,里面是从8个tbl里导入数据的sql指令。

在dbgen目录下运行

mysql -u root -p < loaddata.sql即可。

(这里如果运行有问题看看试试joyee说的加上 --local-infile。mysql --local-infile -u root -p < loaddata.sql)

利用TPC-H为MYSQL生成数据的更多相关文章

  1. myeclipse连接mysql生成数据表时中文字符乱码或问号(解决方法)

    出现这个问题有以下三步解决思路: 1. 检查myeclipse的编码格式 windows---->Preferences---->general---->Workspace,右侧窗口 ...

  2. 利用MySQL原数据信息批量转换指定库数据表生成Hive建表语句

    1.写出文件工具类 package ccc.utile; import java.io.*; /** * @author ccc * @version 1.0.0 * @ClassName Write ...

  3. 利用Flume将MySQL表数据准实时抽取到HDFS

    转自:http://blog.csdn.net/wzy0623/article/details/73650053 一.为什么要用到Flume 在以前搭建HAWQ数据仓库实验环境时,我使用Sqoop抽取 ...

  4. 利用动软代码生成器 自动生成LINQ需要用的数据实体类 (转)

    首先先建立一个模板 名称随意 我起的“生成数据实体.cmt” 代码如下: <#@ template language="c#" HostSpecific="True ...

  5. Python利用Plotly实现对MySQL中的数据可视化

    Mysql表数据: demo.sql内容 create table demo( id int ,product varchar(50) ,price decimal(18,2) ,quantity i ...

  6. mysql分表,批量生成数据

    一.mysql的分表策略 根据经验,Mysql表数据一般达到百万级别,查询效率会很低,容易造成表锁,甚至堆积很多连接,直接挂掉: 1,水平分割: 水平(横向)拆分:将同一个表的数据进行分块保存到不同的 ...

  7. MySQL mysqldump数据导出详解

    介绍 在日常维护工作当中经常会需要对数据进行导出操作,而mysqldump是导出数据过程中使用非常频繁的一个工具:它自带的功能参数非常多,文章中会列举出一些常用的操作,在文章末尾会将所有的参数详细说明 ...

  8. Mysql备份系列(3)--innobackupex备份mysql大数据(全量+增量)操作记录

    在日常的linux运维工作中,大数据量备份与还原,始终是个难点.关于mysql的备份和恢复,比较传统的是用mysqldump工具,今天这里推荐另一个备份工具innobackupex.innobacku ...

  9. MySQL mysqldump数据导出详解 --dump-slave 注意事项

    http://www.cnblogs.com/chenmh/p/5300370.html 介绍 在日常维护工作当中经常会需要对数据进行导出操作,而mysqldump是导出数据过程中使用非常频繁的一个工 ...

随机推荐

  1. “No module named context_processors”

    之前因为django国际化的问题在settings.py里面改了很多东西,国际化是好使了,但是今天要用站点管理admin的时候出!错!了! 我前天用的时候还好好的啊,我的models.py和admin ...

  2. 老男孩Python全栈开发(92天全)视频教程 自学笔记05

    day5课程内容: 集成开发环境(IDE) VIM #经典的Linux下的文本编辑器 Eclipse #Java IDE Visual Studio #微软开发的IDE notepad++ subli ...

  3. hihoCoder1319 岛屿周长 (bfs)

    思路:从给定坐标开始bfs,将所有联通点标记,然后把每个联通点的四个方向都判断一下,如果这个方向相邻的是一个非联通点说明需要把这条边实在最外围,即周长的一部分. AC代码 #include <s ...

  4. VNCServer,SSH Secure Shell Client,window远程控制linux

    1.VNC远程连接linux图形化桌面 2.SSH Secure Shell Client连接linux终端 3.设置FTP与linux传输文件 1.VNC远程连接linux图形化桌面 在centos ...

  5. 2_成员函数(Member Functions)

    成员函数以定从属于类,不能独立存在,这是它与普通函数的重要区别.所以我们在类定义体外定义成员函数的时候,必须在函数名之前冠以类名,如Date::isLeapYear().但如果在类定义体内定义成员函数 ...

  6. ORACLE 中NUMBER类型默认的精度和Scale问题

    在ORACLE数据库中,NUMBER(P,S)是最常见的数字类型,可以存放数据范围为10^-130~10^126(不包含此值),需要1~22字节(BYTE)不等的存储空间.P 是Precison的英文 ...

  7. NLP+语义分析(四)︱中文语义分析研究现状(CIPS2016、角色标注、篇章分析)

    摘录自:CIPS2016 中文信息处理报告<第二章 语义分析研究进展. 现状及趋势>P14 CIPS2016> 中文信息处理报告下载链接:http://cips-upload.bj. ...

  8. PaddlePaddle︱开发文档中学习情感分类(CNN、LSTM、双向LSTM)、语义角色标注

    PaddlePaddle出教程啦,教程一部分写的很详细,值得学习. 一期涉及新手入门.识别数字.图像分类.词向量.情感分析.语义角色标注.机器翻译.个性化推荐. 二期会有更多的图像内容. 随便,帮国产 ...

  9. mysql事务介绍

    什么是事务 一组sql语句操作单元组内所有sql完成一个业务如果整组成功,意味着组内的全部的sql成功如果其中任何一个失败,意味着整个操作失败 数据回到操作前的状态 事务的特点 1.多条sql语句组成 ...

  10. 复制粘贴之不带插件的jquery

    一.实现点击按钮,复制文本框中的的内容 <script type="text/javascript"> function copyUrl2() { var Url2=d ...