Форум программистов CODEBY.NET Хостинг в Беларуси — Active Technologies

Разработка бизнес сайтов

Нужны клиенты? Тогда сюда быстрее...
X   Сообщение сайта
(Сообщение закроется через 2 секунды)

Здравствуйте, гость ( Вход | Регистрация )




> Скорость выполнения записи в Sqlite, как оптимизировать?
OMu4KA
Вставить ник
сообщение 3:04:2008, 09:17
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 2
Регистрация: 3:04:2008
Пользователь №: 16 351



Репутация: - 0 +


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


==============
*****

Группа: Модеры
Сообщений: 1 740
Регистрация: 11:01:2007
Пользователь №: 8 750
Специализация: specialist



Репутация: - 27 +


Покажите какого вида команды идут. То что INSERT понятно, а в полном виде их посмотреть?
Но есть подозрение что дело в программе ...
Подняться вверх 
 
Сообщение #2
European
Вставить ник
сообщение 3:04:2008, 09:42
Цитата Ответить 


Божественный
*****

Группа: Модеры
Сообщений: 1 816
Регистрация: 4:09:2006
Из: Минск
Пользователь №: 6 316
Специализация: C++



Репутация: - 31 +


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


Новенький
*

Группа: Программист
Сообщений: 2
Регистрация: 3:04:2008
Пользователь №: 16 351



Репутация: - 0 +


Цитата(European @ 3:04:2008, 15:42 ) *
Если я правильно понимаю, то sqlite3_exec начинает транзакцию, вставляет запись, завершает транзакцию. На выполнение транзакций требуется относительно много времени. Т.е. Ваш способ очень не производителен.


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

(мультистроковый ввод моя версия SQLite не поддерживает).

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

Спасибо всем!
Подняться вверх 
 
Сообщение #4


Быстрый ответ  Ответить  Новая тема 

> Быстрый ответ
Полужирный
Курсив
Подчеркнутый
Вставить изображение
Смайлики
Цитата
Код
 
 Отправлять уведомления об ответах на e-mail |  Включить смайлики |  Добавить подпись
   

 

RSS Текстовая версия Сейчас: 17:05:2008 - 03:49
с нами можно связаться по:
телефону: +375-(29)-632-60-67
e-mail:info@codeby.net