當前位置:
首頁 > 知識 > 用TPC-DS測試Sql server,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

)

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 千鋒JAVA開發學院 的精彩文章:

深入淺析zookeeper的一致性模型及其實現
面試題殺手鐧:CopyOnWrite思想

TAG:千鋒JAVA開發學院 |