凨凬凮 發表於 2023-10-1 00:00:00

关于若干数据库数据插入性能的对比分析

<p>
        本地数据库接触不多,最早用过Access,但现在SQLite功能更加强大--而且,说实在的我不喜欢Access,连带着不喜欢SqlServer,只要一看到满眼的@号go号我就头晕不止;更何况有一个我感觉非常致命的问题:分页太麻烦!远不如mySql/SQLite中的limit或者Oracle中的rownum来得痛快。</p>
<p>
        平时基本使用Oracle,对它的性能知根知底了;mySql近年来混得风生水起,想必有过人之处,也一并纳入测试范围了。</p>
<p>
        另外,Access现在有2007版,不知道和2003版在性能上有什么区别没有?特意分开进行测试。</p>
<p>
        测试环境如下:</p>
<p>
        服务器:本机(笔记本,I3 370,8G内存)</p>
<p>
        操作系统:windows 7 x64</p>
<p>
        语言环境:C#,使用控制台程序测试。</p>
<p>
        虚拟机:安装SqlServer2008,2CPU,3G内存。</p>
<p>
        数据库:Oracle11g(本机数据库)</p>
<p>
        SQLite(本机文件)</p>
<p>
        MySql(版本5的绿色版)</p>
<p>
        SqlServer(不想在本机安装2008版本,本来想使用本机的学习版,但死活不行,只好在本机虚拟机上安装一个2008版本,测试性能有所下降,但也只好如此了)</p>
<p>
        Access(2003版)</p>
<p>
        Access(2007版)</p>
<p>
        测试方法:先生成10000条记录(每条记录6个字段),插入数据前先清除原有数据;</p>
<p>
        数据插入分为事务性写入(启动事务,逐条插入后提交)及非事务性写入(不启动事务,逐条插入)。</p>
<p>
        SqlServer数据库在本地虚拟机的数据库中,数据不太准确;为消除网络操作影响,将代码移到虚拟中直接执行一次。</p>
<p>
        测试过程中发现了若干有趣的问题:</p>
<p>
        1.64位操作系统下,Access无法在编译为AnyCpu的程序下执行,必须编译为x86方可正常操作。(如果是网站,必须将池设置为启用32位兼容)</p>
<p>
        2.SQLite有64位版本的DLL,可以正常在64位环境(控制台程序)下运行;但很奇怪的是,如果是网站,则使用64位DLL反而无法正常运行,必须使用32位版本的DLL,并且将IIS的池设置为启用32位兼容才可正常运行。</p>
<p>
        3.Access的2003版本与2007版本的数据库连接串是不相同的,如下:</p>
<p>
        2003:@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\xxx\test.mdb";</p>
<p>
        2007:@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\xxx\test.accdb";</p>
<p>
        测试结果如下:</p>
<table border="1" cellpadding="0" cellspacing="0" frame="border" sizcache="8" sizset="0"><tbody sizcache="8" sizset="0">
<tr height="18">
<td class="xl66" height="36" rowspan="2" width="88">
                                <p>
                                        <span><span face="宋体" size="3">数据库类别</span></span></p>
                        </td>
                        <td class="xl66" rowspan="2" width="88">
                                <p>
                                        <span><span face="宋体" size="3">插入数量</span></span></p>
                        </td>
                        <td class="xl66" colspan="2" width="216">
                                <p>
                                        <span><span face="宋体" size="3">本地事务(毫秒)</span></span></p>
                        </td>
                        <td class="xl66" colspan="2" width="218">
                                <p>
                                        <span><span face="宋体" size="3">本地无事务(毫秒)</span></span></p>
                        </td>
                        <td class="xl67" rowspan="2" width="179">
                                <p>
                                        <span><span face="宋体" size="3">说明</span></span></p>
                        </td>
                </tr>
<tr height="18">
<td class="xl65" height="18">
                                <p>
                                        <span><span face="宋体" size="3">每条记录耗时</span></span></p>
                        </td>
                        <td class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">每秒插入条数</span></span></p>
                        </td>
                        <td class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">每条记录耗时</span></span></p>
                        </td>
                        <td class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">每秒插入条数</span></span></p>
                        </td>
                </tr>
