日期:2014-05-16 浏览次数:20459 次
版本
2008年8月21日,完成测试1的Oracle_Win、Mysql_Li、Mysql _Win、MSSQL部分。
2008年8月22日,完成测试2的Oracle_Win、Mysql_Li、Mysql _Win、MSSQL部分。
2008年8月23日,文档整理。
2008年8月25日,完成postgresql linux版本的测试1、测试2。
2008年8月27日,完成postgresql windows版本的测试1、测试2。
1.背景
这不是数据库性能的综合测试,这里只测试插入,并且是用JDBC插入。这是针对某种应用的某模块的简单模拟,不可能适用所有的情况。
假设系统的基本情况是,有后台线程要不停的读取数据,并写入流水表,写入以后就不会update。没有人使用系统的时候,就没有查询,偶尔才会有人来使用。查询的时候,因为数据量比较大,性能优化也是一个重要的问题,但不在本文讨论范围之内。
本文还没有完成,测试3还没有进行,并缺少Oracle Linux版本和PostgreSQL的数据。计划将来补上。
2.测试方法
测试1,简单表测试
建立3个一模一样的小表,只有3个数字类型的字段,一个主键,没有另外建索引。对不同的数据库执行以下测试:
A.用1个线程写一个表
B.用2个线程同时写2个不同的表
C.用2个线程写同一个表
D.用3个线程同时写3个不同的表
E.用3个线程写同一个表
每50条为一批进行批量操作,每5秒进行一次采样,稳定运行一段时间以后,取每秒插入的数据条数进行比较。用多个线程并发进行操作可以检查对双核CPU的利用效果。
测试2,普通表测试
与测试1相同,但是表不一样,建立3个一模一样的表。表包含10个各种字段,另外再单独建3个索引。
测试3,超大表测试(TODO)
与测试1相同,但是表不一样,建立3个一模一样的表。表包含100个以上的字段,10个索引。系统中有类似这样的流水表。
?
3.环境定义
3.1.硬件环境定义
笔记本
CPU Core Duo T2350(双核,1.86G)
硬盘120G
内存2G
Java程序和数据库跑在一个机器上测试确实不太好,不过只有这样的条件。另外,在小型客户那里的生产环境,有把数据库和Java应用服务器安装在一个机器的情况,因此这样也能说明一些问题。
3.2.操作系统定义
Windows平台:Windows XP Pro SP2,文件系统NTFS
Linux平台:Ubuntu 8.04,文件系统EXT3
Windows 平台上已经尽可能停用了无关的程序,比如杀毒软件等。
CPU在负载低的时候会自动降频到800M,在Windows下,使用软件RMClock将主频强制稳定在1.86G,避免CPU频率调整可能带来的性能波动。Linux下没有做这个处理(因为不知道用什么软件)。
为了偷懒是在Eclipse里面运行的,不过应该没有太多的影响。程序在循环中没有生成垃圾对象,不清楚数据库驱动程序会不会,但是应该不会频繁GC吧。
3.3.待测试数据库环境定义
?
数据库 | OS | 缩写 | 说明 |
Oracle 10g 10.2.01 | Windows | Oracle_win | JDBC驱动程序用的安装Oracle后自带的。先整理磁盘碎片,然后建立新的表空间和用户,数据表空间5G,临时表空间200M,重做日志文件3×50M。 |
Oracle 10g 10.2.01 | Linux | Oracle_Li | |
MS SQL Server 2005 SP2 | Windows | MSSQL | JDBC驱动程序为jtds1.2.2。磁盘碎片整理后建立数据库文件5G,日志文件100M。 |
MySQL 5.1.26 RC | Linux | Mysql_Li | 存储引擎为InnoDB。JDBC驱动为mysql-connector-java-5.1.6-bin.jar |
MySQL 5.1.26 RC | Windows | Mysql_Win | 存储引擎为InnoDB。JDBC驱动为mysql-connector-java-5.1.6-bin.jar |
Postgresql 8.3.3 |
Linux | Pgsql_Li | JDBC3 Postgresql Driver, Version 8.3-603。 |
Postgresql 8.3.3 |
Windows | Pgsql_Win | JDBC3 Postgresql Driver, Version 8.3-603。 |
数据库没有再做什么优化,简单的调整内存之类的参数,对测试结果基本没有影响。
4.测试结果
明细结果在附件(Eclipse工程)的result中。有的测试重复做过多次,基本上数据都是稳定的。
文件名命名规则是:数据库_s_线程数_表相同或不相同,s表示simple,n表示normal
输出每行表示一次采样,5秒1次,“本阶段平均”表示这5秒的平均速度,“共处理”是进程启动以后处理记录的总和,“平均”是根据启动后处理的记录总数和总时间计算出来的:
normal_evt 2170/s normal_evt 2050/s normal_evt 2170/s 本阶段平均6390/s 共处理3,1950条 平均6390/s
4.1.结果数据
测试1,简单表,3字段,1主键,无索引
条/秒 | 1线程1表 | 2线程2表 | 2线程1表 | 3线程3表 | 3线程1表 |
Oracle_Li |
|||||
Oracle_Win | 3,7205 | 5,6065 | 4,2437 | 5,0640 | 4,6861 |
Mysql_Li | 1,0287 | 2,0449 | 1,2751 | 2,0397 | 1,4239 |
Mysql_Win | 1020 | 1173 | 1167 | 1706 | 1671 |
MSSQL | 2975 | 5584 | 5561 | 7705 | 7703 |
Pgsql_Li |
1,3882 |
2,1870 | 2,2225 | 2,2402 | 2,4181 |
Pgsql_Win | 1,0241 | 1,7287 | 1,7323 | 1,7153 | 1,8160 |
测试2,普通表,10字段,1主键,3索引