Я знаю, что sqlite не очень хорошо работает с очень большими файлами баз данных, даже если они поддерживаются (на веб-сайте sqlite был комментарий о том, что если вам нужны файлы размером более 1 ГБ, вы можете рассмотреть возможность использования корпоративных rdbms. больше не могу найти, может быть связано с более старой версией sqlite).
Тем не менее, для моих целей я хотел бы получить представление о том, насколько это на самом деле плохо, прежде чем рассматривать другие решения.
Я говорю о файлах данных sqlite в диапазоне нескольких гигабайт, начиная с 2 ГБ. У кого-нибудь есть опыт с этим? Любые советы / идеи?
database
performance
sqlite
Snazzer
источник
источник
Ответы:
Поэтому я провел несколько тестов с sqlite для очень больших файлов и пришел к некоторым выводам (по крайней мере, для моего конкретного приложения).
В тестах используется один файл sqlite с одной или несколькими таблицами. В каждой таблице было около 8 столбцов, почти все целые числа и 4 индекса.
Идея заключалась в том, чтобы вставить достаточно данных, пока размер файлов sqlite не достигнет 50 ГБ.
Одноместный стол
Я попытался вставить несколько строк в файл sqlite только с одной таблицей. Когда размер файла составлял около 7 ГБ (извините, я не могу точно сказать, сколько строк) вставки занимали слишком много времени. Я подсчитал, что мой тест для вставки всех моих данных займет около 24 часов, но он не завершился даже после 48 часов.
Это приводит меня к выводу, что у одной очень большой таблицы sqlite будут проблемы со вставками и, возможно, с другими операциями.
Я думаю, это не удивительно, поскольку таблица становится больше, вставка и обновление всех индексов занимает больше времени.
Несколько столов
Затем я попытался разделить данные по времени на несколько таблиц, по одной таблице в день. Данные для исходной таблицы 1 были разделены на ~ 700 таблиц.
У этой настройки не было проблем со вставкой, она не занимала больше времени, так как новая таблица создавалась для каждого дня.
Проблемы с вакуумом
Как указано в i_like_caffeine, команда VACUUM является проблемой, когда файл sqlite больше. По мере выполнения большего количества операций вставки / удаления фрагментация файла на диске будет ухудшаться, поэтому цель состоит в том, чтобы периодически VACUUM оптимизировать файл и восстанавливать файловое пространство.
Однако, как указано в документации , полная копия базы данных создается для создания вакуума, на завершение которого уходит очень много времени. Таким образом, чем меньше база данных, тем быстрее завершится эта операция.
Выводы
Для моего конкретного приложения я, вероятно, буду разбивать данные по нескольким файлам БД, по одному в день, чтобы получить как максимальную производительность, так и скорость вставки / удаления.
Это усложняет запросы, но для меня целесообразно индексировать такое количество данных. Дополнительным преимуществом является то, что я могу просто удалить весь файл базы данных, чтобы отбрасывать данные за день (обычная операция для моего приложения).
Возможно, мне придется отслеживать размер таблицы на файл, чтобы увидеть, когда скорость станет проблемой.
Жаль, что, похоже, нет другого метода добавочного вакуума, кроме автоматического вакуума . Я не могу использовать его, потому что моя цель для вакуума - дефрагментировать файл (файловое пространство не имеет большого значения), чего не делает автоматический вакуум. Фактически, в документации говорится, что это может ухудшить фрагментацию, поэтому мне приходится периодически прибегать к созданию полного вакуума в файле.
источник
Мы используем DBS 50 ГБ + на нашей платформе. без жалоб работает отлично. Убедитесь, что вы все делаете правильно! Вы используете предопределенные заявления? * SQLITE 3.7.3
Примените эти настройки (сразу после создания БД)
Надеюсь, что это поможет другим, отлично работает здесь
источник
PRAGMA main.temp_store = MEMORY;
.Я создал базы данных SQLite размером до 3,5 ГБ без каких-либо заметных проблем с производительностью. Если я правильно помню, я думаю, что у SQLite2 могли быть некоторые более низкие пределы, но я не думаю, что у SQLite3 есть такие проблемы.
Согласно странице ограничений SQLite , максимальный размер каждой страницы базы данных составляет 32 КБ. А максимальное количество страниц в базе данных составляет 1024 ^ 3. Так что по моей математике получается 32 терабайта как максимальный размер. Я думаю, что вы достигнете пределов своей файловой системы, прежде чем поразите SQLite!
источник
Во многом причина того, что на вставку> 48 часов ушло из-за ваших индексов. Это невероятно быстрее:
1 - удалить все индексы 2 - сделать все вставки 3 - снова создать индексы
источник
Помимо обычной рекомендации:
Из моего опыта работы с SQLite3 я узнал следующее:
Изменить таблицу позже по мере необходимостиВы не можете добавить ограничения с помощью ALTER TABLE).Вопрос / комментарий приветствуется. ;-)
источник
Я думаю, что основные жалобы по поводу масштабирования sqlite:
источник
У меня есть база данных SQLite 7 ГБ. Для выполнения определенного запроса с внутренним объединением требуется 2,6 с. Чтобы ускорить это, я попытался добавить индексы. В зависимости от того, какие индексы я добавил, иногда запрос снижался до 0,1 с, а иногда до 7 с. Я думаю, что проблема в моем случае заключалась в том, что если столбец сильно дублируется, то добавление индекса снижает производительность :(
источник
В документации SQLite существовало утверждение, что практический предел размера файла базы данных составляет несколько десятков ГБ: с. В основном это было связано с необходимостью SQLite «выделять битые карты грязных страниц» при каждом запуске транзакции. Таким образом, 256 байт оперативной памяти требовалось для каждого МБ в базе данных. Вставка в DB-файл объемом 50 ГБ потребует огромного (2 ^ 8) * (2 ^ 10) = 2 ^ 18 = 256 МБ ОЗУ.
Но с недавних версий SQLite это больше не требуется. Узнайте больше здесь .
источник
2^18
на самом деле это всего лишь 256 К.У меня возникли проблемы с большими файлами sqlite при использовании команды вакуума.
Я еще не пробовал функцию auto_vacuum. Если вы планируете часто обновлять и удалять данные, на это стоит обратить внимание.
источник