Постоянная процедура удаления может нанести вред производительности базы данных или приложения?

Я создал представление, которое выполняет некоторые проверки между моделями по мере обновления/добавления этих моделей. Когда эта проверка находит несоответствие, она создает запись и конкретную модель записи несоответствий. Мой вопрос касается стратегии, которую я использовал в этом представлении.

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, который может (полу)автоматически освобождать место, используемое удаленными записями после каждой фиксации. Однако он не дефрагментирует, и документация предупреждает, что это может привести к снижению производительности.

Вернуться на верх