Spiga

到底SQLite有多强?在我的2台机器上的压力测试

2005-03-26 12:04 by 灵感之源, 10588 visits, 收藏, 编辑

作为最轻量级、强大的嵌入式数据库引擎,SQLite除了拥有以下介绍的特性外:

开源数据库系统之SQLite3.2.0、FireBird2.0 Alpha-1等
SQLite最新稳定版本3.1.3发布
开源有感系列 之开源数据库有感[新内容添加版本]
开源轻量级嵌入式数据库引擎SQLite 3.1.0版大量新特性!
更新:超轻量级数据库引擎SQLite3.04版和SQLiteDB 1.0.2版
ADO.NET Data Provider for SQLite 0.19版同时支持SQLite2.x和3.x!
SQLite系列免费/开源数据库组件/应用
SQLite3.0 beta & ADO.NET Data Provider for SQLite 0.18发布了!
最轻量级但强大的ADO.NET Data Provider for SQLite 0.17版也C#了!
SQLite3.0 Alpha发布了!!!
SQLite准备出3.0了!

大家或许会对其真实速度比较感兴趣:我使用其ADO.NET驱动来进行压力测试,看看其真实表现。

在公司的PIV 3.0, 1G内存, Win2003 Server+vs.net2003,并包含Unicode字符(中文),例子是该驱动的官方测试,我仅仅修改了第一个字段的内容和记录数。

说明:下面的每个“+”表示前后为字段,数字为字段的长度,

(23+i+i*3.3+i*4.4 字节) * 1000万 
Inserting version 3... 47009 inserts/sec 
Reading version 3... 262595 reads/sec 
 
(23+i+i*3.3+i*4.4 字节) * 1亿
Inserting version 3... 48042 inserts/sec 
Reading version 3... 102899 reads/sec 
数据库为 6.7G
 
(1万+i+i*3.3+i*4.4 字节) * 10万 
Inserting version 3... 468 inserts/sec 
Reading version 3... 654 reads/sec 
 
(1万+i+i*3.3+i*4.4 字节) * 50万 
Inserting version 3... 334 inserts/sec 
Reading version 3... 641 reads/sec 
数据库为7.5G 

当Insert的时候,50% cpu,当select的时候,10-20% cpu。



在家的C4 1.7+512M内存 + IDE 100 7200RPM

20字节 * 1百万记录
Inserting version 3... 6943 inserts/sec
Reading version 3... 78599 reads/sec

64字节 * 1百万记录
Inserting version 3... 4808 inserts/sec
Reading version 3... 35225 reads/sec

64字节 * 1千万记录
Inserting version 3... 5937 inserts/sec
Reading version 3... 6818 reads/sec

结论,速度有点不稳定,因为我还开了几个大型软件在跑,而且我没有反复测试,只测试了一遍,公平点来说,.NET对超大量循环的效率表现真的有点不让人满意,但SQLite的表现基本是不错的,一个才200K的关系型数据库引擎不能过多强求。


SQLite
一个很优秀的特性就是内存模式数据库,整个数据操作都在内存中运行,这样的速度将会是以上操作的50、100甚至更多倍以上!   

附:
VB.NET测试:DataGrid_DataSet_DataTable.rar
图像化QA:sqlite3Explorer.zip

Add your comment

