MemSQL、SQLFire、Oracle XE性能对比测试

1.软件版本

MemSQL 3.1

Pivotal SQLFire 1.1.2

Oracle 11g XE

2.测试环境

宿主机

OS:Windows 7 64位 专业版

CPU:i7-3770 3.4GHz

内存:16G

硬盘:大于800G

VMware虚拟机

OS:CentOS 6.3 64位

内存:16G

其中MemSQL运行于虚拟机,SQLFire和Oracle直接运行于宿主机

SQLFire只开启一个server member

3.DDL

MemSQL

DROP TABLE t_main;
DROP TABLE t_rel1;
DROP TABLE t_rel2;
DROP TABLE t_rel3;

create table t_main(
	rec_id BIGINT not null  PRIMARY KEY,
	c1 DOUBLE PRECISION,
	c2 BIGINT,
	c3 VARCHAR(100),
	c4 VARCHAR(100),
	c5 VARCHAR(100),
	c6 VARCHAR(100)

) ;

create table t_rel1(
	rec_id BIGINT not null  PRIMARY KEY,
	main_id BIGINT,
	c1 DOUBLE PRECISION,
	c2 BIGINT,
	c3 VARCHAR(100),
	c4 VARCHAR(100),
	c5 VARCHAR(100),
	c6 VARCHAR(100)

) ;

create table t_rel2(
	rec_id BIGINT not null  PRIMARY KEY,
	main_id BIGINT,
	c1 DOUBLE PRECISION,
	c2 BIGINT,
	c3 VARCHAR(100),
	c4 VARCHAR(100),
	c5 VARCHAR(100),
	c6 VARCHAR(100)

) ;

create table t_rel3(
	rec_id BIGINT not null  PRIMARY KEY,
	main_id BIGINT,
	c1 DOUBLE PRECISION,
	c2 BIGINT,
	c3 VARCHAR(100),
	c4 VARCHAR(100),
	c5 VARCHAR(100),
	c6 VARCHAR(100)

) ;

create index rel1main on t_rel1(main_id);
create index rel2main on t_rel2(main_id);
create index rel3main on t_rel3(main_id);

SQLFire

DROP TABLE t_main;
DROP TABLE t_rel1;
DROP TABLE t_rel2;
DROP TABLE t_rel3;

create table t_main(
	rec_id BIGINT not null  PRIMARY KEY,
	c1 DOUBLE PRECISION,
	c2 BIGINT,
	c3 VARCHAR(100),
	c4 VARCHAR(100),
	c5 VARCHAR(100),
	c6 VARCHAR(100)

) PERSISTENT;

create table t_rel1(
	rec_id BIGINT not null  PRIMARY KEY,
	main_id BIGINT,
	c1 DOUBLE PRECISION,
	c2 BIGINT,
	c3 VARCHAR(100),
	c4 VARCHAR(100),
	c5 VARCHAR(100),
	c6 VARCHAR(100)

) PERSISTENT;

create table t_rel2(
	rec_id BIGINT not null  PRIMARY KEY,
	main_id BIGINT,
	c1 DOUBLE PRECISION,
	c2 BIGINT,
	c3 VARCHAR(100),
	c4 VARCHAR(100),
	c5 VARCHAR(100),
	c6 VARCHAR(100)

) PERSISTENT;

create table t_rel3(
	rec_id BIGINT not null  PRIMARY KEY,
	main_id BIGINT,
	c1 DOUBLE PRECISION,
	c2 BIGINT,
	c3 VARCHAR(100),
	c4 VARCHAR(100),
	c5 VARCHAR(100),
	c6 VARCHAR(100)

) PERSISTENT;

create index rel1main on t_rel1(main_id);
create index rel2main on t_rel2(main_id);
create index rel3main on t_rel3(main_id);

Oracle

DROP TABLE t_main;
DROP TABLE t_rel1;
DROP TABLE t_rel2;
DROP TABLE t_rel3;

create table t_main(
	rec_id NUMBER(19,0) not null  PRIMARY KEY,
	c1 DOUBLE PRECISION,
	c2 NUMBER(19,0),
	c3 VARCHAR2(100),
	c4 VARCHAR2(100),
	c5 VARCHAR2(100),
	c6 VARCHAR2(100)

) ;

create table t_rel1(
	rec_id NUMBER(19,0) not null  PRIMARY KEY,
	main_id NUMBER(19,0),
	c1 DOUBLE PRECISION,
	c2 NUMBER(19,0),
	c3 VARCHAR2(100),
	c4 VARCHAR2(100),
	c5 VARCHAR2(100),
	c6 VARCHAR2(100)

) ;

create table t_rel2(
	rec_id NUMBER(19,0) not null  PRIMARY KEY,
	main_id NUMBER(19,0),
	c1 DOUBLE PRECISION,
	c2 NUMBER(19,0),
	c3 VARCHAR2(100),
	c4 VARCHAR2(100),
	c5 VARCHAR2(100),
	c6 VARCHAR2(100)

) ;

