众所周知,SQLite 需要经过精细调整,以实现大约50k插入/秒的插入速度.这里有很多关于缓慢插入速度和大量建议和基准的问题.
还有声称SQLite可以处理大量数据,50 GB以上的报告不会导致正确设置出现任何问题.
我已经按照这里和其他地方的建议来实现这些速度,我很高兴35k-45k插入/秒.我遇到的问题是所有的基准测试只能显示<1m记录的快速插入速度.我所看到的是插入速度似乎与表格大小成反比.
我的用例要求[x_id, y_id, z_id]
在链接表中存储500米到1b元组()几年(1米行/天).值均为介于1和2,000,000之间的整数ID.有一个索引z_id
.
前10米行的性能非常好,约35k插入/秒,但是当表有~20m行时,性能开始下降.我现在看到大约100个插入/秒.
桌子的大小不是特别大.对于20米行,磁盘上的大小约为500MB.
该项目是用Perl编写的.
这是SQLite中大型表的现实,还是有任何保密措施来维护 > 10m行的表的高插入率?
SQLITE_FCNTL_CHUNK_SIZE
:我不知道C(?!),所以我不想仅仅为了完成这项工作而学习它.我看不到使用Perl设置此参数的任何方法.继蒂姆的建议,一个指数,尽管SQLite的的说法,它能够处理大型数据集导致越来越缓慢插入时间,我进行以下设置的基准进行比较:
cache_size
pragma:10,000page_size
实用语:4,096temp_store
pragma:记忆journal_mode
pragma:删除synchronous
pragma:关闭在我的项目中,与下面的基准测试结果一样,创建了基于文件的临时表,并使用了SQLite对导入CSV数据的内置支持.然后将临时表附加到接收数据库,并使用insert-select
语句插入50,000行的集合
.因此,插入时间不会将文件反映到数据库插入时间,而是反映
表到表的插入速度.考虑CSV导入时间会使速度降低25-50%(非常粗略估计,导入CSV数据不需要很长时间).
显然有一个索引会导致插入速度随着表格大小的增加而减慢.
从上面的数据可以清楚地看出,正确的答案可以分配给Tim的答案,而不是SQLite无法处理它的断言.显然,如果索引该数据集不是您的用例的一部分,它可以处理大型数据集.我一直在使用SQLite作为日志记录系统的后端,暂时 …