前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用TPC-DS测试Sql server,Oracle

用TPC-DS测试Sql server,Oracle

作者头像
大神带我来搬砖
发布2019-05-17 14:25:41
1.3K0
发布2019-05-17 14:25:41
举报

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导入——为什么默认要在末尾加分隔符呢?想不明白。
代码语言:javascript
复制
1|0|10000|
2|10001|20000|
3|20001|30000|
4|30001|40000|
  1. 使用dsqgen命令产生sql语句时,要在query_templates目录下sqlserver.tpl,oracle.tpl,添加define _END=""。哥,你倒是给个默认值啊。

自动生成导入语句

TPC-DS tools里面有个tpcds.sql,内容是创建测试数据库的sql语句。例如

代码语言:javascript
复制
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'。呵呵。

例如

代码语言:javascript
复制
bulk insert call_center from 'C:\data\call_center.dat' with (fieldterminator='|',rowterminator='0x0a',batch_size=1000);

使用如下语句可以马上生成所有的bulk insert

代码语言:javascript
复制
#!/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,内容如下

代码语言:javascript
复制
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"这种格式。。。

代码语言:javascript
复制
#!/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文件中的

代码语言:javascript
复制
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

代码语言:javascript
复制
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
)
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.05.16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • TPC-DS是什么
  • TPC-DS的使用
  • 自动生成导入语句
  • Sql server的导入
  • Oracle的导入
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档