create table t_rel3(
	rec_id NUMBER(19,0) not null  PRIMARY KEY,
	main_id NUMBER(19,0),
	c1 DOUBLE PRECISION,
	c2 NUMBER(19,0),
	c3 VARCHAR2(100),
	c4 VARCHAR2(100),
	c5 VARCHAR2(100),
	c6 VARCHAR2(100)

) ;

create index rel1main on t_rel1(main_id);
create index rel2main on t_rel2(main_id);
create index rel3main on t_rel3(main_id);

 4.测试数据

4张表,每张100万条数据

生成数据的代码片段为

String sql = "insert into t_main(rec_id,c1,c2,c3,c4,c5,c6) values(?,?,?,?,?,?,?)";
		PreparedStatement st1 = conn.prepareStatement(sql);
		sql = "insert into t_rel1(rec_id,main_id,c1,c2,c3,c4,c5,c6) values(?,?,?,?,?,?,?,?)";
		PreparedStatement st2 = conn.prepareStatement(sql);
		sql = "insert into t_rel2(rec_id,main_id,c1,c2,c3,c4,c5,c6) values(?,?,?,?,?,?,?,?)";
		PreparedStatement st3 = conn.prepareStatement(sql);
		sql = "insert into t_rel3(rec_id,main_id,c1,c2,c3,c4,c5,c6) values(?,?,?,?,?,?,?,?)";
		PreparedStatement st4 = conn.prepareStatement(sql);

		long a = System.currentTimeMillis();

		for (int i = 1; i <= count; i++) {
			st1.setLong(1, i);
			st1.setDouble(2, i * 0.1);
			st1.setLong(3, i * 2);
			st1.setString(4, "c3_" + i);
			st1.setString(5, "c4_" + i);
			st1.setString(6, "c5_" + i);
			st1.setString(7, "c6_" + i);
			st1.executeUpdate();

			st2.setLong(1, i);
			st2.setLong(2, i);
			st2.setDouble(3, i * 0.2);
			st2.setLong(4, i * 3);
			st2.setString(5, "c3_" + i);
			st2.setString(6, "c4_" + i);
			st2.setString(7, "c5_" + i);
			st2.setString(8, "c6_" + i);
			st2.executeUpdate();

			st3.setLong(1, i);
			st3.setLong(2, i);
			st3.setDouble(3, i * 0.3);
			st3.setLong(4, i * 4);
			st3.setString(5, "c3_" + i);
			st3.setString(6, "c4_" + i);
			st3.setString(7, "c5_" + i);
			st3.setString(8, "c6_" + i);
			st3.executeUpdate();

			st4.setLong(1, i);
			st4.setLong(2, i);
			st4.setDouble(3, i * 0.4);
			st4.setLong(4, i * 5);
			st4.setString(5, "c3_" + i);
			st4.setString(6, "c4_" + i);
			st4.setString(7, "c5_" + i);
			st4.setString(8, "c6_" + i);
			st4.executeUpdate();

		}

5.测试结果

4张表,每张插入100万数据,消耗时间对比

单位:毫秒

MemSQL SQLFire Oracle
624765 196140 1289811

以下为查询测试,均执行10次求得平均消耗时间(不包含首次执行)

单位:毫秒

查询测试一:单表整型字段比较

select count(*) from t_main where c2>1000;
MemSQL SQLFire Oracle
21 675 58

查询测试二:单表like

select count(*) from t_main where c4 like '%c%';
MemSQL SQLFire Oracle
41 875 133

查询测试三:多表关联浮点数sum

select sum(m.c1+r1.c1+r2.c1+r3.c1) "rt" from t_main m,t_rel1 r1,t_rel2 r2,t_rel3 r3 where m.rec_id=r1.main_id and m.rec_id=r2.main_id and m.rec_id=r3.main_id;
MemSQL SQLFire Oracle
1365 14640 2077

查询测试四:多表关联整型sum

select sum(m.c2+r1.c2+r2.c2+r3.c2) "rt" from t_main m,t_rel1 r1,t_rel2 r2,t_rel3 r3 where m.rec_id=r1.main_id and m.rec_id=r2.main_id and m.rec_id=r3.main_id;
MemSQL SQLFire Oracle
1360 10257 2084

6.总结

测试过程中CPU、内存使用均未超过50%

插入性能SQLFire最高,MemSQL其次,Oracle最慢,MemSQL效率约是Oracle的两倍

查询性能MemSQL最高,Oracle其次,SQLFire最慢(慢的出奇。。。),MemSQL效率约是Oracle的两倍

不知道怎样的环境能测出30倍性能的提升。。。

时间: 2024-10-17 01:04:04

