插入时禁用主键索引

问题描述 投票:0回答:3

在我的 SQLite 数据库(带有一个表和一个由两个整数组成的主键)中,我插入了大约 1GB 的数据。创建主键会隐式创建一个索引,该索引会在几次提交后减慢插入速度,因此我想暂时禁用该索引。

删除主键的自动索引时,SQLite 会抛出错误。我可以让应用程序在网络驱动器上制作数据库的透明副本,进行修改,然后将其合并回来。与大多数 SQLite/NFS 问题相反,我不需要访问并发性。正确的做法是什么?

我正在使用:

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

我正在批量插入。下一批的提交速度比前一批慢(假设由于索引的大小)。我尝试了 10k 到 50k 行之间的批次(两个整数和一个浮点数的元组)。

sql sqlite indexing insert primary-key
3个回答
11
投票
  1. 您无法删除嵌入索引,因为它是行的唯一地址。
  2. 将 2 个整数键合并为单个长键 = (key1<<32) + key2; and make this as a INTEGER PRIMARY KEY in youd schema (in that case you will have only 1 index)
  3. 将新数据库的页面大小设置为至少 4096
  4. 删除除主索引之外的任何其他索引
  5. 按排序顺序填写数据,以便主键不断增长。
  6. 重用命令,不要每次都从字符串创建
  7. 将页面缓存大小设置为剩余内存大小(请记住,缓存大小是页面数,而不是字节数)
  8. 每 50000 个项目就提交一次。
  9. 如果您有其他索引 - 仅在所有数据都位于表中之后创建它们

如果您能够合并密钥(我认为您使用的是32位,而sqlite使用64位,所以这是可能的)并按排序顺序填充数据,我打赌您将填写第一个GB,其性能与第二个和两者都足够快。


6
投票

您是否将每个新交易的

INSERT
作为单独的交易进行?

如果您批量使用

BEGIN TRANSACTION
INSERT
行,那么我认为索引只会在每个事务结束时重建。


3
投票
© www.soinside.com 2019 - 2024. All rights reserved.