使用TPC-H测试oracle&infobright&postgresql的性能

来源:互联网 发布:sql server 连接查询 编辑:程序博客网 时间:2024/05/23 00:42
  • 下载tpch压缩包
http://www.tpc.org/tpch/
此网页的右中间有
  • DBGEN & Reference Data Set zip (23 MB)
  • 上传至linux并解压
[root@dn210120 software]# unzip tpch_2_14_3.zip
  •  重命名makfile.suite为makefile并修改其中的内容
[root@dn210120 software]# cd dbgen/[root@dn210120 dbgen]# cp makefile.suite makefile[root@dn210120 dbgen]# vim makefile
修改成如下脚本:
################## CHANGE NAME OF ANSI COMPILER HERE################CC      = gcc# Current values for DATABASE are: INFORMIX, DB2, TDAT (Teradata)#                                  SQLSERVER, SYBASE, ORACLE, VECTORWISE# Current values for MACHINE are:  ATT, DOS, HP, IBM, ICL, MVS, #                                  SGI, SUN, U2200, VMS, LINUX, WIN32 # Current values for WORKLOAD are:  TPCHDATABASE= MYSQLMACHINE = LINUXWORKLOAD = TPCH
  • 增加mysql的脚本支持
[root@dn210120 dbgen]# vim tpcd.h
增加如下脚本:
#ifdef MYSQL#define GEN_QUERY_PLAN  ""#define START_TRAN      "START TRANSACTION"#define END_TRAN        "COMMIT"#define SET_OUTPUT      ""#define SET_ROWCOUNT    "limit %d;\n"#define SET_DBASE       "use %s;\n"#endif
  • 编译tpch
[root@dn210120 dbgen]# make
会多了很多*.o文件,生成了dbgen和qgen可执行文件,生成了dss.ddl和dss.ri文件
  • 生成数据脚本
[root@dn210120 dbgen]# ./dbgen -s 1
可通过查看README来了解其用法
  • 修改dss.ddl和dss.ri文件
[root@dn210120 dbgen]# cat dss.ddl | tr A-Z a-z > dss-lower.ddl
[root@dn210120 dbgen]# cat dss.ri |tr A-Z a-z > dss-lower.ri[root@dn210120 dbgen]# sed -i "s/tpcd./tpch./g" dss-lower.ri[root@dn210120 dbgen]# sed -i "s/commit work/--commit work/g" dss-lower.ri[root@dn210120 dbgen]# sed -i "s/connect to tpch/--connect to tpch/g" dss-lower.ri
大小写转换、文本内容替换
  • 创建数据库tpch
mysql> create database tpch;Query OK, 1 row affected (0.00 sec)
  • 创建用户tpch
mysql> create user 'tpch'@'%' identified by 'tpch';Query OK, 0 rows affected (0.00 sec)
  • 赋予用户tpch权限
mysql> grant all on tpch.* to 'tpch'@'%';Query OK, 0 rows affected (0.00 sec)
  • 切换至数据库tpch并执行dss-lower.ddl 以便创建表
mysql> use tpch;Database changedmysql> \. ~/software/dbgen/dss-lower.ddlQuery OK, 0 rows affected (0.02 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.02 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.01 sec)Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.01 sec)Query OK, 0 rows affected (0.00 sec)mysql> show tables;+----------------+| Tables_in_tpch |+----------------+| customer       || lineitem       || nation         || orders         || part           || partsupp       || region         || supplier       |+----------------+8 rows in set (0.00 sec)


  • 在数据库tpch下导入数据
