Как найти мертвые кортежи (фрагментация) в PostgreSQL 8.2 (для Greenplum)?

Я хочу найти мертвые кортежи и живые кортежи таблиц в PostgreSQL 8.2. Мы только что начали работу с системой баз данных Greenplum MPP, которая основана на PostgreSQL 8.2.

Из-за архитектуры MVCC по умолчанию нам нужно найти мертвые кортежи таблицы и сделать план VACUUM it.

Я знаю, как найти мертвые кортежи в новой версии PostgreSQL. Я уже поделился этой статьей двумя.

PostgreSQL: как проверить фрагментацию таблицы с помощью модуля pgstattuple

PostgreSQL: Script, чтобы найти общие живые корты и мертвые кортежи (строки) таблицы

Может ли кто-нибудь помочь мне в этом?

Спасибо заранее!

Ответ 1

Не используйте autovacuum. Greenplum не PostgreSQL, и autovacuum не работает в базе данных. Я настоятельно рекомендую не помечать сообщения Greenplum PostgreSQL, потому что вы, скорее всего, получите неверную информацию. Это будет похоже на публикацию вопроса об OSX, а также пометку BSD.

Вакуумные таблицы кучи с раздуванием:

psql -t -A -c "SELECT E'VACUUM \"' || bdinspname || E'\".\"' || bdirelname || E'\";' FROM gp_toolkit.gp_bloat_diag WHERE bdinspname <> 'pg_catalog'" | psql -e

Но большинство ваших таблиц в Greenplum, скорее всего, не будет основано на куче, в котором используется MVCC, и вместо этого используйте "Append Optimized" или AO для краткости. Он использует карту видимости, чтобы скрыть удаленные строки, и файлы меньше, поэтому они быстрее. Он также позволяет сжимать таблицу и ориентировать столбцы.

Таблицы AO также нуждаются в обслуживании, но в отличие от таблиц кучи, он имеет порог уплотнения, встроенный в управляемый gp_appendonly_compaction_threshold GUC. Просто VACUUM все таблицы AO и база данных будут автоматически перестраивать таблицу, если процент скрытых строк превышает 10%.

Greenplum все еще страдает от проблемы возраста замораживания, которая была унаследована от PostgreSQL. Этот script обычно не будет возвращать какие-либо строки, но в старых установках с таблицами, которые не были затронуты в течение очень долгого времени, вы можете начать вакуумные таблицы.

vacuum_freeze_min_age=$(psql -t -A -c "show vacuum_freeze_min_age;")
psql -t -A -c "SELECT E'VACUUM \"' || n.nspname || E'\".\"' || c.relname || E'\";' FROM pg_class c join pg_namespace n ON c.relnamespace = n.oid WHERE age(relfrozenxid) > $vacuum_freeze_min_age AND c.relkind = 'r'" | psql -e

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

analyzedb -d gpadmin -s tpcds

Не забывайте каталог!

psql -t -A -c "SELECT E'VACUUM ANALYZE \"' || n.nspname || E'\".\"' || c.relname || E'\";' FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid WHERE n.nspname = 'pg_catalog' AND c.relkind = 'r'" | psql -e

Это индексирует индексы каталога:

reindexdb -s