我有一个带有表的Sqlite3数据库和一个由两个整数组成的主键,我正在尝试向其中插入大量数据(即大约1GB左右)
我遇到的问题是创建主键还隐式创建了一个索引,在我的情况下,在一些提交后将插入陷入爬行(这可能是因为数据库文件在NFS上。叹息)。
所以,我想以某种方式临时禁用该索引。到目前为止,我最好的计划是删除主键的自动索引,但似乎SQLite不喜欢它并且如果我尝试这样做会抛出错误。
我的第二个最佳计划是让应用程序在网络驱动器上制作透明的数据库副本,进行修改然后将其合并。请注意,与大多数SQlite / NFS问题相反,我不需要访问并发。
这样做的正确方法是什么?
更新
我忘了指定我已经使用的标志:
PRAGMA synchronous = OFF
PRAGMA journal_mode = OFF
PRAGMA locking_mode = EXCLUSIVE
PRAGMA temp_store = MEMORY
更新2: 我实际上是在批量插入项目,但是每个下一批都比前一个批处理要慢(我假设这与索引的大小有关)。我尝试了10k到50k元组之间的批处理,每个元组都是两个整数和一个浮点数。
答案 0 :(得分:11)
如果你能够合并密钥(我认为你正在使用32位,而sqlite使用64位,那么它是可能的)并按排序顺序填充数据我打赌你将填写你的第一个Gb,其性能与第二,两者都足够快。
答案 1 :(得分:6)
您是否正在将每个新的INSERT
作为单个交易进行操作?
如果您批量使用BEGIN TRANSACTION
和INSERT
行,那么我认为索引只会在每次交易结束时重建。
答案 2 :(得分:3)