Тому я зробив кілька тестів на sqlite для дуже великих файлів і прийшов до деяких висновків (принаймні для мого конкретного застосування).
Тести включають один файл sqlite з однією таблицею або декількома таблицями. Кожна таблиця мала приблизно 8 стовпців, майже всі цілі числа та 4 індекси.
Ідея полягала в тому, щоб вставити достатню кількість даних, поки файли sqlite не склали близько 50 Гб.
Єдиний стіл
Я спробував вставити кілька рядків у файл sqlite лише з однією таблицею. Коли файл становив близько 7 Гб (вибачте, я не можу бути конкретним щодо кількості рядків), вставки зайняли дуже багато часу. Я підрахував, що мій тест на введення всіх моїх даних займе 24 години або близько того, але він не завершився навіть через 48 годин.
Це підводить мене до висновку, що одна, дуже велика таблиця sqlite матиме проблеми із вставками та, ймовірно, й іншими операціями.
Я думаю, це не дивно, оскільки таблиця стає більшою, введення та оновлення всіх індексів зайняло більше часу.
Кілька таблиць
Потім я спробував розділити дані за часом на кілька таблиць, одну таблицю на день. Дані для початкової 1 таблиці розділили на ~ 700 таблиць.
Цей параметр не мав проблем із вставкою, не проходило більше часу, оскільки час просувався, оскільки для кожного дня створювалася нова таблиця.
Питання вакууму
Як зазначає i_like_caffeine, команда VACUUM є проблемою, чим більший файл sqlite. Коли більше вставок / видалень буде зроблено, фрагментація файлу на диску буде погіршуватися, тому мета періодично VACUUM оптимізувати файл та відновити файловий простір.
Однак, як зазначається в документації , повна копія бази даних робиться, щоб зробити вакуум, для того щоб зайняти дуже багато часу. Отже, чим менша база даних, тим швидше ця операція закінчиться.
Висновки
У моєму конкретному застосуванні я, мабуть, буду розбивати дані на кілька db-файлів, один на день, щоб отримати найкращу ефективність роботи вакууму та швидкість вставки / видалення.
Це ускладнює запити, але для мене корисно мати можливість індексувати стільки даних. Додатковою перевагою є те, що я можу просто видалити цілий db-файл, щоб скинути цінні дані на день (звичайна операція для мого додатка).
Ймовірно, мені слід було б також відстежувати розмір таблиці на файл, щоб побачити, коли швидкість стане проблемою.
Це дуже погано, що, здається, не існує інкрементального методу вакууму, крім автоматичного вакууму . Я не можу його використовувати, тому що моя мета вакууму - дефрагментація файлу (файловий простір не є великою справою), що не робить автоматичний вакуум. Насправді в документації зазначено, що це може погіршити фрагментацію, тому мені доводиться періодично вдаватися до повного вакуумування файлу.