Sqlite3:插入时禁用主键索引?

时间:2009-04-25 08:57:41

标签: sqlite indexing insert primary-key

我有一个带有表的Sqlite3数据库和一个由两个整数组成的主键,我正在尝试向其中插入大量数据(即大约1GB左右)

我遇到的问题是创建主键还隐式创建了一个索引,在我的情况下,在一些提交后将插入陷入爬行(这可能是因为数据库文件在NFS上。叹息)。

所以,我想以某种方式临时禁用该索引。到目前为止,我最好的计划是删除主键的自动索引,但似乎SQLite不喜欢它并且如果我尝试这样做会抛出错误。

我的第二个最佳计划是让应用程序在网络驱动器上制作透明的数据库副本,进行修改然后将其合并。请注意,与大多数SQlite / NFS问题相反,我不需要访问并发。

这样做的正确方法是什么?

更新

我忘了指定我已经使用的标志:

PRAGMA synchronous = OFF
PRAGMA journal_mode = OFF
PRAGMA locking_mode = EXCLUSIVE
PRAGMA temp_store = MEMORY

更新2: 我实际上是在批量插入项目,但是每个下一批都比前一个批处理要慢(我假设这与索引的大小有关)。我尝试了10k到50k元组之间的批处理,每个元组都是两个整数和一个浮点数。

3 个答案:

答案 0 :(得分:11)

  1. 您无法删除嵌入式索引,因为它是行的唯一地址。
  2. 将单个长键中的2个整数键合并=(key1<< 32)+ key2;并将其作为youd架构中的INTEGER PRIMARY KEY(在这种情况下,您将只有1个索引)
  3. 为新数据库设置页面大小至少为4096
  4. 删除除主要
  5. 之外的任何其他索引
  6. 按SORTED顺序填写数据,以便主键增长。
  7. 重复使用命令,不要每次都从字符串
  8. 创建它们
  9. 将页面缓存大小设置为您剩余的内存量(请记住缓存大小是页数,而不是字节数)
  10. 每50000件商品。
  11. 如果您有其他索引 - 仅在表格
  12. 之后创建它们

    如果你能够合并密钥(我认为你正在使用32位,而sqlite使用64位,那么它是可能的)并按排序顺序填充数据我打赌你将填写你的第一个Gb,其性能与第二,两者都足够快。

答案 1 :(得分:6)

您是否正在将每个新的INSERT作为单个交易进行操作?

如果您批量使用BEGIN TRANSACTIONINSERT行,那么我认为索引只会在每次交易结束时重建。

答案 2 :(得分:3)