⽤TPC-DS测试Sqlserver,Oracle
TPC-DS是什么
TPC-DS是TPC组织发布的⽤于测试决策系统的基准测试,是TPC-H的改进版。我们可以⽤它⽣成测试数据集和sql语句来测试数据库的OLAP能⼒。
最近我们⽤TPC-DS测试了⼀下Sql server和Oracle,这⾥把遇到的问题记录⼀下。⾸先说⼀下结论,我以后再不相信TPC的测试结果了,这个软件给我的感觉是根本没⼈维护,⽂档散乱⽆序,体验糟糕⾄极。
TPC-DS的使⽤
下载2.11版本后,在tools⾥⾯有个How_To_Guide-DS-V2.0.0.docx,照着做就可以,但是有⼏个问题需要注意⼀下
1. 使⽤dsdgen命令产⽣数据时,需要设置-TERMINATE n选项不在每⼀⾏末尾⽣成分隔符,否则会⽣成类似下⾯末尾有换⾏符的数
据,⽆法通过Sql server的bulk insert导⼊——为什么默认要在末尾加分隔符呢?想不明⽩。
1|0|10000|
2|10001|20000|
3|20001|30000|
4|30001|40000|
2. 使⽤dsqgen命令产⽣sql语句时,要在query_templates⽬录下sqlserver.tpl,oracle.tpl,添加define _END=""。哥,你倒是给个
默认值啊。
⾃动⽣成导⼊语句
TPC-DS tools⾥⾯有个tpcds.sql,内容是创建测试数据库的sql语句。例如
create table catalog_page
(
cp_catalog_page_sk integer not null,
cp_catalog_page_id char(16) not null,
cp_start_date_sk integer ,
cp_end_date_sk integer ,
cp_department varchar(50) ,
cp_catalog_number integer ,
cp_catalog_page_number integer ,
cp_description varchar(100) ,
cp_type varchar(100) ,
primary key (cp_catalog_page_sk)
);
create table inventory
(
inv_date_sk integer not null,
inv_item_sk integer not null,
inv_warehouse_sk integer not null,
inv_quantity_on_hand integer ,
primary key (inv_date_sk, inv_item_sk, inv_warehouse_sk)
);
它⼀共创建了25个表,这个25个表需要我们⼀个⼀个把数据导进去么?我们可以解析这个⽂件,⾃动⽣成导⼊的语句——python⼤法
好
Sql server的导⼊
dsdgen⽣成的⽂本⽂件是linux换⾏符,使⽤Sql server的bulk insert导⼊时,指定了rowterminator='\n'也没有成功,后来发现需要使⽤rowterminator='0x0a'。呵呵。
例如
bulk insert call_center from 'C:\data\call_center.dat' with (fieldterminator='|',rowterminator='0x0a',batch_size=1000);
使⽤如下语句可以马上⽣成所有的bulk insert
#!/usr/bin/env python
import os
with open("/opt/share/tpc/v2.11.0rc2/tools/tpcds.sql") as ddl:
for line in ddl:
if line.startswith('--'):
continue
if line.startswith('create table'):
table = place("\n","").split(" ")[2]
print("bulk insert %s from 'G:\%s' with (fieldterminator='|',rowterminator='0x0a',batchsize=1000);" %(table,table))
Oracle的导⼊
Oracle的情况⽐较复杂,它的导⼊⼯具是sqlldr,需要为每⼀个表⽣成⼀个control file,内容如下
load data
infile "G:\income_band.dat"
INTO TABLE income_band
truncate
fields terminated by '|'
(
ib_income_band_sk,
ib_lower_bound,
ib_upper_bound
)
问题是居然要把column显式的写出来——你TM是在逗我?我会⾃⼰复制粘贴?所以可以使⽤如下python脚本⽣成⼀堆control⽂件。注意,TPC-DS⽣成的⽇期是"YYYY-MM-DD"格式,需要显式的指定。显然,Oracle默认不是"YYYY-MM-DD"这种格式。。。
#!/usr/bin/env python
import os
with open("/opt/share/tpc/v2.11.0rc2/tools/tpcds.sql") as ddl: for line in ddl:
if line.startswith('--'):
continue
if line.startswith('create table'):
table = place("\n","").split(" ")[2]
fieldList=[]
controlFile = open("%s.txt"%table,"w")
controlFile.write(("""\
load data
infile "G:\%s.dat"
INTO TABLE %s
truncate
fields terminated by '|'
(
"""% (table,table)).replace("\n","\r\n"))
if line.startswith(');'):
controlFile.write(",\r\n".join(fieldList))
controlFile.write("\r\n)\r\n")
controlFile.close()
dswith(',\n'):
field = line.split()[0]
type = line.split()[1]
if 'date' in type:
fieldList.append('%s DATE "YYYY-MM-DD"' % field)
elif 'time' in type:
fieldList.append('%s DATE "hh24:mi:ss"' % field)
oracle decimal类型else:
fieldList.append(field)
这个脚本会将tpcds.sql⽂件中的
create table item
(
i_item_sk integer not null,
i_item_id char(16) not null,
i_rec_start_date date ,
i_rec_end_date date ,
i_item_desc varchar(200) ,
i_current_price decimal(7,2) ,
i_wholesale_cost decimal(7,2) ,
i_brand_id integer ,
i_brand char(50) ,
i_class_id integer ,
i_class char(50) ,
i_category_id integer ,
i_category char(50) ,
i_manufact_id integer ,
i_manufact char(50) ,
i_size char(20) ,
i_formulation char(20) ,
i_color char(20) ,
i_units char(10) ,
i_container char(10) ,
i_manager_id integer ,
i_product_name char(50) ,
primary key (i_item_sk)
);
⽣成为
load data
infile "G:\item.dat"
INTO TABLE item
truncate
fields terminated by '|'
(
i_item_sk,
i_item_id,
i_rec_start_date DATE "YYYY-MM-DD", i_rec_end_date DATE "YYYY-MM-DD", i_item_desc,
i_current_price,
i_wholesale_cost,
i_brand_id,
i_brand,
i_class_id,
i_class,
i_category_id,
i_category,
i_manufact_id,
i_manufact,
i_size,
i_formulation,
i_color,
i_units,
i_container,
i_manager_id,
i_product_name
)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论