关于若干数据库数据插入性能的对比分析
程序员文章站
2022-05-01 20:01:59
本地数据库接触不多,最早用过access,但现在sqlite功能更加强大--而且,说实在的我不喜欢access,连带着不喜欢sqlserver,只要一看到满眼的@号go号我...
本地数据库接触不多,最早用过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";
测试结果如下:
结果很有意思:
1.sqlite的事务插入速度最快,达到10000条每秒,但非事务性的插入速度就一般了。
2.oracle作为数据库的老大,事务插入速度仅次于sqlite,但非事务性的插入速度居首。
3.可怜access,不试不知道,一试吓一跳,事务插入最慢,非事务插入更慢;本来对access2007还有点期待的,没想到它比2003版本的数据还差。
4.mysql还真是不赖,事务插入的性能仅次于oracle,非事务性的插入没有那么强,但也还不错。
从数据来看,发觉一个比较有规律的现象:大型数据库与小型数据库、本地型数据库的区别,不在于事务性插入性能的高低,而在于非事务性插入性能的高低。oracle最强,每秒达到1000条以上;其次是sqlserver,也有700条每秒;mysql相比之下就差多了,只达到240条每秒左右,这个性能整整差了一个等级;比较意外的是sqlite,非事务性插入性能虽然比mysql差一点,但也相差不大(不是数量级的差别);最糟糕的是access,非事务数据插入性能惨不忍睹,和sqlite相比,整整差了一个数量级。
由上可见,如果选择本地数据库,sqlite应该是首选。而且在应用中还应该注意,尽可能把数据集中起来进行事务性数据写入,如此可以大大提升该数据库的性能。
平时基本使用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 | 本地数据库 |
1.sqlite的事务插入速度最快,达到10000条每秒,但非事务性的插入速度就一般了。
2.oracle作为数据库的老大,事务插入速度仅次于sqlite,但非事务性的插入速度居首。
3.可怜access,不试不知道,一试吓一跳,事务插入最慢,非事务插入更慢;本来对access2007还有点期待的,没想到它比2003版本的数据还差。
4.mysql还真是不赖,事务插入的性能仅次于oracle,非事务性的插入没有那么强,但也还不错。
从数据来看,发觉一个比较有规律的现象:大型数据库与小型数据库、本地型数据库的区别,不在于事务性插入性能的高低,而在于非事务性插入性能的高低。oracle最强,每秒达到1000条以上;其次是sqlserver,也有700条每秒;mysql相比之下就差多了,只达到240条每秒左右,这个性能整整差了一个等级;比较意外的是sqlite,非事务性插入性能虽然比mysql差一点,但也相差不大(不是数量级的差别);最糟糕的是access,非事务数据插入性能惨不忍睹,和sqlite相比,整整差了一个数量级。
由上可见,如果选择本地数据库,sqlite应该是首选。而且在应用中还应该注意,尽可能把数据集中起来进行事务性数据写入,如此可以大大提升该数据库的性能。