mysql> LOAD DATA LOCAL INFILE '~/software/dbgen/customer.tbl' INTO TABLE customer FIELDS TERMINATED BY '|';Query OK, 150000 rows affected (1.76 sec)Records: 150000  Deleted: 0  Skipped: 0  Warnings: 0mysql> LOAD DATA LOCAL INFILE '~/software/dbgen/lineitem.tbl' INTO TABLE lineitem FIELDS TERMINATED BY '|';Query OK, 6001215 rows affected (1 min 12.30 sec)Records: 6001215  Deleted: 0  Skipped: 0  Warnings: 0mysql> LOAD DATA LOCAL INFILE '~/software/dbgen/nation.tbl' INTO TABLE nation FIELDS TERMINATED BY '|';Query OK, 25 rows affected (0.00 sec)Records: 25  Deleted: 0  Skipped: 0  Warnings: 0mysql> LOAD DATA LOCAL INFILE '~/software/dbgen/orders.tbl' INTO TABLE orders FIELDS TERMINATED BY '|';Query OK, 1500000 rows affected (14.87 sec)Records: 1500000  Deleted: 0  Skipped: 0  Warnings: 0mysql> LOAD DATA LOCAL INFILE '~/software/dbgen/part.tbl' INTO TABLE part FIELDS TERMINATED BY '|';Query OK, 200000 rows affected (2.31 sec)Records: 200000  Deleted: 0  Skipped: 0  Warnings: 0mysql> LOAD DATA LOCAL INFILE '~/software/dbgen/partsupp.tbl' INTO TABLE partsupp FIELDS TERMINATED BY '|';Query OK, 800000 rows affected (8.26 sec)Records: 800000  Deleted: 0  Skipped: 0  Warnings: 0mysql> LOAD DATA LOCAL INFILE '~/software/dbgen/region.tbl' INTO TABLE region FIELDS TERMINATED BY '|';Query OK, 5 rows affected (0.01 sec)Records: 5  Deleted: 0  Skipped: 0  Warnings: 0mysql> LOAD DATA LOCAL INFILE '~/software/dbgen/supplier.tbl' INTO TABLE supplier FIELDS TERMINATED BY '|';Query OK, 10000 rows affected (0.15 sec)Records: 10000  Deleted: 0  Skipped: 0  Warnings: 0


  • 修改dss-lower.ri以致于匹配到mysql的语法标准
注意mysql的注释:--后要空格1.注释掉:commit work;2.注释掉:connect to tpch;
add foreign key nation_fk1 (n_regionkey) references tpch.region;=>add foreign key nation_fk1 (n_regionkey) references tpch.region(r_regionkey);
add foreign key supplier_fk1 (s_nationkey) references tpch.nation;=>add foreign key supplier_fk1 (s_nationkey) references tpch.nation(n_nationkey);
add foreign key customer_fk1 (c_nationkey) references tpch.nation;=>add foreign key customer_fk1 (c_nationkey) references tpch.nation(n_nationkey);
add foreign key partsupp_fk1 (ps_suppkey) references tpch.supplier; =>add foreign key partsupp_fk1 (ps_suppkey) references tpch.supplier(s_suppkey);
add foreign key partsupp_fk2 (ps_partkey) references tpch.part;=>add foreign key partsupp_fk2 (ps_partkey) references tpch.part(p_partkey);
add foreign key orders_fk1 (o_custkey) references tpch.customer;=>add foreign key orders_fk1 (o_custkey) references tpch.customer(c_custkey);
add foreign key lineitem_fk1 (l_orderkey)  references tpch.orders;=>add foreign key lineitem_fk1 (l_orderkey)  references tpch.orders(o_orderkey);
add foreign key lineitem_fk2 (l_partkey,l_suppkey) references        tpch.partsupp;=>add foreign key lineitem_fk2 (l_partkey,l_suppkey) references        tpch.partsupp(ps_partkey,ps_suppkey);
注意:一旦表中的数据依赖关系不全时,建立外键索引会报错
  • 在数据库tpch下执行dss-lower.ri 以便建立表之间的关联关系
mysql> use tpch;Database changedmysql> \. ~/software/dbgen/dss-lower.ri

先插入数据再建索引,效率高
  • 获取22条查询语句
[root@dn210120 dbgen]# cp ./queries*.sql ./[root@dn210120 dbgen]# ./qgen -s 1 > query.sql
  • 修改query.sql中的sql
##去除 ^M 字符[root@dn210120 queries]# cat tpch_query.sql | col -b > tpch_query_new.sql
:%s/;\nlimit/ limit/g:%s/limit -1/limit 1/g:wq
##将 (3) 去除l_shipdate <= date '1998-12-01' - interval '77' day (3)
count(o_orderkey)=>count(o_orderkey) as c_count
) as c_orders (c_custkey, c_count)=>) as c_orders
drop view revenue0 limit 1;=>drop view revenue0;
  • 将每条sql语句单独以文件保存
脚本执行测试有如下方法:
  1. 自行开发测试工具
  2. 研究tpchDriver测试工具
  3. 结合shell脚本,手工执行脚本进行测试统计
