Что означает съемный в вакуумном выводе Postgres?

Я выполнил полную ВАКУУМ в таблице Postgres с 9 миллионами строк и получил это обратно:

INFO:  vacuuming "osm.asp_trs_roads_osm"
INFO:  "asp_trs_roads": found 329992 removable, 9660438 nonremovable row versions in 761738 pages

ПОДРОБНЕЕ: 0 версий мертвых строк удалить нельзя. CPU 8.98s / 13.06u sec затрачено 549,77 сек. Запрос успешно возвращен без результата в течение 991788 мс.

Что означает "329992 съемный"? И почему я получаю:

   0 dead row versions cannot be removed yet.

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


person user1919    schedule 28.06.2017    source источник


Ответы (3)


Благодаря моим более чем скромным знаниям, когда вы меняете строку (обновляете, удаляете), старая версия сохраняется, если она используется другими транзакциями (в том же физическом месте), когда больше транзакции не могут нуждаться в устаревшей версии строки - она становится съемным.

извините - не могу найти четкое описание в документах

Если я правильно понял - съемные показаны analyze частью вакуума, а мертвые строки удалены, а не показаны фактической vacuum частью.

person Vao Tsun    schedule 28.06.2017

Проще говоря, вы можете понять, что, когда вы обновляете или удаляете данные в своей таблице, PostgreSQL не удаляет их сразу, а просто отмечает их. Команда Vacuum работает как сборщик мусора, она просматривает эту таблицу и удаляет ее, чтобы освободить место на диске.

Вы можете прочитать документ о Vacuum в Wiki для получения более подробной информации:

https://wiki.postgresql.org/wiki/Introduction_to_VACUUM,_ANALYZE,_EXPLAIN,_and_COUNT

person Mabu Kloesen    schedule 28.06.2017

В дополнение к тому, что уже ответили другие, относительно этого вывода в журнале:

0 dead row versions cannot be removed yet.

Когда update или delete выполняется для любой строки, создается новая версия этой строки, чтобы заменить предыдущую после фиксации транзакции. Транзакции, которые начались до выполнения обновления / удаления, могут продолжать видеть старую версию строки (в зависимости от уровень изоляции транзакции). Следовательно, вакуум не может удалить эти версии, пока не будет гарантировано, что ни одна из них больше не будет видна.

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

См. Этот связанный с этим вопрос.

person alostale    schedule 13.09.2017