一般来说,传统的桌面应用,尤其是ms平台下,多用access数据库,近年,sqllite越来越流行,而且其对手机终端的支持,更使得起使用率越来越高.access和sqlite有太多的相似之处.可他们性能究竟怎么样呢,我查询了一些对比资料,如下:
sqlite介绍
在介绍System.Data.sqlite之前需要介绍一下sqlite,sqlite是一个类似于Access的单机版数据库管理系统,它将所有数据库的定义(包括定义、表、索引和数据本身)都保存在一个单一的文件中。并且,sqlite是一个用C实现的类库,它在内存消耗、文件体积、简单性方面都有不错的表现,如果数据在10W条以下,查询速度也是相当快的。
sqlite具有以下特征:
实现多数sql92的标准,包括事务(原子性、一致性、隔离性和持久性)、触发器和大多数的复杂查询。
不对插入或者更新的数据进行类型检查,你可以将字符串插入到整数列中(这个可能让有些用户不太适应)。
支持Windows/Linux/Unix等主流系统,还支持嵌入式系统如Android或Windows Mobile。
System.Data.sqlite
System.Data.sqlite是sqlite的加强版,它可以无需.NET Framework支持,由于它内部包含了一个ADO.NET 2.0引擎,所以.NET开发人员可以利用System.Data.sqlite方便地开发.NET程序。
System.Data.sqlite及sqlite也有一些限制,比如不支持行级及表级锁,当一个连接锁定数据库以用于写入数据,其它的数据库连接只能等待那个连接操作完成之后进行读写操作,sqlite.NET尝试在超时期内多次尝试。
ACCESS 插入性能测试:
平台:SYS:WINXP;cpu:2*1.6GHZ;RAM:1G;APP:VC+ADO
1.单条显式事务:
1 00条: 0.55S
1000条: 5s
10000条: 50s
2.单条非显式事务:
100条:31ms
1000条:156ms
10000条:1500ms
3.批量事务:
1 00条:16ms
1000条:141ms
10000条:1469ms
以上可以看出,ACCESS单条非显式事务插入的时间几乎和批量事务的插入时间一样,这大概就是网上得出ACCESS快于sqlite的原因吧,但是;单条非显式事务的
方式只能用单连接,如果有多个连接并发访问,则会出现严重问题,在一个链接插入后的相当长一段时间内(有时数S),其它链接都无法插入数据库。可以推理
ADO+ACCESS是采用了一种类似CACHE的做法缓存了操作,但是却一直锁住数据库。单条的显式事务可以保证多链接的访问,但是速度会慢很多,下面再对比一下
sqlITE的测试性能;
sqlITE PC平台插入性能测试:
平台:SYS:WINXP+VMWARE+FEDORA7(LINUX2.6.21);cpu;1.6GHZ;RAM:412M; APP:C+sqlITE
1.单条显式事务(sqlITE默认为每个操作开启事务)
100条:0.587s
1000条:6.962s
10000条:56.004s
2.批量事务
100条:81ms(可能误差较大)
1000条:124ms
10000条:1257ms
sqlITE 嵌入式平台插入性能测试:
平台:SYS:LINUX2.6.14;cpu:HI3512 ARM9 200MHZ级别;RAM:32M,ROM:32M NOR FLASH;APP:C+sqlITE
1.单条显式事务(sqlITE默认为每个操作开启事务)
100条:1.98s
1000条:19.97s
10000条:34.63s
2.批量事务
100条:0.15s
1000条:0.89s
10000条:8.24s
由这个测试可以看出,在微软平台下,access和sqlite性能基本相当,而在linux平台下,sqlite的并发性能要高出不少。