2010-05-15 11 views
4

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

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

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, который является портативным, а)

ответ

12

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

create index table_id_index on table(id) 
+0

Ничего себе, это, похоже, сработало. Почему и где я могу больше узнать об этом? – blackrim

+0

Обзор оптимизатора SQLite3 находится по адресу http://www.sqlite.org/optoverview.html –

+0

@blackrim: На той же странице: http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html # indexes –

3

Другие, чем убедившись, что у вас есть индекс на месте, вы можете оформить в SQLite Optimization FAQ.

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

Пример 1:

2,2 ПРАГМА синхронное

Булева синхронное значение управляет , будет ли или нет библиотеки ждать для записи на диск, чтобы быть полностью записаны на диск перед продолжением. Этот параметр может отличаться от значения default_synchronous, загруженного из базы данных. При типичном использовании библиотека может потратить много времени только ожидания в файловой системе. Установка «PRAGMA synchronous = OFF» может сделать максимальную разность скоростей .

Пример 2:

2,3 ПРАГМА count_changes

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

+0

Нашел эту страницу, но, похоже, это не помогло. Может быть, бритье здесь здесь или там, но только около 1% или меньше. – blackrim

+0

Стоит отметить, что PRAGMA count_changes устарел. – cmorse

Смежные вопросы