• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Скорость выполнения записи в Sqlite

  • Автор темы OMu4KA
  • Дата начала
O

OMu4KA

Здравствуйте!
Собственно, мне нужно осуществлять динамическую запись в журнал происходящих в программе изменений. Делаю это с помощью базы данных SQLite. Пишу на С++, используя исходные тексты на С - sqlite-source-3_3_15.
Хотелось бы оптимизировать скорость выполнения записи в таблицу.
Для записи использую только функцию sqlite3_exec(..,"INSERT INTO ...",..);
Базу открываю и закрываю только один раз в процессе работы программы.
Так как вставка записей в таблицу (INSERT) происходит очень часто (несколько сотен в секунду), то программа сильно тормозит. Судя по всему, медленная работа винчестера, так как загрузка процессора при этом небольшая.
Вроде движок SQLite называют самым быстрым.
Или для этой цели вообще любая база данных не подойдет и надо использовать другие механизмы, вроде записи в текстовые или бинарные файлы?
Может кто-нибудь подсказать?
 
E

European

Если я правильно понимаю, то sqlite3_exec начинает транзакцию, вставляет запись, завершает транзакцию. На выполнение транзакций требуется относительно много времени. Т.е. Ваш способ очень не производителен.
Первым шагом улучшения производительности является использование многострочных вставок (Multirow inserts) (синтаксис ). Размер вставок для Вашего случая можно попробовать в районе 10-20. Далее, возможно Ваша таблица индексирована или имеет триггеры вставки, что тоже будет давать замедление.
Следующим шагом стоит отметить оптимизацию добавляемых данных, т.к., возможно, их можно представить более компактно.
На сколько мне известно, коньком движков подобных SQLLite является быстрая выборка данных, но никак не их вставка. Возможно, быстрее писать в файл...
В общем, Вы дали слишком мало информации чтобы посоветовать что-то конкретное
 
O

OMu4KA

Если я правильно понимаю, то sqlite3_exec начинает транзакцию, вставляет запись, завершает транзакцию. На выполнение транзакций требуется относительно много времени. Т.е. Ваш способ очень не производителен.

Большое спасибо!
Теперь записи накапливаю в отдельном списке, а потом все сразу записываю в таблицу в одной транзакции:
[codebox]BEGIN;
INSERT INTO Log VALUES (...);
INSERT INTO Log VALUES (...);
INSERT INTO Log VALUES (...);
...
COMMIT;[/codebox]
(мультистроковый ввод моя версия SQLite не поддерживает).

Плюс вынесла процедуру записи в отдельный поток (Windows).
Теперь со скоростью проблем нет :) .

Спасибо всем!
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!