tpc ds 导入到oracle,用TPC-DS测试Sql server,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,照着做就可以,但是有几个问题需要注意一下
使用dsdgen命令产生数据时,需要设置-TERMINATE n选项不在每一行末尾生成分隔符,否则会生成类似下面末尾有换行符的数据,无法通过Sql server的bulk insert导入——为什么默认要在末尾加分隔符呢?想不明白。
1|0|10000|
2|10001|20000|
3|20001|30000|
4|30001|40000|
使用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 = line.replace("\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 = line.replace("\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()
if line.endswith(',\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)
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)
);
生成为item.txt
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
)
tpc ds 导入到oracle,用TPC-DS测试Sql server,Oracle相关推荐
- 把Oracle数据库移植到Microsoft SQL Server 7 0
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 把Ora ...
- SQL Server,Oracle,DB2索引建立语句的对比
http://database.51cto.com/art/201108/284540.htm SQL Server,Oracle,DB2索引建立语句的对比 2011-08-17 20:48 henr ...
- sql oracle 自增长字段,在Oracle、MySQL、MS SQL Server中创设自动增长字段
在Oracle.MySQL.MS SQL Server中创建自动增长字段 好吧,今天面试有道题,要各个数据库怎么建立自增长字段,顺便复习一下吧,最近面试很多数据库问题... 一:Oracle Orac ...
- oracle数据库访问sqlserver2008,透过SQL Server 2008访问Oracle 10g的配置方法
之前写过一篇关于SQL Server 访问MySQL数据库的文章,最近正好又遇到需要访问Oracle 的情况,将配置过程记录下来也供大家参考. 准备工作 事先在需要访问Oracle 数据库的主机上完成 ...
- oracle sql为null值,在SQL Server Oracle MySQL当数据库中查出某值为NULL怎么办
在SQL Server Oracle MySQL当数据库中查出某值为NULL怎么办? 1.MSSQL: ISNULL() 语法 ISNULL ( check_expression , replacem ...
- oracle rds 运维服务_从运维的角度分析使用阿里云数据库RDS的必要性–你不应该在阿里云上使用自建的MySQL/SQL Server/Oracle/PostgreSQL数据库...
开宗明义,你不应该在阿里云上使用自建的MySQL or SQL Server数据库,对了,还有Oracle or PostgreSQL数据库. 云数据库 RDS(Relational Database ...
- sql oraoledb.oracle,无法创建链接服务器XXXXX的 OLE DB 访问接口OraOLEDB.Oracle的实例。 (Microsoft SQL Server,错误7302)...
无法创建链接服务器"XXXXX"的 OLE DB 访问接口"OraOLEDB.Oracle"的实例. (Microsoft SQL Server,错误: 730 ...
- VB连接Sql Server,Oracle,SyBase,Access数据库操作实例
- VB连接数据库是常用的操作 对于小型数据的存取是非常不错的.在设计时 对于不同数据的连接方式都不同 这里使用了ADODB连接字符串的方式来访问常见的数据库:Sql Server,Oracle,Sy ...
- oracle sql 导入mysql数据库备份_使用PL/SQL连接oracle数据库,并将数据进行导出备份和导入恢复...
使用PL/SQL连接oracle数据库,并将数据进行导出备份和导入恢复 这种操作百度一搜一大片,今天整理以前做的项目时自己备份了一下数据库,试着将数据进行导出备份和导入恢复了一下:下面是操作过程: 1 ...
最新文章
- C#中的委托和事件 (7)---总结
- php中pre标签,html中pre标签与code标签的作用与用法
- python 函数参数_python之函数(二)——函数参数详解
- 04.卷积神经网络 W3.目标检测(作业:自动驾驶 - 汽车检测)
- Linux基础学习六:Nginx的使用教程
- 暑假集训 || 网络流
- 用DELPHI为ASP开发文件上载组件
- 汽车用组合仪表设计规范
- 视频去水印安卓 抖音上热门小技巧
- 电脑开机自检怎么取消
- 服务器被攻击显示,怎么查看服务器被攻击
- 北京超级云计算中心操作训练指南
- 增强现实将为我们展示美好的未来还是使我们盲目
- JAVA判断数字是否在指定开闭区间内
- LTU、TTU、DTU、FTU、RTU在电路中的安装位置,功能,区别
- 学习java随堂练习-20220614
- html屏幕滚动事件监听,JQuery监听页面滚动事件
- word字号 html,word排版一般字号用的字号是多少
- Charles安装以及环境搭建
- CRUX 2.2 安装及bootloader配置