我有一个带有表的Sqlite3数据库和一个由两个整数组成的主键,我正在尝试向其中插入大量数据(即大约1GB左右)
我遇到的问题是创建主键也隐式创建了一个索引,在我的情况下,在几次提交之后将插入陷入爬行(这可能是因为数据库文件在NFS上.. 叹息).
所以,我想以某种方式临时禁用该索引.到目前为止,我最好的计划是删除主键的自动索引,但似乎SQLite不喜欢它并且如果我尝试这样做会抛出错误.
我的第二个最佳计划将涉及应用程序在网络驱动器上制作透明的数据库副本,进行修改然后将其合并.请注意,与大多数SQlite/NFS问题相反,我不需要访问并发.
做这样的事情的正确方法是什么?
更新:
我忘了指定我已经使用的标志:
PRAGMA synchronous = OFF PRAGMA journal_mode = OFF PRAGMA locking_mode = EXCLUSIVE PRAGMA temp_store = MEMORY
更新2: 我实际上是批量插入项目,但是每个下一批次的提交都比前一个更慢(我假设这与索引的大小有关).我尝试了10k到50k元组之间的批处理,每个元组是两个整数和一个浮点数.
您无法删除嵌入索引,因为它是行的唯一地址.
在单个长键中合并2个整数键=(key1 << 32)+ key2; 并将其作为youd架构中的INTEGER PRIMARY KEY(在这种情况下,您将只有1个索引)
将新数据库的页面大小设置为至少4096
删除除primary之外的任何其他索引
按SORTED顺序填写数据,以便主键增长.
重用命令,不要每次从字符串创建它们
将页面缓存大小设置为您剩余的内存(请记住缓存大小是页数,但不是字节数)
每50000件商品.
如果您有其他索引 - 仅在表中包含所有数据后创建它们
如果你能够合并密钥(我认为你使用32位,而sqlite使用64位,那么它是可能的)并按排序顺序填充数据我打赌你将填写你的第一个Gb,其性能与第二个相同会足够快.
你是在做INSERT
每个新的个人交易吗?
如果您批量使用BEGIN TRANSACTION
和INSERT
行,那么我认为索引只会在每个交易结束时重建.