测试使用到的软件:
  1. jmeter
  2. nmon/ganglia
  3. tpch(dbgen、qgen)
  4. oracle11.0.2
  5. infobright 4.5
  6. postgresql 9.3
测试维度:
  1. 单用户
  2. 多用户
  3. 数据量级(1GB、10GB、30GB、100GB、300GB、1000GB)
测试方法:
  1. 搭建数据库
  2. 创建表
  3. 导入数据
  4. 建立索引
  5. 单步顺序执行22条sql+2条dml
  6. 获取单步执行响应时间
  7. 并发执行随机选取的N条sql
  8. 获取并发执行响应时间
  9. 格式化nmon数据形成折线图或者直接使用ganglia进行查阅历史消耗资源情况
测试中用到的命令:
  • oracle
sqlloader略
  • infobright
mysql -h172.*.*.* -P5029 --local-infile=1 -utpch -ptpch tpch

LOAD DATA LOCAL INFILE '/data/wonhigh/data_scale/1/customer.tbl' INTO TABLE CUSTOMER FIELDS TERMINATED BY '|';
LOAD DATA LOCAL INFILE '/data/wonhigh/data_scale/1/orders.tbl'   INTO TABLE ORDERS   FIELDS TERMINATED BY '|';
LOAD DATA LOCAL INFILE '/data/wonhigh/data_scale/1/lineitem.tbl' INTO TABLE LINEITEM FIELDS TERMINATED BY '|';
LOAD DATA LOCAL INFILE '/data/wonhigh/data_scale/1/nation.tbl'   INTO TABLE NATION   FIELDS TERMINATED BY '|';
LOAD DATA LOCAL INFILE '/data/wonhigh/data_scale/1/partsupp.tbl' INTO TABLE PARTSUPP FIELDS TERMINATED BY '|';
LOAD DATA LOCAL INFILE '/data/wonhigh/data_scale/1/part.tbl'     INTO TABLE PART     FIELDS TERMINATED BY '|';
LOAD DATA LOCAL INFILE '/data/wonhigh/data_scale/1/region.tbl'   INTO TABLE REGION   FIELDS TERMINATED BY '|';
LOAD DATA LOCAL INFILE '/data/wonhigh/data_scale/1/supplier.tbl' INTO TABLE SUPPLIER FIELDS TERMINATED BY '|';
  • postgresql
time psql -h172.17.209.102 -Utpch -c "COPY nation   FROM stdin WITH (FORMAT csv, DELIMITER '|')" < /data/wonhigh/data_scale/1/nation.tbl
time psql -h172.17.209.102 -Utpch -c "COPY region   FROM stdin WITH (FORMAT csv, DELIMITER '|')" < /data/wonhigh/data_scale/1/region.tbl
time psql -h172.17.209.102 -Utpch -c "COPY part     FROM stdin WITH (FORMAT csv, DELIMITER '|')" < /data/wonhigh/data_scale/1/part.tbl
time psql -h172.17.209.102 -Utpch -c "COPY supplier FROM stdin WITH (FORMAT csv, DELIMITER '|')" < /data/wonhigh/data_scale/1/supplier.tbl
time psql -h172.17.209.102 -Utpch -c "COPY partsupp FROM stdin WITH (FORMAT csv, DELIMITER '|')" < /data/wonhigh/data_scale/1/partsupp.tbl
time psql -h172.17.209.102 -Utpch -c "COPY customer FROM stdin WITH (FORMAT csv, DELIMITER '|')" < /data/wonhigh/data_scale/1/customer.tbl
time psql -h172.17.209.102 -Utpch -c "COPY orders   FROM stdin WITH (FORMAT csv, DELIMITER '|')" < /data/wonhigh/data_scale/1/orders.tbl
time psql -h172.17.209.102 -Utpch -c "COPY lineitem FROM stdin WITH (FORMAT csv, DELIMITER '|')" < /data/wonhigh/data_scale/1/lineitem.tbl
测试报告:
  • 响应时间上
oracle的响应时间是三者中最快的,postgresql稍微略胜infobright
  • 资源消耗上
oracle的在cpu、内存、IO上的使用没有太大的波动
infobright在cpu、IO上消耗波动比较大,内存的消耗上稍微小于postgresql
postgresql在大数据量时容易吃爆内存
0 0
原创粉丝点击