Kevin-moon

学习在于分享
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Access和Firebird的性能比较

Posted on 2008-12-01 10:00  Kevin-moon  阅读(13112)  评论(17编辑  收藏  举报

     前段时间想大家征求了本地数据库的解决方案(神呀~~,给我个"本地数据库的替换方案"吧!),最后确定用下Firebird试下,花了一个星期做个比较全面的性能测试。虽然Firebird总体上是比Access好,但是没有传说的那么好,至少在Net环境下。


 1、测试环境

A、系统环境

操作系统:Windows XP Professional Server Pack 2

CPUIntel(R) Pentium(R) 4 CPU 3.00GHZ 2.99GHZ

内存:1G

 

B、代码环境

NET2.0Access2003Firebird2.1

FirebirdNET2.0访问API(FirebirdSql.Data.FirebirdClient.dll)

 

2、数据库

EmployeeInfo表:

CREATE TABLE EMPLOYEEINFO(

 EID Integer NOT NULL,

 ENAME Varchar(50),

 ETELEPHONE Varchar(50),

 EMOBILE Varchar(50),

 EADDRESS Varchar(200),

 EWORK Varchar(50),

 ECOMPANY Varchar(50),

 EAGE Integer,

 ESCHOOL Varchar(50),

 EBIRTHDAY Date,

 EFAVOURATE Varchar(500),

 ISMVP Integer,

 ELEVEL Integer,

 ENABLE_FLAG Integer,

 CONSTRAINT EMPLOYEEINFO_NAME PRIMARY KEY (EID)

);

 

3、测试代码

见附带文件

4、性能比较

下面的数字是以毫秒为单位的,对于两个数据库连接的性能在4.1中有记录,因为其他的操作连接的性能基本相同,所以在其他的比较中省略了。

新增操作:需要从数据表中获取ID,所以都需要执行ExecuteScalar

         AccessSELECT max(EId) + 1 FROM EmployeeInfo

         FirebirdSELECT first 1 GEN_ID( EMPLOYEEINFO_KEY_GEN, 1) FROM RDB$GENERATORS

预编优化:这种方式是采用IDbCommandPrepare方法来进行的。

4.1、单条数据的操作比较

1、新增操作

 

IDbConnection.Open()

IDbCommand.ExecuteScalar()

IDbCommand.ExecuteNonQuery()

Access

174.238416

102.448561

41.695030

 

159.298931

101.921224

41.537487

 

185.202748

102.383310

36.008230

 

 

 

 

FireBird

381.801163

59.864800

38.652679

 

360.196079

69.475482

39.371224

 

343.838800

60.606686

39.241575

2、   修改操作

 

Access

FireBird

IDbCommand.ExecuteNonQuery()

125.531627

88.544622

 

105.508891

88.177334

 

145.817176

107.016208

 

4.2100条数据的操作比较

1、新增操作

 

IDbCommand.ExecuteScalar()

IDbCommand.ExecuteNonQuery()

Access

275.494317

234.020361

 

261.396954

237.707107

 

252.611140

253.758009

 

 

 

预编译优化

124.001096

100.539268

 

124.581257

98.269848

 

125.422189

99.034516

 

 

 

预编译+事务控制

156.688199

99.945657

 

116.741034

80.133735

 

113.269134

82.601144

 

 

 

FireBird

838.318433

969.816292

 

887.597984

1064.949756

 

818.385955

1022.706634

 

 

 

预编译优化

308.331690

437.868342

 

283.292181

551.306577

 

222.096816

455.877916

 

 

 

预编译+事务控制

70.281354

109.981409

 

72.199458

96.185741

 

69.851572

91.551454

2、   修改操作

 

Access

FireBird

IDbCommand.ExecuteNonQuery()

411.009308

913.508742

 

396.797053

868.117194

 

399.259210

912.881623

 

 

 

预编译优化

177.652866

692.759320

 

163.982479

709.243510

 

171.324164

644.216015

 

 

 

预编译+事务控制

158.654429

106.195976

 

154.795059

101.715139

 

157.486357

104.424021

 

4.31000条数据的操作比较

1、新增操作

 

IDbCommand.ExecuteScalar()

IDbCommand.ExecuteNonQuery()

Access

1651.840012

2133.541653

 

1663.862358

2144.262530

 

1631.403159

2135.223692

 

 

 

预编译优化

796.962979

808.875114

 

785.243696

793.758126

 

809.209726

797.399235

 

 

 

预编译+事务控制

728.416438

610.310033

 

873.088523

898.503055

 

673.583191

603.249033

 

 

 

FireBird

7737.366552

9359.178169

 

7308.689064

10904.423101

 

7724.148976

11846.604215

 

 

 

预编译优化

3716.587264

5723.248900

 

3234.737922

5430.311542

 

2686.714810

4821.239747

 

 

 

预编译+事务控制

522.050014

642.658276

 

522.211388

665.879242

 

532.323116

658.373523

2、   修改操作

 

Access

FireBird

IDbCommand.ExecuteNonQuery()

3290.740559

7873.507740

 

3991.333695

7822.996734

 

3293.068174

7116.759956

 

 

 

预编译优化

1398.160890

6482.893171

 

1254.979979

6302.055985

 

1245.802121

6272.648019

 

 

 

预编译+事务控制

1097.316477

648.313099

 

1221.636742

648.390276

 

1104.532568

648.983446

 

4.410000条数据的操作比较

1、新增操作

 

IDbCommand.ExecuteScalar()

IDbCommand.ExecuteNonQuery()

Access

15321.344697

20695.870283

 

15522.056899

20775.041631

 

15319.349251

20727.514825

 

 

 

预编译优化

10627.689828

9980.130051

 

11161.361432

10432.259290

 

10580.619317

9925.817398

 

 

 

预编译+事务控制

6191.647891

6037.020082

 

6855.991305

6306.552880

 

6659.638395

6042.067384

 

 

 

FireBird

92770.835360

119561.011190

 

115369.304783

143528.391259

 

135761.012112

165465.676440

 

 

 

预编译优化

61204.197587

94345.156610

 

36930.112494

57278.146122

 

40012.081468

66210.081814

 

 

 

预编译+事务控制

5407.627206

6910.738469

 

5488.005238

7106.846560

 

5524.538831

6740.408060

2、   修改操作

 

Access

FireBird

IDbCommand.ExecuteNonQuery()

39694.855804

99310.751707

 

35354.716525

90011.911178

 

36534.236655

91112.061482

 

 

 

预编译+事务控制

10469.019093

7230.535415

 

10444.395741

7682.581104

 

10329.116616

7390.059610

 

4.5100000条数据的操作比较

1、新增操作

 

IDbCommand.ExecuteScalar()

IDbCommand.ExecuteNonQuery()

Access

198287.389450

223781.708768

 

207229.904897

227152.302183

 

236267.203150

251924.067059

 

 

 

预编译优化

75745.455466

80136.166440

 

80215.392531

84041.511179

 

83531.057454

85371.502942

 

 

 

预编译+事务控制

73753.320106

62696.035496

 

70442.642879

69222.947557

 

79447.569370

70056.168140

 

 

 

FireBird

>30分钟

 

 

预编译优化

297619.975597

551716.871984

 

 

 

预编译+事务控制

50412.421478

62230.369322

 

52912.052985

69931.034354

 

52509.019944

66763.649792

2、   修改操作

 

Access

FireBird

IDbCommand.ExecuteNonQuery()

332451.315712

1260805.499906

 

347068.025903

预编译优化

164528.339360

643502.447928

预编译+事务控制

108129.478762

81140.664313

 

4.6500000条数据的操作比较

1、新增操作

 

IDbCommand.ExecuteScalar()

IDbCommand.ExecuteNonQuery()

预编译优化Access

479207.809593

465971.617839

 

377229.922041

367370.094465

预编译+事务控制

336857.065763

316500.809166

 

 

 

预编译优化FireBird

>60分钟

预编译+事务控制

273555.344525

361675.703063

2、   修改操作

 

Access

FireBird

预编译+事务控制

512516.135296

473002.155994

 

4.7100条数据的查询比较

 

Access

FireBird

SELECT * FROM table

561.603041

705.621894

 

528.617866

804.226516

SELECT * From table WHERE name like %...%

531.510943

720.582087

 

525.499398

761.811122

 

4.81000条数据的查询比较

 

Access

FireBird

SELECT * FROM table

588.116789

771.333159

 

615.835833

743.432148

SELECT * From table WHERE name like %...%

557.460599

715.724471

 

564.812336

724.736215

 

4.910000条数据的查询比较

 

Access

FireBird

SELECT * FROM table

1134.614770

1337.971064

 

1015.374508

1261.249305

SELECT * From table WHERE name like %...%

737.451880

925.413277

 

751.952307

910.842727

4.10100000条数据的查询比较

 

Access

FireBird

SELECT * FROM table

6501.658483

6335.985464

 

5426.486788

6899.610531

SELECT * From table WHERE name like %...%

3204.588434

3298.303960

 

3203.261492

3810.441583

 

4.11500000条数据的查询比较

 

Access

FireBird

SELECT * FROM table

28380.649119

34032.733181

 

28227.096199

34557.834127

SELECT * From table WHERE name like %...%

18065.770127

19266.049635

 

18412.904426

17163.350933

 

4.12、数据库文件增长量的比较

Access文件大小的增长是非常恐怖的,1000000条左右的数据基本上可以达到Access的极限(2G)

Firebird文件大小的增长和Access比较起来,比Access要小很多,基本上是差了几个级别

下面是分别进行大数量操作后的文件情况:

Firebird  94808KB

Access   1123424KB

 在不压缩数据库的前提下,Access增加100W左右的数据达到2GFirebrid增加1000W左右的数据达到2G

 

5、测试总结

根据上面的性能比较,可以得出以上几点结论:

1、对于大批量的数据操作,一定要采用预编译或批量提交的方式进行操作,如果是在Firebird中,一定加事务进行处理,因为在Firebird中,有事务的性能可以提升6-10倍左右。在Access中,虽然性能提升不多,但是还是最好都加上事务控制。这一方面增加操作的原子性,并且也减少数据库的读写次数。

2Access一般支持2G左右的数据,当数据量超过这个限制后,Access不能写入数据。所以当数据量在2G下的时候才选用。Firebird对于数据的支持大于/等于16G,而且在优化后的整体性能要强于Access

3Access在没有压缩的前提下,如果大批量的进行数据操作(新增/修改),那么数据大小的增长是是Firebird的几倍,一般连续增长100W多的数据就不能再插入数据了。而Firebird在这点上是很好的,同时也没有限制。


 

     测试代码:Performance.zip
     测试数据库:可以根据上面的数据脚本自己创建