VACUUM заставляет диск работать на 100% - это нормально и можно ли это предотвратить? - PullRequest
2 голосов
/ 03 мая 2019

В настоящее время у меня есть база данных 9 Гбит Sqlite3, у меня есть задача 'обслуживания', которая выполняется с произвольными интервалами вечером, чтобы VACUMM; база данных (в среднем примерно раз в неделю). База данных находится на компьютере с Windows 10.

Однажды утром я увидел, что задание все еще выполняется. Как и ожидалось, команда VACUMM; использовала удвоенный объем дискового пространства, но я не ожидал, что она будет работать в течение +2 часов и использовать 100% использования диска.

Мои вопросы,

Нормально ли использовать 100% диска для базы данных ~ 9 Гб и работать более 2 часов? (база данных больше не растет).

Есть ли способ, которым я могу VACUUM; базу данных, не убивая мой диск в процессе? (возможно, ВАКУУМ низкого приоритета или что-то в этом роде?)

Ответы [ 2 ]

3 голосов
/ 04 мая 2019

Вы можете попробовать использовать VACUUM INTO вместо VACUUM, а затем просто удалить исходный файл БД и переименовать вновь созданный файл. Это устранит половину перебивания диска.

В качестве альтернативы, вы можете рассмотреть возможность использования VACUUM не так часто. Если, как вы говорите, БД стабилизировался в отношении размера, то несколько пустых страниц на самом деле не являются причиной для большого беспокойства. Вы можете начать с сокращения его до месячных интервалов, а не еженедельных, и посмотреть, заметите ли вы разницу в производительности запросов. Скорее всего, вы не будете.

0 голосов
/ 03 мая 2019
Is it normal to use 100% of the disk for an ~9Gb database and to run for over 2 hours? (the database is not really growing anymore).

Нет, я не думаю, что все же, я бы хотел, чтобы вы сравнили его с ручной (и не транснациональной) версией VACUUM:

echo ".dump" | sqlite3 old_db.db3 | sqlite3 new_db.db3; rm old_db.db3; mv new_db.db3 old_db.db3;

как это работаетпо сравнению с правильным ВАКУУМОМ?еще 2 часа на 100% процессоре?если это работает значительно лучше, я думаю, что это ошибка производительности VACUUM sqlite3 где-то ..

Есть ли способ, которым я могу VACUUM;база данных, не убивая мой диск в процессе?(возможно, VACUUM с низким приоритетом или что-то в этом роде?)

да ... но это будет еще медленнее, очевидно, это должно работать и работать с очень низким приоритетом io и очень низким процессоромприоритет:

echo "VACUUM;" | ionice -c 3 nice -n 19 sqlite3 db.db3
...