本人新博 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个文件夹,分别是dbgen和ref_data。其中dbgen是(Databasepopulationgenerator),就是“数据库样本生成器”,ref_data是这个程序所要引用的一些元数据(怀疑是通过这些数据的排列组合生成各种数据项)。
仔细看dbgen文件夹,发现里面是一大堆.h文件和.c文件。OH MY GOD!为什么这个神马协会不给我们一个现成的软件???这是为神马???
好吧,刚刚说了,那个协会只给我们基准,但是并不强制我们使用任何平台和工具。所以,他给我们这些头文件,是希望我们通过编译和链接这些代码,生成可在我们平台下执行的程序。(Why not .exe?好吧,理论上linux是不能直接运行.exe的。)
既然如此,那我们第一步就要选择平台和工具?
我的选择(被选择)是:UBUNTU 10.4 + GCC。
选择了下面平台以后,我们就开始吧!
1)What’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,不是WIN的exe,但是他也基本一样。
如果要我们自己去写一个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)和dbgen、qgen两个可执行文件。这个时候,还是在当前路径下,输入“./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()。显然,PR是print的缩写,所以我们可以认为是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/