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

Тема в разделе "SQL", создана пользователем OMu4KA, 3 апр 2008.

  1. OMu4KA

    OMu4KA Гость

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

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

    OMu4KA Гость

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

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

    Спасибо всем!
     
Загрузка...
Похожие Темы - Скорость выполнения записи
  1. swyatogor
    Ответов:
    48
    Просмотров:
    2.086
  2. aameno2
    Ответов:
    21
    Просмотров:
    1.198
  3. phil124
    Ответов:
    0
    Просмотров:
    1.117
  4. JAR
    Ответов:
    0
    Просмотров:
    1.445
  5. rinsk
    Ответов:
    6
    Просмотров:
    2.753

Поделиться этой страницей