这与SQLite有页面缓存这一事实有关.根据文档,默认页面缓存是2000个1K页面或大约2Mb.由于这大约是您数据的75%到90%,因此两个数字非常相似并不奇怪.我的猜测是,除了SQLite页面缓存之外,其余数据仍然在OS磁盘缓存中.如果你有SQLite来刷新页面缓存(和磁盘缓存),你会发现一些非常重要的差异.
这与SQLite有页面缓存这一事实有关.根据文档,默认页面缓存是2000个1K页面或大约2Mb.由于这大约是您数据的75%到90%,因此两个数字非常相似并不奇怪.我的猜测是,除了SQLite页面缓存之外,其余数据仍然在OS磁盘缓存中.如果你有SQLite来刷新页面缓存(和磁盘缓存),你会发现一些非常重要的差异.
我的问题是,你想要做什么标杆?
正如已经提到的,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
你正在做SELECT,你正在使用内存缓存.尝试将SELECT与UPDATE交错.
SQLite中的内存数据库实际上是永远不会触及磁盘的页面缓存.所以你应该忘记在SQLite中使用内存db来进行性能调整
可以关闭日志,关闭同步模式,设置大页面缓存,在大多数操作中您将获得几乎相同的性能,但耐用性将会丢失.
从您的代码中可以清楚地看出,您应该重新使用命令和ONLY BIND参数,因为这样可以消除90%以上的测试性能.
谢谢你的代码.我已经在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
内存的速度提升很重要.