Должен ли я запустить VACUUM в транзакции или после? - PullRequest
8 голосов
/ 12 февраля 2010

У меня процесс синхронизации мобильного приложения. Транзакция делает много изменений в базе данных. Поскольку это делается на мобильных устройствах, мне нужно выдать VACUUM для сжатия базы данных.

Мне интересно, когда я должен выпустить ВАКУУМ

  • в сделке, как окончательное утверждение
  • или после транзакции?

В настоящее время я ищу SQLite, но если он отличается для других движков, дайте мне знать в ответах (PostgreSQL, MySQL, Oracle, SQLServer)

Ответы [ 4 ]

14 голосов
/ 12 февраля 2010

Хотите или нет при использовании PostgreSQL, вы не можете запустить VACUUM в транзакции, как указано в руководстве :

VACUUM не может быть выполнен внутри блока транзакции.

5 голосов
/ 12 февраля 2010

Я бы сказал вне транзакции. Конечно, в PostgreSQL VACUUM предназначен для удаления «мертвых» кортежей (т. Е. Старой строки, когда запись была изменена или удалена).

Если вы используете VACUUM в транзакции, которая изменила записи, эти мертвые строки не будут помечены для удаления.

В зависимости от того, какой тип VACUUM вы используете, может также потребоваться блокировка таблицы, которая будет блокироваться, если выполняются другие транзакции, поэтому вы можете потенциально оказаться в тупиковой ситуации (транзакция 1 заблокирована в ожидании таблицы блокировка для выполнения VACUUM, транзакция 2 блокируется в ожидании освобождения строки, которую заблокировала транзакция 1.)

Я бы также рекомендовал, чтобы это не делалось в приложении (возможно, как запланированное задание), так как это может занять некоторое время и может негативно повлиять на скорость других запросов.

Что касается SQL Server, то нет VACUUM - то, что вы ищете - это сжатие. Вы можете включить автоматическое сжатие в 2005 году, которое будет автоматически восстанавливать пространство, когда это решит сервер, или выдавать инструкцию DBCC для сжатия базы данных и файла журнала, но это зависит от процедуры резервного копирования и стратегии на уровне базы данных.

1 голос
/ 12 февраля 2010

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

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

0 голосов
/ 12 февраля 2010

Как часто выполняется транзакция?

Это действительно ежедневный процесс, а не запрос по запросу, но если вы используете его не полностью, его можно использовать в транзакции, поскольку он не получает блокировку.

Если вы собираетесь это сделать, то это должно быть за пределами транзакции, поскольку она не зависит от целостности данных транзакций.

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