Поэтому я провел несколько тестов с sqlite для очень больших файлов и пришел к некоторым выводам (по крайней мере, для моего конкретного приложения).
В тестах используется один файл sqlite с одной или несколькими таблицами. В каждой таблице было около 8 столбцов, почти все целые числа и 4 индекса.
Идея заключалась в том, чтобы вставить достаточно данных, пока размер файлов sqlite не достигнет 50 ГБ.
Одноместный стол
Я попытался вставить несколько строк в файл sqlite только с одной таблицей. Когда размер файла составлял около 7 ГБ (извините, я не могу точно сказать, сколько строк) вставки занимали слишком много времени. Я подсчитал, что мой тест для вставки всех моих данных займет около 24 часов, но он не завершился даже после 48 часов.
Это приводит меня к выводу, что у одной очень большой таблицы sqlite будут проблемы со вставками и, возможно, с другими операциями.
Я думаю, это не удивительно, поскольку таблица становится больше, вставка и обновление всех индексов занимает больше времени.
Несколько столов
Затем я попытался разделить данные по времени на несколько таблиц, по одной таблице в день. Данные для исходной таблицы 1 были разделены на ~ 700 таблиц.
У этой настройки не было проблем со вставкой, она не занимала больше времени, так как новая таблица создавалась для каждого дня.
Проблемы с вакуумом
Как указано в i_like_caffeine, команда VACUUM является проблемой, когда файл sqlite больше. По мере выполнения большего количества операций вставки / удаления фрагментация файла на диске будет ухудшаться, поэтому цель состоит в том, чтобы периодически VACUUM оптимизировать файл и восстанавливать файловое пространство.
Однако, как указано в документации , полная копия базы данных создается для создания вакуума, на завершение которого уходит очень много времени. Таким образом, чем меньше база данных, тем быстрее завершится эта операция.
Выводы
Для моего конкретного приложения я, вероятно, буду разбивать данные по нескольким файлам БД, по одному в день, чтобы получить как максимальную производительность, так и скорость вставки / удаления.
Это усложняет запросы, но для меня целесообразно индексировать такое количество данных. Дополнительным преимуществом является то, что я могу просто удалить весь файл базы данных, чтобы отбрасывать данные за день (обычная операция для моего приложения).
Возможно, мне придется отслеживать размер таблицы на файл, чтобы увидеть, когда скорость станет проблемой.
Жаль, что, похоже, нет другого метода добавочного вакуума, кроме автоматического вакуума . Я не могу использовать его, потому что моя цель для вакуума - дефрагментировать файл (файловое пространство не имеет большого значения), чего не делает автоматический вакуум. Фактически, в документации говорится, что это может ухудшить фрагментацию, поэтому мне приходится периодически прибегать к созданию полного вакуума в файле.