Форум программистов, компьютерный форум, киберфорум
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.70/30: Рейтинг темы: голосов - 30, средняя оценка - 4.70
28 / 28 / 3
Регистрация: 07.05.2013
Сообщений: 54
1

SQLite скорость записи в базу данных

19.05.2013, 12:46. Показов 5835. Ответов 4
Метки нет (Все метки)

Решил посмотреть SQLite и с чем его едят. Вроде со всем разобрался и очень все понравилось, кроме скорости записи в базу данных.
Решил потестить – на лету создать базу данных в ней сто таблиц и в каждую таблицу записать 1000 записей. В каждой таблице 16 столбцов реал + два столбца для хранения времени ввиде строк.

По идее для SQL-серверов это просто смешная задача, но вот SQLite на это потратил примерно 96 минут!!! При этом:
1. Загрузка проца 1-5% (при чем проц работает в энергосберегающем режиме на 800 МГц вместо 3000).
2. Размер базы данных по окончанию теста составил всего около 20 Мб. При этом винт на всем протяжении теста работал постоянно. Винт систематически подвергается дэфрагментации, да и размер файла явно указывает, что жесткий диск не может являться узким местом этого теста.

Теперь вопросы:
1. Это нормальная скорость записи для SQLite?
2. Что можно сделать для ускорения записи в базу данных?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.05.2013, 12:46
Ответы с готовыми решениями:

Правильно оформить базу данных Sqlite (Клиент и записи клиента)
Есть у меня база, Catalog 2200 записей, ClientsMap 1500 клиентов Соответственно у каждой...

Низкая скорость записи в базу данных (ADODB.Recordset)
Описание Файл эксель смотрит в ThisWorkbook.Path и находит базу данных. Выбирается база данных,...

Не открывает базу данных SQLITE
Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) { ...

Создать базу данных sqlite
Подскажите пожалуйста. Как создать базу данных SQLite? Хочу сделать проверку на наличии файла и...

4
78 / 78 / 15
Регистрация: 27.01.2013
Сообщений: 323
20.05.2013, 13:04 2
Стоит накопить записи в строке например, а потом все сразу записывать в базу в меньшем количестве транзакций.

Также цитирую отсюда:

А почему все жалуются, что SQLite — тормозит?

Две причины. Первая — настройки по умолчанию. Они работают на надежность, а не на производительность.
Вторая — непонимание механизма фиксации транзакций. По умолчанию после любой команды SQlite будет фиксировать транзакцию (то есть ожидать пока БД окажется в целостном состоянии для отключения питания). В зависимости от режима паранойи SQLite потратит на это от 50 до 300 мс (ожидая окончания записи данных на диск).

Что делать-то? Мне нужно вставить 100 тыс записей и быстро!

Удалить индексы, включить режим синхронизации OFF (или NORMAL), вставлять порциями по N тысяч (N — подобрать, для начала взять 5000). Перед вставкой порции сделать BEGIN TRANSACTION, после — COMMIT.
2
28 / 28 / 3
Регистрация: 07.05.2013
Сообщений: 54
23.05.2013, 07:12  [ТС] 3
Спасибо, за ссылку. Натыкался на её и раньше но до третьей закладки не до листывал :-(
На этот раз пришлось читать. После прочитанного тот же объем данных был записан на винт за 124 секуны, что примерно в 50 раз быстрее от моего первого варианте!
Остался один вопросик. Я заметил, что если в базе данных удалить таблицу и тд. объем не уменьшается и при попытке записать данные в базу скорость записи (при настройка по умолчанию) возрастает в 3-5 раз.
Теперь сам вопрос, как при создании базы данных на лету, указать желаемый размер базы (приблизительно он известен)?
0
78 / 78 / 15
Регистрация: 27.01.2013
Сообщений: 323
24.05.2013, 10:11 4
Как заранее указать размер не знаю.А насчет почему размер базы не уменьшается при удалении: неиспользуемое дисковое пространство добавляется во внутренний список свободного места и повторно используется при вставке данных. Для уменьшения базы, используется команда VACUUM. Однако VACUUM занимает некоторое время (от полсекунды на мегабайт). Но SQLite имеет альтернативу использованию команды VACUUM - режим auto-vacuum, который включается auto_vacuum прагмой.
2
Модератор
Эксперт .NET
3371 / 3030 / 464
Регистрация: 27.01.2014
Сообщений: 5,625
22.08.2016, 16:34 5
Цитата Сообщение от AndreyAndreev Посмотреть сообщение
После прочитанного тот же объем данных был записан на винт за 124 секуны, что примерно в 50 раз быстрее от моего первого варианте!
ссори за поднятие темы, проблема актуальна, не поделишься решением?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.08.2016, 16:34

Delphi запись данных в базу SQLite
Добрый день. Решил начать все-таки с основ. Разместите пожалуйста самый простой код, в котором...

Как открыть базу данных sqlite 3.x?
Программе надо получить историю из браузеров семейства Chromium. Все они хранят историю в файле...

Установка пароля на базу данных в SQLite
Возможно ли защитить базу данных, созданную посредством SQLite, паролем?А также возможно ли...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru