Как дефрагментировать / консолидировать частично заполненные страницы sqlite, чтобы освободить место? - PullRequest
1 голос
/ 12 января 2020

Я проектирую небольшое серверное приложение с локальным хранилищем данных, и sqlite3, кажется, является способом управления постоянными данными. Но меня беспокоят злонамеренные пользователи, которые знают внутреннюю логику c и могут обманом заставить сервер создать (и впоследствии удалить) множество записей таким образом, чтобы на каждой странице данных оставалось несколько действительных записей. Размер базы данных может взорваться довольно скоро.

Следуя документации и рекомендациям вроде https://blogs.gnome.org/jnelson/2015/01/06/sqlite-vacuum-and-auto_vacuum/, подразумевается, что даже auto_vacuum = incremental не поможет мне в этом сценарии, потому что он эффективен только для выпущенных страниц, но не для использованных страниц с внутренними пробелами (то есть фрагментацией).

Есть ли хороший способ сообщить sqlite о консолидации таких данных на лету?

VACUUM операция невозможна из-за долговременной глобальной блокировки БД.

1 Ответ

1 голос
/ 12 января 2020

Sqlite автоматически объединит почти пустую страницу с соседями, чтобы уменьшить фрагментацию, как вы описали.

С электронное письмо от D Richard Hipp в списке рассылки sqlite:

Как только со страницы будет удалено достаточное количество строк, и свободное место на этой странице станет значительной частью общего пространства для страницы, то страница объединится со смежными страницами, освободив вся страница для повторного использования. Но поскольку такая реорганизация обходится дорого, она откладывается до тех пор, пока на странице не будет накоплено много свободного места. (Точные пороговые значения для того, когда происходит перебалансировка, записаны в каком-то месте, но они не сразу приходят мне на ум, поскольку весь механизм просто работает , и мы не касались его в течение приблизительно 15 лет.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...