У меня есть таблица, которая выглядит так:
CREATE TABLE records (
batchID TEXT,
A TEXT,
A_id REAL,
B TEXT,
B_id REAL,
C REAL,
D REAL,
E REAL,
F REAL,
G REAL,
H REAL,
color REAL,
repair REAL,
data BLOB,
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT
)
У меня есть индекс таблицы по некоторым столбцам. Поскольку целостность не является проблемой, у меня есть:
PRAGMA synchronous = "0"
PRAGMA journal_mode = "OFF"
В db часто вставляются, у меня около 2 миллионов строк в моей таблице записей, а размер файла db составляет ~ 2 ГБ. Раз в несколько часов мне нужно удалить 200К строк из таблицы записей. Я использую node js orm:
db.driver.execQuery('DELETE FROM records WHERE A IN ? AND batchID = ?',
[['a1', 'a2'], 'batch123'],
function(err) {
// do stuff here
});
Вначале удаление занимает около 10 секунд, однако после месяца работы оператор удаления может занять более часа (!) (См. Прилагаемый график производительности из журналов, где я регистрирую время удаления - оранжевые кружки, синие кружки - память узла). Это проблема, поскольку во время удаления в node генерируются новые запросы на запись. Эти запросы на запись помещаются в очередь в памяти, чтобы точечный узел использовал огромный объем памяти. (поскольку удаление блокирует таблицу и блокирует запись)
Я подозреваю, что это связано с тем, что база данных становится фрагментированной. Вакуум для меня не вариант, так как это продукт, который нельзя остановить, и когда я тестировал время вакуумирования на копии файла sqlite db, это заняло 15-30 минут. Автоматический вакуум, насколько я понимаю, не поможет, поскольку он не сжимает данные на страницах и может ухудшить фрагментацию. Еще я пытался установить размер страницы 4096, это тоже не помогло. график производительности