相关疑难解决方法(0)

由于索引,SQLite插入速度会随着记录数量的增加而减慢

原始问题

背景

众所周知,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行的表的高插入率?

已知的解决方法,如果可能,我想避免

  • 删除索引,添加记录和重新索引:这可以作为一种解决方法,但在更新期间仍需要使用数据库时不起作用.在x分钟/天内完全无法访问数据库是行不通的
  • 将表分成较小的子表/文件:这将在短期内起作用,我已经尝试过它.问题是我需要能够在查询时从整个历史记录中检索数据,这意味着最终我将达到62表附件限制.附加,收集临时表中的结果,并且每个请求分离数百次似乎是很多工作和开销,但如果没有其他选择,我会尝试它.
  • 设置 SQLITE_FCNTL_CHUNK_SIZE:我不知道C(?!),所以我不想仅仅为了完成这项工作而学习它.我看不到使用Perl设置此参数的任何方法.

UPDATE

蒂姆的建议,一个指数,尽管SQLite的的说法,它能够处理大型数据集导致越来越缓慢插入时间,我进行以下设置的基准进行比较:

  • 插行:1400万
  • 提交批量大小:50,000条记录
  • cache_sizepragma:10,000
  • page_size实用语:4,096
  • temp_storepragma:记忆
  • journal_modepragma:删除
  • synchronouspragma:关闭

在我的项目中,与下面的基准测试结果一样,创建了基于文件的临时表,并使用了SQLite对导入CSV数据的内置支持.然后将临时表附加到接收数据库,并使用insert-select语句插入50,000行的集合 .因此,插入时间不会将文件反映到数据库插入时间,而是反映 表到表的插入速度.考虑CSV导入时间会使速度降低25-50%(非常粗略估计,导入CSV数据不需要很长时间).

显然有一个索引会导致插入速度随着表格大小的增加而减慢.

SQLite插图速度和表大小的图

从上面的数据可以清楚地看出,正确的答案可以分配给Tim的答案,而不是SQLite无法处理它的断言.显然,如果索引该数据集不是您的用例的一部分,它可以处理大型数据集.我一直在使用SQLite作为日志记录系统的后端,暂时 …

database sqlite optimization insert

60
推荐指数
2
解决办法
2万
查看次数

标签 统计

database ×1

insert ×1

optimization ×1

sqlite ×1