Sqlite3: Отключение первичного ключевого индекса при вставке?

У меня есть база данных Sqlite3 со столом и основным ключом, состоящим из двух ютурогеров, и я пытаюсь вставить много данных в него (т.е. около 1 ГБ или около того)

Вопрос, который я имею в том, что создание основного ключа также косвенно создает индекс, который в моем случае болота вниз вставки для сканирования после нескольких коммитов (и это было бы потому, что файл базы данных находится на NFS. вздох ).

Так, я хотел бы как-то временно отключить этот индекс. Мой лучший план до сих пор участие снижается автоматический индекс первичного ключа, однако кажется, что S'Lite не нравится, и бросает ошибку, если я пытаюсь это сделать.

Мой второй лучший план будет включать в себя приложение сделать прозрачные копии базы данных на сетевом диске, внесение изменений, а затем слияние его обратно. Обратите внимание, что в отличие от большинства вопросов, заданных S'lite/NFS, мне не нужен параллелизм доступа.

Что было бы правильным способом сделать что-то подобное?

ОБНОВЛЕНИЕ:

Я забыл указать флаги я уже использую:

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

ОБНОВЛЕНИЕ 2: Я на самом деле вставки элементов в партии, однако каждая следующая партия медленнее, чтобы совершить, чем предыдущий (я предполагаю, что это связано с размером индекса). Я попытался делать партии между 10k и 50k tuples, каждый из которых два стагерей и поплавок.

Ответ на: "Sqlite3: Отключение первичного ключевого индекса при вставке?"

Количество ответов:3

Вы делаете INSERT of each new as an individual Transaction? каждого нового в качестве индивидуальной сделки?

Если вы используете строки BEGIN TRANSACTION and INSERT rows in batches then I think the index will only get rebuilt at the end of each Transaction. rows in batches then I think the index will only get rebuilt at the end of each Transaction. и INSERT rows in batches then I think the index will only get rebuilt at the end of each Transaction. в пакетах, то я думаю, что индекс будет восстановлен только в конце каждой сделки.

  1. Вы не можете удалить встроенный индекс, так как это единственный адрес строки.
  2. Слияние ваших 2 клавиши в одном длинном ключе - (key1'lt;lt;32) и key2; и сделать это в качестве INTEGER PRIMARY KEY в youd схеме (в этом случае у вас будет только 1 индекс)
  3. Размер страницы для нового DB по крайней мере 4096
  4. Удалить любой дополнительный индекс, кроме первичного
  5. Заполните данные в порядке SORTED так, что основной ключ растет.
  6. Повторное использование команд, не создайте каждый раз, когда они от строки
  7. Набор размер кэша страницы столько памяти, сколько вы оставили (помните, что размер кэша в количестве страниц, но не количество байтов)
  8. Коммит каждые 50000 элементов.
  9. Если у вас есть дополнительные индексы - создать их только после того, как все данные в таблице

Если вы сможете объединить ключ (я думаю, что вы используете 32bit, в то время как sqlite с помощью 64bit, так что это возможно) и заполнить данные в отсортированном порядке я пару вы будете заполнять в вашем первом Гб с той же производительности, как второй и оба будут достаточно быстро.