即使有事务,SQLite 插入也会变慢

Posted

技术标签:

【中文标题】即使有事务,SQLite 插入也会变慢【英文标题】:SQLite Inserts get slower even with transactions 【发布时间】:2012-07-23 07:54:41 【问题描述】:

我在使用 sqlite 插入性能时遇到问题,即使是事务也是如此。 我的 android 应用程序从 Web 服务接收大约 23.000 行,我必须将它们插入到单个表中。

Web 服务是分区的,因此在对 WS 的每个请求中我都会收到大约 2000 行,并且我将 2000 个插入包装在一个事务中。完成这些插入后,我将新请求发送到 WS,并再次为新的 2000 行使用新事务。

一开始它工作正常。它每秒执行很多插入操作。但随着时间的推移,它变得越来越慢,最终以每秒 4 或 3 次插入结束,直到完成 23000 行。

桌子大小有问题吗?当它变大时,插入变慢? 有什么办法可以提高这么多数据的性能?

感谢您的帮助。

【问题讨论】:

您是否有任何索引可能会减慢它的速度?你确定你一次只插入 2000 个,而不是(到目前为止收到的所有数据)每次? 这听起来像是一个事务工作集在没有 COMMIT 的情况下扩展。 这一切都取决于您插入的数据,字符串会减慢您的数据库速度。这 2000 行的字节数是多少?插入 2000 行后数据库文件的大小差异是多少。我有一个 388000 行的数据库,文件大小为 64M,但数据都是双倍的。 您能发布实际启动事务并执行插入的代码的 sn-p 吗? 为什么要下载 23,000 条记录并尝试插入它们?让服务器生成一个包含 23,000 条记录的 SQLite 数据库,然后下载该数据库。 【参考方案1】:

How Do I Improve The Performance of SQLite? 问题中有一个很好的讨论 SQLite 性能的线程,非常好。如果您还没有使用它们,我至少会选择准备好的语句。

但是,由于您使用的是 Android,我猜您可能会遇到一些写入闪存的 I/O 瓶颈。尝试在不同制造商的不同设备上运行代码,看看是否有任何极端变化。

【讨论】:

【参考方案2】:

您应该使用数据分区。 因为您可以插入 100 - 100 个插入,因此过程会很顺利,不会出现数据丢失问题。

我假设您正在使用异步(可以是其他)线程的另一件事。

或者您也可以在最后一种情况下使用服务来一次消耗所有数据。

【讨论】:

以上是关于即使有事务,SQLite 插入也会变慢的主要内容,如果未能解决你的问题,请参考以下文章

即使我在单独的线程中运行,QT GUI 也会冻结

SQLite在使用参数和事务时不插入多于一行

使用事务的 Android SQLite 批量插入

superset连接sqlite频繁断开

在sqlite3中,插入事务中的选择可以成功吗?

SQLITE3插入大量数据,效率翻百倍