2017-08-08 111 views
0

我需要将大量数据插入到sqlite数据库中。数据被连续接收。使用SQlite批量插入

最好是:准备语句,开始一个事务,做一些插入,在一定量的插入结束事务之后,重复循环或者缓存数据,偶尔打开db,做批量插入,关闭db ,继续缓存?

是否有任何其他提示如何以最有效的方式做到这一点?

+0

如果通过“批量插入”,您的意思是构建一个含有大量“VALUES”条目的庞大的INSERT语句,那么这几乎肯定不是这样。也不会有大量的隐式事务INSERT语句。这使得准备好的语句插入批处理事务中,在这种情况下,数据源是来自“传入流”还是缓存可能没有多大区别。 – TripeHound

+0

如果您的表具有索引,并且其他因素允许,则删除它们并(重新)在最后创建它们比在整个批量更新中维护它们更快。但是如上所述,影响速度的因素有很多,所以总是推荐使用不同方法的基准。 – TripeHound

+0

在HDD中累积数据将比在HDD中这样做效率更高。所以你必须考虑你的内存需求,并且可能在RAM中积累时丢失数据。 – Megamozg

回答

1

你的两种情况唯一的区别是你正在关闭数据库连接。这通常不是一个好主意,因为它会丢弃页面缓存。 只有当您的内存非常少且真的需要其他东西时,关闭连接才有用。

重要的是把许多插入到一个单一的事务,但你已经这样做。

问题是有多少插入属于一个事务。 如果您可以并行执行接收和数据库操作,那么您应该只需插入自上次批次以来收到的所有数据。 (这将导致连续的数据库操作。) 为更长的定时器缓存数据是没有意义的,除非您想避免执行太多的磁盘I/O操作。

如果您有一定的性能要求,那么您必须测量自己。

+0

“......没有意义,除非你想避免做太多的磁盘I/O”。减少磁盘IO操作的数量可以提高性能。这是有道理的,因为表现是有问题的。 – Megamozg

+0

@Megamozg在DB操作与其他东西并行完成的情况下,磁盘I/O的数量与性能无关。如果其他I/O也需要磁盘,那么这种情况下你想避免从数据库中做太多事情。 –