当前位置:  开发笔记 > 编程语言 > 正文

SQLite性能基准 - 为什么:内存:这么慢......只有磁盘的1.5倍速度?

如何解决《SQLite性能基准-为什么:内存:这么慢只有磁盘的1.5倍速度?》经验,为你挑选了5个好方法。

这与SQLite有页面缓存这一事实有关.根据文档,默认页面缓存是2000个1K页面或大约2Mb.由于这大约是您数据的75%到90%,因此两个数字非常相似并不奇怪.我的猜测是,除了SQLite页面缓存之外,其余数据仍然在OS磁盘缓存中.如果你有SQLite来刷新页面缓存(和磁盘缓存),你会发现一些非常重要的差异.



1> Thomas Jones..:

这与SQLite有页面缓存这一事实有关.根据文档,默认页面缓存是2000个1K页面或大约2Mb.由于这大约是您数据的75%到90%,因此两个数字非常相似并不奇怪.我的猜测是,除了SQLite页面缓存之外,其余数据仍然在OS磁盘缓存中.如果你有SQLite来刷新页面缓存(和磁盘缓存),你会发现一些非常重要的差异.



2> ddevienne..:

我的问题是,你想要做什么标杆?

正如已经提到的,SQLite的:memory:DB与基于磁盘的DB相同,即分页,唯一的区别是页面永远不会写入磁盘.因此,两者之间的唯一区别是磁盘写入:内存:不需要做(当磁盘页面必须从缓存中卸载时,它也不需要进行任何磁盘读取).

但是,从缓存中读取/写入可能只代表查询处理时间的一小部分,具体取决于查询.您的查询有一个where子句,其中包含两组大的id,所选行必须是其成员,这很昂贵.

由于卡里米尔萨普在他的博客中展示了优化的Oracle(这里有一个代表职务:http://carymillsap.blogspot.com/2009/06/profiling-with-my-boy.html),你需要了解哪些查询的部分处理需要时间.假设集合成员资格测试代表查询时间的90%,而基于磁盘的IO代表10%,则:内存:仅保存10%.这是一个不太具有代表性的极端例子,但我希望它说明您的特定查询倾斜结果.使用更简单的查询,并且查询处理的IO部分将增加,从而受益:memory:.

最后一点,我们使用SQLite的虚表,您身在何处负责实际的存储空间,并通过使用C++的容器,这是不同于存储单元格的值的SQLite的方式输入时,我们都可以看到处理时间的显著improment结束:记忆:,但这有点话题;)--DD

PS:我没有足够的业力来评论这个帖子最受欢迎的帖子,所以我在这里评论:)说最近的SQLite版本默认情况下在Windows上不使用1KB页面:http:// www. sqlite.org/changes.html#version_3_6_12



3> vartec..:

你正在做SELECT,你正在使用内存缓存.尝试将SELECT与UPDATE交错.



4> Mash..:

SQLite中的内存数据库实际上是永远不会触及磁盘的页面缓存.所以你应该忘记在SQLite中使用内存db来进行性能调整

可以关闭日志,关闭同步模式,设置大页面缓存,在大多数操作中您将获得几乎相同的性能,但耐用性将会丢失.

从您的代码中可以清楚地看出,您应该重新使用命令和ONLY BIND参数,因为这样可以消除90%以上的测试性能.



5> jankos..:

谢谢你的代码.我已经在2 x XEON 2690上测试了带有192GB RAM和4个SCSI 15k硬盘的RAID 5,结果如下:

  disk | memory | qsize
-----------------------
6.3590 | 2.3280 | 15713
6.6250 | 2.3690 | 8914
6.0040 | 2.3260 | 225168
6.0210 | 2.4080 | 132388
6.1400 | 2.4050 | 264038

内存的速度提升很重要.

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有