How to get tbl from TPCH?——数据库学习初探

 本人新博 http://zhipeng.sinaapp.com/


本文写给完全不懂LINUX和TPCH的初学者,大牛请绕道,砖家勿喷!版权归作者所有,欢迎转载,如有雷同,荣幸之至!

     PS:本人为中大软院学生,无意透漏作业,仅供分享。


How to get tbl from TPCH?

                                  Copyleft By CzpTheGreat

 

1、            TPCH概览

 

TPCH严格来说应该是TPC-H,加一杠表示它是TPC系列的一个版本。

 

TPC全称为“事务处理性能委员会”(Transaction Processing Performance Council),主页(http://www.tpc.org/),是由数10家会员公司创建的非盈利组织,总部设在美国。TPC的成员主要是计算机软硬件厂家,而非计算机用户,它的功能是制定商务应用基准程序(Benchmark)的标准规范、性能和价格度量,并管理测试结果的发布。

 

我们实验用到的“TPCH_2_14_0”就是用来进行数据库测试的一个基准(benchmark)。说通俗一点,就是一堆数据的集合,用来进行数据库学习和测试———对学生来说,就是给一堆数据给你学习怎么用现成的数据库;对于专家来说,就是用来测试新的数据库系统的性能。

 

2、             如何生成测试数据?

 

我们拿到的TPCH_2_14_0解压后有2个文件夹,分别是dbgenref_data。其中dbgen是(Databasepopulationgenerator),就是“数据库样本生成器”,ref_data是这个程序所要引用的一些元数据(怀疑是通过这些数据的排列组合生成各种数据项)。

 

仔细看dbgen文件夹,发现里面是一大堆.h文件和.c文件。OH MY GOD!为什么这个神马协会不给我们一个现成的软件???这是为神马???

 

好吧,刚刚说了,那个协会只给我们基准,但是并不强制我们使用任何平台和工具。所以,他给我们这些头文件,是希望我们通过编译和链接这些代码,生成可在我们平台下执行的程序。(Why not .exe?好吧,理论上linux是不能直接运行.exe的。)

 

既然如此,那我们第一步就要选择平台和工具?

我的选择(被选择)是:UBUNTU 10.4 + GCC

 

选择了下面平台以后,我们就开始吧!

 

1What’s a makefile and why makefile?

Answer:What’s a makfile is why makefile.

看到了一大堆头文件和c文件,大家头疼不头疼?我们知道,在linux下面,可以在命令行输入“gcc –chello.c hello”来吧hello.c编译成可执行的hello。但是,在大工程里面,我们当然希望这些链接啊编译啊可以交给电脑自动去完成,在WIN下面有IDE,在Linux下面我们有makefile

 

一句话,makefile就是实现“自动化编译”。它相当于一个脚本(脚本就是照念命令的一种家伙,我们写好脚本,它到时间就给我们下命令),给我们自动向其他程序(shell)输入“gcc –c hello.c hello”。更多内容见:http://baike.baidu.com/view/974566.htm

2)使用makefile去编译dbgen

记住,下面讲的dbgen都是可执行程序,大家可以把他理解为dbgen.execution,不是WINexe,但是他也基本一样。

 

如果要我们自己去写一个makefile,那TPC不是太给用户找麻烦了嘛?大家会不会说,坑爹啊!!!所以它已经给我们写好了一个makefile.suite,我们只需要改一下里面的参数,然后把文件名改为“makefile”就可以了。

具体改的参数有:

cc = gcc

……

DATABASE = SQLSERVER

MACHINE = LINUX

WORKLOAD = TPCH

 

改完以后,就把他保存为makefile。然后在命令行进入dbgen的目录下,输入“make”就可以调用make解释器去执行你修改后的makefile了。执行截图如下:


3)运行dbgen来生产tbl文件。

上面已经说过,执行makefile以后,系统会自动帮我们把那堆.h.c文件编译和链接。执行完了后,你可以在dbgen文件夹里面看到多出来的.o文件(OBJ)和dbgenqgen两个可执行文件。这个时候,还是在当前路径下,输入“./dbgen –s1 –f –TL”,就可以运行dbgen来生成我们需要的tbl文件啦。

./”是一个路径,“./dbgen”表示在当前路径下执行dbgen,其后是参数。参数的具体意义请看readme。简单来说,我们可以替换的参数有(1-s后面的数字,1代表生产1倍的数据(即1G);(2-f表示强制覆盖已存在的同名文件;(3-T后面跟的字母代表生成那张表,例如-TL生成lineitem.tbl-TP生成part.tbl


4)至此,生产数据的工作就告结束了。

 

 

 

3、            导入数据错误与换行符

生成的.tbl文件,在linux下面打开非常的漂亮,使用也没问题。但是在win下面就悲剧了。比如我使用MS SQ SERVER 2008,建表后想导入tbl数据,就会遇到错误,错误信息大致是,“XXX行过长”。

 

对平台差异比较清楚的同学知道,三大主流平台的换行符都是不一样的,printf(“\n”);

3个平台都可以编译,运行也都是换行。但是如果把输出记录到文件,就会出错了。因为三个平台的对换行的认定分别是:

       win:“/r/n”,0x0D0A;

linux:“/n”,0x0A;

mac:"/r",0x0D;

具体区别请自行百度,这里只说明解决办法。

在WIN+MS SQL SERVER下,可以下面的语句导入数据表:

usedatabase_name

BULKINSERttable_name /* 大容量插入 ==导入 */

FROM'D:TPCH/lineitem.tbl' /*从右边的路径导入 */

WITH /*以何种格式导入 */

(

  FIELDTERMINATOR='|',/*域终止符 ==属性项终止符 */

  ROWTERMINATOR='|\n'/* 列终止符 */

)

       从上面可知,既然对与换行大家各有各理解,那我们用一个不会与数据冲突的符号作为换行符即可。这个时候,我们TA建议用“*”号。先给出我想到的最解决方案,想知道思考过程的见下文。

 

     解决方案:在解压TPCH_2_14_0之后,在dbgen的文件夹中找到dss.h,把其中的第481行的fprint(fp,”/n”)中的’/n’改为’*’,然后保存。其他过程不变。

 

方案解释:

A)我们观察dbgen文件夹,知道他是一个可以生成文件的程序,这必然要涉及到文件的写操作例如fprintf()或者fwrite(),刚刚好其中有一个print..c文件。打开后发现,这段代码的作用是对生成的数据进行格式化,然后把这些数据写入文件。其中,多个函数pr_order()pr_part()等函数都在结尾用到PR_END()。显然,PRprint的缩写,所以我们可以认为是PR_END()控制的换行。


B)在这个文件中,搜一下PE_END发现并不是在.c文件中实现的。这个时候,我们应该到哪里找呢?永远不要忘了include。回到print.c的开头,忽略那些引用的系统库,目标锁定为“dss.h”和”dsstype.h”


C) 到“dss.h”和“dsstype.h”两个文件一搜索“PR_END”,发现在“dss,h”中宏定义了PR_END()。不用犹豫了,赶紧的把本行的“\n”改为“*”,重新用makefile来编译和链接,然后运行dbgen,发现所有的换行符都改为“*”了,大功告成!


 

 

 

感谢教我们C语言的李文军教授!

感谢教我们DB的冯剑琳教授!!

感谢TA姐姐提供的“*”!!!

感谢EMACS!!!


本人新博 http://zhipeng.sinaapp.com/


 

 

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值