18 条回复

  1. #1楼 寒枫天伤2005-03-26 12:10
    第一个数据我比较感兴趣,算下来读取100万条要4秒...很不错了
     回复 引用   
  2. #2楼 雨中漫步[未注册用户]2005-03-26 14:16
    有两个问题没搞清楚:
    一,SQLite是不是只支持单机访问?
    二,SQLite跟Firebird比起来,速度谁更快些呢?能不能做个测试?
     回复 引用   
  3. #3楼[楼主] 奋斗中的灵感之源      2005-03-26 16:50
    to:雨中漫步
    1、SQLite确实只支持单机,因为它天生就是嵌入式的,尽管有第三方写的C/S;
    2、比起Firebird,在100万条短记录内,SQLite有优势,但超过500万,则是Firebird的优势表现了。
     回复 引用 查看   
  4. #4楼 none2005-03-26 22:53
    内存数据库应该字数据中心版的WINDOWS+SQL SERVER就有过实现了的,呵呵~~

    我更关心他对于SQL SERVER的兼容性,在SQL SERVER中做的事能否不用改变就用他实现,这样只需要把数据库驱动换一下,就可以自如的在SQL SERVER和SQLite中切换,当用户需要免费且轻巧的时候就用这个,需要更大的应用可以换到SQL SERVER,真的很不错。。。
     回复 引用   
  5. #5楼 liujun      2005-03-27 06:37
    有没有非托管的驱动?比如如何在EVC中使用
     回复 引用 查看   
  6. #6楼[楼主] 奋斗中的灵感之源      2005-03-27 08:14
    to:none
    SQLite不支持存储过程,而且一些SQL Server基本特性都没有。

    to:liujun
    有,http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers
     回复 引用 查看   
  7. #7楼 none2005-03-27 14:09
    基本特性?
    存储过程不支持虽然有点不乐意,但也值得理解,普通的SQL是否能一致呢?当然也包括一些TOP或者联表之类的特性
     回复 引用   
  8. #8楼[楼主] 奋斗中的灵感之源      2005-03-28 08:49
    to:none
    看这里吧:http://www.sqlite.org/omitted.html
     回复 引用 查看   
  9. #9楼 kylin      2005-04-11 11:35
    你好那個附件我無法下載觀看,是否可以整理一下謝謝呀
     回复 引用 查看   
  10. #10楼 ShiningRay[未注册用户]2005-05-11 11:58
    拿起他数据库做一下对比呢?
     回复 引用   
  11. #11楼 海天一鸥      2005-05-13 10:42
    TO: 公平点来说,.NET对超大量循环的效率表现真的有点不让人满意

    在编写数据库测试案例中,必须要求循环产生的效果是一次性的,也就是说1万次循环必须在一个尽可能短的时段扔给数据库,这才能产生真正的压力。

    .NET对于循环的支持和其他语言一样,造成循环很慢的原因在于循环内部执行的逻辑,而非循环本身吧,个人愚见。

    如何动态增长批量提交量来对数据库进行强度测试,测试结果才有意义。DBA能很容易的对数据库产生压力——使用SQL循环即可,但DBA不容易找到数据库的最佳运行点,特别是对于OLAP系统。相反,这对于用程序编写压力测试的程序员来说,实现就方便了,因为可以动态调整压力。(LoadRunner有这样高级的功能,但这个软件太贵了^_^)



     回复 引用 查看   
  12. #12楼 stjack2005-06-07 15:28
    sqlite怎么实现内存数据库模式呢,能指点一下吗?
     回复 引用   
  13. #13楼 wwww[未注册用户]2005-11-20 20:24

    <a href="http://sms1.jssy.sinopec.com/index.html">手机铃声</a>
     回复 引用   
  14. #14楼 roger007[未注册用户]2006-03-27 11:12
    最近我也测试SQLite,准备在项目中使用它,可是SQLite在不打开事务处理的情况下,其插入记录的速度令人不能忍受,太慢!
    是否打开事务,两者的速度是10倍的差距.
    可如果插入的记录时间是比较分散的,并不集中一起提交,难道每条记录提交的时候也使用开始事务,提交事务这样处理吗?
    难以理解SQLite这一行为.
     回复 引用   
  15. #15楼 小牛哥      2006-08-10 03:53
    SQLite每插入一条语句是有一次IO操作的,如果是事务的话,就是减少了IO操作,当然速度快了.
     回复 引用 查看   
  16. #16楼 小牛哥      2006-08-10 03:55
    TO:灵感之源

    比起Firebird,在100万条短记录内,SQLite有优势,但超过500万,则是Firebird的优势表现了。

    这个比较的依据是啥?
     回复 引用 查看   
  17. #17楼 麦舒      2008-09-25 10:12
    我是SQLite的新手,请楼主,SQLite如何连接两个字符串?直接相加不行。
    例如:
    SELECT [t0].[CustomerID], contact([t0].[City] + [t0].[Country]) AS [Location]
    FROM [Customers] AS [t0]
     回复 引用 查看   
  18. #18楼 牛腩      2009-10-30 14:04
    不错。。决定把现在博客用的Access换成sqlite
     回复 引用 查看