MemSQL、SQLFire、Oracle XE性能对比测试的相关文章

docker 实战---使用oracle xe作为开发数据库(六)

oracle作为oltp的大佬,很多行业应用都会用到它.那么在开发的过程中就不可避免的要使用oracle数据库,oracle数据库的版本有好多,其中express版本是免费的开发版,它的主要限制是数据库的大小最大1G,和一些性能的限制,所以拿来做开发还是比较合适的. 下面介绍下如何使用装了oracle的 docker容器来进行开发: 首先,介绍一下docker-oracle这个image,他是在ubuntu的基础上安装oracle xe版本来完成的. 它的docker file如下: FROM

免费数据库(SQLite、Berkeley DB、PostgreSQL、MySQL、Firebird、mSQL、MSDE、DB2 Express-C、Oracle XE)

SQLite数据库是中小站点CMS的最佳选择 SQLite 是一个类似Access的轻量级数据库系统,但是更小.更快.容量更大,并发更高.为什么说 SQLite 最适合做 CMS (内容管理系统)呢?并不是说其他数据库不好, Oracle.MySQL.SQLServer 也都是非常优秀的 DBS,只不过他们设计目标不同,特性不同,所以只有更适用某个应用场景,没有绝对的好坏之分. 我归纳的中小型站点的CMS的特点如下: 1.数据量不超过10万 2.日页面访问量不超过10万 3. 一部分网站全部生成

Oracle SQL性能优化

转载自:http://www.cnblogs.com/rootq/archive/2008/11/17/1334727.html (1)      选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.如果有3个以上的表连接查询, 那就需要选择交叉表(intersection ta

ubuntu 13.04 server安装Oracle XE 11G R2

一. 安装ubuntu 13.04 server 64位版本(最简安装即可),然后安装以下全部附件 #apt-get update #apt-get dist-upgrade#apt-get install automake autotools-dev binutils bzip2 doxygen elfutils expat gawk unzip#apt-get install gcc gcc-multilib g++-multilib ia32-libs ksh less lesstif2

[转]Oracle DB 性能视图和数据字典

动态性能视图 用于访问实例内存结构不断变化的状态信息. 在Oracle DB 中还维护着一个关于数据库实例操作和性能的动态数据集.这些动态性能视图以基于数据库服务器内部的内存结构构建的虚拟表为基础.也就是说,这些视图不是驻留在数据库中的传统意义上的表.这就是为什么部分视图在数据库装载或打开之前就能够使用的原因. 动态性能视图包含下列信息: ? 会话 ? 文件状态 ? 作业和任务的进度 ? 锁 ? 备份状态 ? 内存使用率和内存分配 ? 系统参数和会话参数 ?SQL 执行 ? 统计数据和度量 注:

oracle数据库性能影响之Sql parse

1,Sql parse的种类 Sql parse又通常分为硬解析和软解析,当sql第一次执行的时候,会发生硬解析,之后的执行如果在shared pool中能找到就是软解析.因此,为提高数据性能,尽可能的让每次执行的SQL在shared pool找到. 2,SQL在哪些情况下会发送硬解析? 1)统计信息改变  2)Sql中的表上有做ddl操作,包括grant和revoke. 3)执行计划被踢出shared pool 4)开启了trace 5)绑定变量长度变化 6)启用outlin

&lt;转&gt;Oracle SQL性能优化

原文链接:http://www.cnblogs.com/rootq/archive/2008/11/17/1334727.html (1)      选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.如果有3个以上的表连接查询, 那就需要选择交叉表(intersection t

Oracle数据库性能优化视频课程套餐(案例、实战、详细、全面)

套餐名称: Oracle数据库性能优化视频课程套餐(案例.实战.详细.全面) 套餐介绍: 风哥Oracle数据库性能优化培训套餐(案例.实战.详细.全面),包括内容: Oracle性能优化之执行计划管理.统计信息管理.性能诊断工具.性能跟踪工具.分区表管理.资源管理.操作系统工具.性能调整.物化视图.JOB自动任务管理等,套餐涉及10套课程,60个小时的课程,大量的案例. 套餐地址: http://edu.51cto.com/pack/view/id-974.html

怎么样做好oracle数据库性能优化,包含哪些内容?

名称: 数据库可靠性服务(性能调优.性能诊断) 定义: 此服务指对用户的数据库进行性能方面的分析.评估.调整,以提高数据库系统的整体性能. 客户收益: 1.尽早发现性能瓶颈,及时调整,保障数据库稳定高效工作 2.根据客户业务特点,调整数据库配置,使数据库性能最优 3.保障系统业务数据的安全. 4.提升客户业务能力. 工作内容: 1.对数据库信息进行收集. 2.查找引起数据库性能下降的各种原因,制订解决方案 3.根据客户业务特点及数据库状态,制定数据库调优方案 4.在业务允许的情况下,对系统做好备