【发布时间】:2012-03-27 13:58:00
【问题描述】:
我将 system.data.sqlite 包装器用于缓存大量数据的应用程序。几乎所有这些数据都进入 1 个包含 3 列的表。缓存中的数据从 Web 服务调用中拉下并循环插入数据库,直到缓存完整的数据集。对 Web 服务的每次调用都会拉取 3000 条记录,并在 1 个事务中将它们插入到数据库中。
在数据库增长到大约 8MB 之后,插入开始变慢,并且在每个事务提交之后创建了一个 2-3MB 的日志文件。这会导致大量 I/O,实际上会减慢操作系统 (Windows XP) 的速度,以至于对事务提交无响应。
我读到 SQLite 不使用聚集索引,所以我不确定数据是如何排序的,或者是否在插入时排序。数据根本没有按顺序插入。
如果发现这个问题,最令人困惑的事情是,这只发生在我们调用生产 Web 服务时,QA 的 Web 服务不会导致在每次事务提交时创建这个大的日志文件(QA 中的那个是大约 2KB-14KB)。 Web 服务正在从 SQLServer 数据库中检索数据。生产和 QA 之间的唯一区别是 QA 的数据库是大约一年前生产的备份。缓存算法将首先从最旧的数据开始,在这种情况下,这两个数据库(QA 和 Prod)应该 99% 相同。
SQLite 是否会因为插入无序数据并且必须拆分页面而创建这个大型日志文件?升级到 WAL 会缓解这个问题吗?
【问题讨论】:
-
Prod 和 QA 中的表结构是否相同? Sqlite 是否使用相同的文件版本?
-
请提供有关架构、您使用的索引、从 Web 服务检索数据的顺序以及您希望缓存的记录总数的更多信息。使用内存数据库从您的 Web 服务进行初始播种可能更有效。
标签: .net sql database sqlite system.data.sqlite