Всем привет.
Пишу прогу с использованием sqlite. Прога держит в базе порядка 2-5 миллионов записей. Высасывание даже всех сразу записей отрабатывает за секунду-две. А вот вставка идёт нереально долго. Даже 3 тысячи записей вставляются минут пять. При этом загрузка проца по нулям, индикатор обращения к диску просто горит, а не моргает. В итоге всего этого получается файлик в 50 килобайт. За пять минут!!! Создание базы в миллионы записей я не дождался, перенёс её в tmpfs, после этого база начала создаваться за минуты.
В целом проблема понятна, медленный диск, отсутствие файлового кеша для операций изменения бд и бла бла бла. Только стоит SSD и скорость записи упирается в предел сата2. А вот у конечных потребителей вероятнее всего будет тот самый бла бла бла, да ещё и под виндой.
Я очень мало работал с базами данных, с sqlite вообще мой первый опыт. Подскажите пожалуйста, можно ли как-то ускорить операции insert, или создавать базу в оперативке, а после завершения инсертов кидать на диск. Я пишу на c++ с Qt. Идеальным вариантом было бы скормить в QSqlDatabase что-нибудь вроде QBuffer, я такого способа не нашел. Ну а tmpfs не годится по причине, что прога должна будет ещё и в винде работать.
Пользователь решил продолжить мысль 28 Сентября 2014, 02:04:02:
Небольшой эффект дало использование QSqlDatabase::transaction() и QSqlDatabase::commit(). Небольшое количество данных, порядка 10000 записей, втыкается меньше чем за секунду на ssd, а девять с половиной миллионов записей на tmpfs работало 15 минут. И я начал подозревать, что скорость вставки напрямую зависит от размера базы. Я пробовал использовать и PK INTEGER AUTOINCREMENT, и INTEGER, который ручками делал инкрементом, разницы не увидел, но имхо основные тормоза на уникальных полях. Можно ли отключить их контроль, чтоб я сам их формировал и контролил? Ещё что-то про индексы пишут, но что-то я не догоняю, по-моему они селекту помогают, а вставка только долше от них будет.