<tr height="18">
<td class="xl65" height="18">
                                <p>
                                        <span><span face="宋体" size="3">Oracle</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">10000</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">0.23</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">4300</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">0.9</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">1103</span></span></p>
                        </td>
                        <td class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">本地数据库</span></span></p>
                        </td>
                </tr>
<tr height="18">
<td class="xl65" height="18">
                                <p>
                                        <span><span face="宋体" size="3">Sqlite</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">10000</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">0.0998</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">10016</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">6.86</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">146</span></span></p>
                        </td>
                        <td class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">本地数据库</span></span></p>
                        </td>
                </tr>
<tr height="18">
<td class="xl65" height="18">
                                <p>
                                        <span><span face="宋体" size="3">MySql</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">10000</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">0.2574</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">3884</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">4.132</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">241</span></span></p>
                        </td>
                        <td class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">本地数据库</span></span></p>
                        </td>
                </tr>
<tr height="18">
<td class="xl65" height="18">
                                <p>
                                        <span><span face="宋体" size="3">Sql Server</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">10000</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">0.42</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">2380</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">1.52</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">654</span></span></p>
                        </td>
                        <td class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">远程数据库</span></span></p>
                        </td>
                </tr>
<tr height="36">
<td class="xl65" height="36">
                                <p>
                                        <span><span face="宋体" size="3">Sql Server</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">10000</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">0.413</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">2418</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">1.433</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">697</span></span></p>
                        </td>
                        <td class="xl69" width="179">
                                <p>
                                        <span><span face="宋体" size="3">本地数据库,2CPU,2G内存<br>
                                        代码直接在虚拟机运行</span></span></p>
                        </td>
                </tr>
<tr height="18">
<td class="xl65" height="18">
                                <p>
                                        <span><span face="宋体" size="3">Access2003</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">10000</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">0.6</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">1664</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">46.87</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">21.33</span></span></p>
                        </td>
                        <td class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">本地数据库</span></span></p>
                        </td>
                </tr>
<tr height="18">
<td class="xl65" height="18">
                                <p>
                                        <span><span face="宋体" size="3">Access2007</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">10000</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">0.73</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">1369</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">47.57</span></span></p>
                        </td>
                        <td align="right" class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">21.02</span></span></p>
                        </td>
                        <td class="xl65">
                                <p>
                                        <span><span face="宋体" size="3">本地数据库</span></span></p>
                        </td>
                </tr>
</tbody></table>
<p>
        结果很有意思:</p>
<p>
        1.SQLite的事务插入速度最快,达到10000条每秒,但非事务性的插入速度就一般了。</p>
<p>
        2.Oracle作为数据库的老大,事务插入速度仅次于SQLite,但非事务性的插入速度居首。</p>
<p>
        3.可怜Access,不试不知道,一试吓一跳,事务插入最慢,非事务插入更慢;本来对Access2007还有点期待的,没想到它比2003版本的数据还差。</p>
<p>
        4.mySql还真是不赖,事务插入的性能仅次于Oracle,非事务性的插入没有那么强,但也还不错。</p>
<p>
        从数据来看,发觉一个比较有规律的现象:大型数据库与小型数据库、本地型数据库的区别,不在于事务性插入性能的高低,而在于非事务性插入性能的高低。Oracle最强,每秒达到1000条以上;其次是SqlServer,也有700条每秒;mySql相比之下就差多了,只达到240条每秒左右,这个性能整整差了一个等级;比较意外的是SQLite,非事务性插入性能虽然比mySql差一点,但也相差不大(不是数量级的差别);最糟糕的是Access,非事务数据插入性能惨不忍睹,和SQLite相比,整整差了一个数量级。</p>
<p>
        由上可见,如果选择本地数据库,SQLite应该是首选。而且在应用中还应该注意,尽可能把数据集中起来进行事务性数据写入,如此可以大大提升该数据库的性能。</p>
頁: [1]
查看完整版本: 关于若干数据库数据插入性能的对比分析