Постоянная процедура удаления может нанести вред производительности базы данных или приложения?
Я создал представление, которое выполняет некоторые проверки между моделями по мере обновления/добавления этих моделей. Когда эта проверка находит несоответствие, она создает запись и конкретную модель записи несоответствий. Мой вопрос касается стратегии, которую я использовал в этом представлении.
view
Как видно, я начинаю просмотр с удаления всех записей о несоответствиях и снова выполняю проверку и возможную запись элементов. Из-за характера приложения, эта процедура будет выполняться несколько раз, и при этом огромное количество записей будет постоянно удаляться/добавляться. Мой вопрос заключается в том, хранится ли какая-либо часть этих данных в базе данных или в приложении, что привело бы к потере производительности. А также может ли эта процедура в будущем нанести какой-либо вред приложению.
Удаление может привести к тому, что база данных будет использовать больше места, чем это абсолютно необходимо, а частые манипуляции с данными могут привести к фрагментации хранилища данных, что может снизить производительность.
Пространство можно освободить и дефрагментировать данные вручную, выполнив команду VACUUM в консоли SQLite3 (показано ниже) или через cursor.execute('VACUUM main')
:
sqlite> -- "main" is the name of the database to be vacuumed
sqlite> -- "main" is the default name of the sqlite3 database
sqlite> VACUUM main;
Обратите внимание, что VACUUM
- требует для своей работы свободного места на диске в два раза больше, чем размер файла базы данных
- может изменить ROWIDs в таблицах, не имеющих целочисленного первичного ключа
- потерпит неудачу, если на соединении, выполняющем команду
VACUUM
, есть открытая транзакция
Существует также оператор PRAGMA AUTO_VACUUM, который может (полу)автоматически освобождать место, используемое удаленными записями после каждой фиксации. Однако он не дефрагментирует, и документация предупреждает, что это может привести к снижению производительности.