惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
V2EX
C
Check Point Blog
博客园_首页
B
Blog
D
Docker
U
Unit 42
量子位
I
InfoQ
有赞技术团队
有赞技术团队
Martin Fowler
Martin Fowler
GbyAI
GbyAI
L
LangChain Blog
云风的 BLOG
云风的 BLOG
博客园 - Franky
美团技术团队
T
The Blog of Author Tim Ferriss
阮一峰的网络日志
阮一峰的网络日志
月光博客
月光博客
Vercel News
Vercel News
Recent Announcements
Recent Announcements
雷峰网
雷峰网
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
Google DeepMind News
Google DeepMind News

博客园 - 怪怪

分支语句、面向对象,和心智包袱 复杂是个筐,什么都往里装 关于信息隐藏的感想及其它废话 由铁路订票系统联想到的 检讨和一些对C的新看法 关于异地高考引发的又一次舆论攻势 拿到了乔布斯传 媒体啊媒体 不要让橄榄枝从我的手中落下 最近的一些想法和总结 这个我觉得是苹果的一个严重坏影响 关于地沟油 数据存储体会 .NET终于也沦陷了 犯了一个策略上的错误 关于安全性的笔记 单方面评价下GEB 回复一个认为实践在数学之前的朋友 再论抽象
数据存储插入性能测试笔记
怪怪 · 2011-06-22 · via 博客园 - 怪怪

SQL Server怎么也启动不了了(忘了我原来对它做了啥了),懒得折腾或者装别的数据库了,引用下网上查到别人的。

http://www.sqlite.org/cvstrac/wiki?p=SpeedComparison

需要说明的是SQLite老版本第一个1000插入的测试似乎比这个快得多,见这里: http://www.sqlite.org/speed.html

http://www.mongodb.org/pages/viewpage.action?pageId=1475411

http://sqlserverperformance.wordpress.com/2010/02/07/some-initial-insert-test-benchmarks-on-sql-server-2008-r2/

我的结果,老机PD820,7200RPM SATA硬盘,插入是1620条的情况下:每条都sync到磁盘上的话,1.6秒;如果不sync,是0.2秒,大概每秒8000多。当前还不包括查询和其它操作,没有做完;不过做完了也没法和SQL类的比了。

这是python版的结果,生成数据就得用0.015秒,算上其它逻辑的开销,将来C版nosync应该能再提高50%到200%,sync是没戏了(瓶颈在IO)。说白了就是达到和别人相似的性能应该没什么脑力障碍,也无需参考别人的算法。

不过现在已经比别人快或者和别人差不多快是不作数的。SQL Server这样要干一大堆额外工作的就不要说了,SQLite、Mongo之流也都有更多动作降低速度。等我这个实现完整了也避免不了,毕竟这东西在底层基本是同质化的。

关于SQL Server,上面那个测试里提到如何提速写日志的时间,这个想根本解决只有靠硬件。因为日志的保障数据不出问题的原理就是,每次必须写到硬盘上,接下来才做真正的更新操作。SQLite也有事务,但它这块简单得多。

其实现在数据库的测试对一般人完全没有参考价值。就我的实践来看,对于数据库的局部设计和实现,绝不可能有什么突破性的东西,最多是些许的提高。恰恰是慢的数据库更应该引起兴趣:它提供了什么特性,让它不得不付出代价?

如果nosync的话,很显然还得至少保证下数据不会因为掉电、死机、崩溃之类的意外事故损坏数据。另外可以提供批量操作的接口让使用者选择是不是马上写回硬盘。这就有点事务的意味了,不过谨记不要真的实现完整数据库功能。

注意:批量操作并非说就是根据用户申请临时nosync就够,很显然的,比如bulkinsert一类的功能,明显应该把数据记录在内存里拼接在一起,一次性写入一大坨。想必SQLite在一个Transcation里每秒3、4万的插入就是这么来的。

另外,印象里BerkeleyDB在某些测试中有特别可怕的插入性能,10倍左右于SQLite的操作数,这个有空得确认和研究一下(估计是上面方法加吃内存吃出来的)。不过这个初步考虑不是应该优先去做的事情,因为使用场景并不多。

顺便夸奖python两句,虽然慢的吓人,但风格比较适合原型包括算法类的,慢能放大瓶颈反而对找问题有帮助 -_-。