答案:本地数据库接触不多,最早用过Access,但现在SQLite功能更加强大--而且,说实在的我不喜欢Access,连带着不喜欢SqlServer,只要一看到满眼的@号go号我就头晕不止;更何况有一个我感觉非常致命的问题:分页太麻烦!远不如mySql/SQLite中的limit或者Oracle中的rownum来得痛快。
平时基本使用Oracle,对它的性能知根知底了;mySql近年来混得风生水起,想必有过人之处,也一并纳入测试范围了。
另外,Access现在有2007版,不知道和2003版在性能上有什么区别没有?特意分开进行测试。
测试环境如下:
服务器:本机(笔记本,I3 370,8G内存)
操作系统:windows 7 x64
语言环境:C#,使用控制台程序测试。
虚拟机:安装SqlServer2008,2CPU,3G内存。
数据库:Oracle11g(本机数据库)
SQLite(本机文件)
MySql(版本5的绿色版)
SqlServer(不想在本机安装2008版本,本来想使用本机的学习版,但死活不行,只好在本机虚拟机上安装一个2008版本,测试性能有所下降,但也只好如此了)
Access(2003版)
Access(2007版)
测试方法:先生成10000条记录(每条记录6个字段),插入数据前先清除原有数据;
数据插入分为事务性写入(启动事务,逐条插入后提交)及非事务性写入(不启动事务,逐条插入)。
SqlServer数据库在本地虚拟机的数据库中,数据不太准确;为消除网络操作影响,将代码移到虚拟中直接执行一次。
测试过程中发现了若干有趣的问题:
1.64位操作系统下,Access无法在编译为AnyCpu的程序下执行,必须编译为x86方可正常操作。(如果是网站,必须将池设置为启用32位兼容)
2.SQLite有64位版本的DLL,可以正常在64位环境(控制台程序)下运行;但很奇怪的是,如果是网站,则使用64位DLL反而无易做图常运行,必须使用32位版本的DLL,并且将IIS的池设置为启用32位兼容才可正常运行。
3.Access的2003版本与2007版本的数据库连接串是不相同的,如下:
2003:@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\xxx\test.mdb";
2007:@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\xxx\test.accdb";
测试结果如下:
数据库类别 | 插入数量 | 本地事务(毫秒) | 本地无事务(毫秒) | 说明 | ||
每条记录耗时 | 每秒插入条数 | 每条记录耗时 | 每秒插入条数 | |||
Oracle | 10000 | 0.23 | 4300 | 0.9 | 1103 | 本地数据库 |
Sqlite | 10000 | 0.0998 | 10016 | 6.86 | 146 | 本地数据库 |
MySql | 10000 | 0.2574 | 3884 | 4.132 | 241 | 本地数据库 |
Sql Server | 10000 | 0.42 | 2380 | 1.52 | 654 | 远程数据库 |
Sql Server | 10000 | 0.413 | 2418 | 1.433 | 697 | 本地数据库,2CPU,2G内存 代码直接在虚拟机运行 |
Access2003 | 10000 | 0.6 | 1664 | 46.87 | 21.33 | 本地数据库 |
Access2007 | 10000 | 0.73 | 1369 | 47.57 | 21.02 | 本地数据库 |