Эффективное обновление таблицы SQLite с большим количеством записей - PullRequest
4 голосов
/ 15 мая 2010

Я пытаюсь использовать sqlite (sqlite3) для проекта для хранения сотен тысяч записей (хотелось бы, чтобы sqlite не давала пользователям программы запускать [мой] сервер sql).

Мне иногда приходится обновлять сотни тысяч записей, чтобы вводить левые и правые значения (они иерархические), но нашел стандарт

update table set left_value = 4, right_value = 5 where id = 12340;

очень медленно. Я пытался окружить каждую тысячу или около того с

begin;
....
update...
update table set left_value = 4, right_value = 5 where id = 12340;
update...
....
commit;

но опять же очень медленно. Странно, потому что, когда я заполняю его несколькими сотнями тысяч (со вставками), оно заканчивается за секунды.

В настоящее время я пытаюсь проверить скорость в python (медлительность в командной строке и python), прежде чем переместить ее в реализацию C ++, но сейчас это медленный способ, и мне нужно найти новое решение, если только Я делаю что-то не так. Мысли? (взял бы альтернативу SQLite с открытым исходным кодом, которая также переносима)

Ответы [ 2 ]

12 голосов
/ 15 мая 2010

Создать индекс на table.id

create index table_id_index on table(id)
3 голосов
/ 15 мая 2010

Помимо проверки наличия индекса, вы можете просмотреть FAQ по оптимизации SQLite .

Использование транзакций может значительно увеличить скорость, как вы упоминали, и вы также можете попытаться отключить ведение журнала.

Пример 1:

2.2 PRAGMA синхронно

Логическое управление синхронными значениями будет ли библиотека ждать для записи на диск для полной записи в диск, прежде чем продолжить. Эта настройка может отличаться от Синхронное значение по умолчанию, загруженное из база данных. В типичном использовании библиотека может потратить много времени просто ожидание в файловой системе. настройка "PRAGMA синхронный = OFF" может сделать большая разница в скорости.

Пример 2:

2.3 PRAGMA count_changes

Когда настройка count_changes включена, функция обратного вызова вызывается один раз для каждого DELETE, INSERT или UPDATE операция. Аргумент номер строк, которые были изменены. если ты не используйте эту функцию, есть небольшое увеличение скорости от поворота этого выкл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...