Postgres: bloat, pg_repack ื•ืื™ืœื•ืฆื™ื ื“ื—ื•ื™ื™ื

Postgres: bloat, pg_repack ื•ืื™ืœื•ืฆื™ื ื“ื—ื•ื™ื™ื

ื”ืฉืคืขืช ื”ื ืคื™ื—ื•ืช ืขืœ ื˜ื‘ืœืื•ืช ื•ืื™ื ื“ืงืกื™ื ื™ื“ื•ืขื” ื‘ืจื‘ื™ื ื•ื”ื™ื ืงื™ื™ืžืช ืœื ืจืง ื‘-Postgres. ื™ืฉื ืŸ ื“ืจื›ื™ื ืœื”ืชืžื•ื“ื“ ืขื ื–ื” ืžื—ื•ืฅ ืœืงื•ืคืกื”, ื›ืžื• VACUUM FULL ืื• CLUSTER, ืื‘ืœ ื”ื ื ื•ืขืœื™ื ืฉื•ืœื—ื ื•ืช ื‘ื–ืžืŸ ื”ืคืขื•ืœื” ื•ืœื›ืŸ ืœื ืชืžื™ื“ ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ื”ื.

ื”ืžืืžืจ ื™ื›ื™ืœ ืชื™ืื•ืจื™ื” ืงื˜ื ื” ืขืœ ื”ืื•ืคืŸ ืฉื‘ื• ื ืคื™ื—ื•ืช ืžืชืจื—ืฉืช, ื›ื™ืฆื“ ื ื™ืชืŸ ืœื”ื™ืœื—ื ื‘ื”, ืขืœ ืื™ืœื•ืฆื™ื ื“ื—ื•ื™ื™ื ื•ื”ื‘ืขื™ื•ืช ืฉื”ื ืžื‘ื™ืื™ื ืœืฉื™ืžื•ืฉ ื‘ืชื•ืกืฃ pg_repack.

ืžืืžืจ ื–ื” ื ื›ืชื‘ ืขืœ ื‘ืกื™ืก ื”ื ืื•ื ืฉืœื™ ื‘-PgConf.Russia 2020.

ืžื“ื•ืข ืžืชืจื—ืฉืช ื ืคื™ื—ื•ืช?

Postgres ืžื‘ื•ืกืก ืขืœ ืžื•ื“ืœ ืžืจื•ื‘ื” ื’ืจืกืื•ืช (MVCC). ื”ืžื”ื•ืช ืฉืœื• ื”ื™ื ืฉืœื›ืœ ืฉื•ืจื” ื‘ื˜ื‘ืœื” ื™ื›ื•ืœื•ืช ืœื”ื™ื•ืช ืžืกืคืจ ื’ืจืกืื•ืช, ื‘ืขื•ื“ ืฉืขืกืงืื•ืช ืœื ืจื•ืื•ืช ื™ื•ืชืจ ืžืื—ืช ืžื”ื’ืจืกืื•ืช ื”ืœืœื•, ืืš ืœื ื‘ื”ื›ืจื— ืืช ืื•ืชื” ืื—ืช. ื–ื” ืžืืคืฉืจ ืœืžืกืคืจ ืขืกืงืื•ืช ืœืขื‘ื•ื“ ื‘ื• ื–ืžื ื™ืช ื•ืœืžืขืฉื” ืื™ืŸ ืœื”ืŸ ื”ืฉืคืขื” ื–ื• ืขืœ ื–ื•.

ื‘ืจื•ืจ ืฉืฆืจื™ืš ืœืื—ืกืŸ ืืช ื›ืœ ื”ื’ืจืกืื•ืช ื”ืืœื”. Postgres ืขื•ื‘ื“ ืขื ื–ื™ื›ืจื•ืŸ ืขืžื•ื“ ืื—ืจ ืขืžื•ื“ ื•ืขืžื•ื“ ื”ื•ื ื”ื›ืžื•ืช ื”ืžื™ื ื™ืžืœื™ืช ืฉืœ ื ืชื•ื ื™ื ืฉื ื™ืชืŸ ืœืงืจื•ื ืžื”ื“ื™ืกืง ืื• ืœื›ืชื•ื‘. ื‘ื•ืื• ื ืกืชื›ืœ ืขืœ ื“ื•ื’ืžื” ืงื˜ื ื” ื›ื“ื™ ืœื”ื‘ื™ืŸ ืื™ืš ื–ื” ืงื•ืจื”.

ื ื ื™ื— ืฉื™ืฉ ืœื ื• ื˜ื‘ืœื” ืฉื”ื•ืกืคื ื• ืืœื™ื” ืžืกืคืจ ืจืฉื•ืžื•ืช. ื ืชื•ื ื™ื ื—ื“ืฉื™ื ื”ื•ืคื™ืขื• ื‘ืขืžื•ื“ ื”ืจืืฉื•ืŸ ืฉืœ ื”ืงื•ื‘ืฅ ืฉื‘ื• ืžืื•ื—ืกื ืช ื”ื˜ื‘ืœื”. ืืœื• ื”ืŸ ื’ืจืกืื•ืช ื—ื™ื•ืช ืฉืœ ืฉื•ืจื•ืช ื”ื–ืžื™ื ื•ืช ืœื˜ืจื ื–ืงืฆื™ื•ืช ืื—ืจื•ืช ืœืื—ืจ commit (ืœืžืขืŸ ื”ืคืฉื˜ื•ืช, ื ื ื™ื— ืฉืจืžืช ื”ื‘ื™ื“ื•ื“ ื”ื™ื Read Committed).

Postgres: bloat, pg_repack ื•ืื™ืœื•ืฆื™ื ื“ื—ื•ื™ื™ื

ืœืื—ืจ ืžื›ืŸ ืขื“ื›ื ื• ืืช ืื—ื“ ื”ืขืจื›ื™ื, ื•ื‘ื›ืš ืกื™ืžื ื• ืืช ื”ื’ืจืกื” ื”ื™ืฉื ื” ื›ืœื ืจืœื•ื•ื ื˜ื™ืช ื™ื•ืชืจ.

Postgres: bloat, pg_repack ื•ืื™ืœื•ืฆื™ื ื“ื—ื•ื™ื™ื

ืฉืœื‘ ืื—ืจ ืฉืœื‘, ืขื“ื›ื•ืŸ ื•ืžื—ื™ืงื” ืฉืœ ื’ืจืกืื•ืช ืฉื•ืจื”, ื”ื’ืขื ื• ืœื“ืฃ ืฉื‘ื• ื›ืžื—ืฆื™ืช ืžื”ื ืชื•ื ื™ื ื”ื "ื–ื‘ืœ". ื ืชื•ื ื™ื ืืœื” ืื™ื ื ื’ืœื•ื™ื™ื ืœืืฃ ืขืกืงื”.

Postgres: bloat, pg_repack ื•ืื™ืœื•ืฆื™ื ื“ื—ื•ื™ื™ื

ืœืคื•ืกื˜ื’ืจืก ื™ืฉ ืžื ื’ื ื•ืŸ ืœึดืฉืึฐืื•ึนื‘, ืฉืžื ืงื” ื’ืจืกืื•ืช ืžื™ื•ืฉื ื•ืช ื•ืžืคื ื” ืžืงื•ื ืœื ืชื•ื ื™ื ื—ื“ืฉื™ื. ืื‘ืœ ืื ื”ื•ื ืœื ืžื•ื’ื“ืจ ื‘ืฆื•ืจื” ืื’ืจืกื™ื‘ื™ืช ืžืกืคื™ืง ืื• ืฉื”ื•ื ืขืกื•ืง ื‘ืขื‘ื•ื“ื” ื‘ื˜ื‘ืœืื•ืช ืื—ืจื•ืช, ืื– "ื ืชื•ื ื™ ื–ื‘ืœ" ื ืฉืืจื™ื, ื•ืขืœื™ื ื• ืœื”ืฉืชืžืฉ ื‘ื“ืคื™ื ื ื•ืกืคื™ื ืขื‘ื•ืจ ื ืชื•ื ื™ื ื—ื“ืฉื™ื.

ืื– ื‘ื“ื•ื’ืžื” ืฉืœื ื•, ื‘ื ืงื•ื“ืช ื–ืžืŸ ืžืกื•ื™ืžืช ื”ื˜ื‘ืœื” ืชื”ื™ื” ืžื•ืจื›ื‘ืช ืžืืจื‘ืขื” ืขืžื•ื“ื™ื, ืื‘ืœ ืจืง ื—ืฆื™ ืžืžื ื” ื™ื›ื™ืœ ื ืชื•ื ื™ื ื—ื™ื™ื. ื›ืชื•ืฆืื” ืžื›ืš, ื‘ืขืช ื’ื™ืฉื” ืœื˜ื‘ืœื”, ืื ื• ื ืงืจื ื”ืจื‘ื” ื™ื•ืชืจ ื ืชื•ื ื™ื ืžื”ื ื“ืจืฉ.

Postgres: bloat, pg_repack ื•ืื™ืœื•ืฆื™ื ื“ื—ื•ื™ื™ื

ื’ื ืื VACUUM ืชืžื—ืง ื›ืขืช ืืช ื›ืœ ื’ืจืกืื•ืช ื”ืฉื•ืจื•ืช ื”ืœื ืจืœื•ื•ื ื˜ื™ื•ืช, ื”ืžืฆื‘ ืœื ื™ืฉืชืคืจ ื‘ืื•ืคืŸ ื“ืจืžื˜ื™. ื™ื”ื™ื” ืœื ื• ืžืงื•ื ืคื ื•ื™ ื‘ื“ืคื™ื ืื• ืืคื™ืœื• ื‘ื“ืคื™ื ืฉืœืžื™ื ืœืฉื•ืจื•ืช ื—ื“ืฉื•ืช, ืื‘ืœ ืขื“ื™ื™ืŸ ื ืงืจื ื™ื•ืชืจ ื ืชื•ื ื™ื ืžื”ื ื“ืจืฉ.
ืื’ื‘, ืื ืขืžื•ื“ ืจื™ืง ืœื—ืœื•ื˜ื™ืŸ (ื”ืฉื ื™ ื‘ื“ื•ื’ืžื” ืฉืœื ื•) ื”ื™ื” ื‘ืกื•ืฃ ื”ืงื•ื‘ืฅ, ืื– VACUUM ื”ื™ื” ืžืกื•ื’ืœ ืœื—ืชื•ืš ืื•ืชื•. ืื‘ืœ ืขื›ืฉื™ื• ื”ื™ื ื‘ืืžืฆืข, ืื– ืื™ ืืคืฉืจ ืœืขืฉื•ืช ืื™ืชื” ื›ืœื•ื.

Postgres: bloat, pg_repack ื•ืื™ืœื•ืฆื™ื ื“ื—ื•ื™ื™ื

ื›ืืฉืจ ืžืกืคืจ ื”ื“ืคื™ื ื”ืจื™ืงื™ื ืื• ื”ื“ืœ ืžืื•ื“ ื”ื•ืคืš ืœื’ื“ื•ืœ, ืžื” ืฉื ืงืจื bloat, ื–ื” ืžืชื—ื™ืœ ืœื”ืฉืคื™ืข ืขืœ ื”ื‘ื™ืฆื•ืขื™ื.

ื›ืœ ืžื” ืฉืชื•ืืจ ืœืขื™ืœ ื”ื•ื ื”ืžื›ื ื™ืงื” ืฉืœ ื”ืชืจื—ืฉื•ืช ื ืคื™ื—ื•ืช ื‘ื˜ื‘ืœืื•ืช. ื‘ืื™ื ื“ืงืกื™ื ื–ื” ืงื•ืจื” ื‘ืขืจืš ื‘ืื•ืชื• ืื•ืคืŸ.

ื™ืฉ ืœื™ ื ืคื™ื—ื•ืช?

ื™ืฉื ืŸ ืžืกืคืจ ื“ืจื›ื™ื ืœืงื‘ื•ืข ืื ื™ืฉ ืœืš ื ืคื™ื—ื•ืช. ื”ืจืขื™ื•ืŸ ืฉืœ ื”ืจืืฉื•ืŸ ื”ื•ื ืœื”ืฉืชืžืฉ ื‘ืกื˜ื˜ื™ืกื˜ื™ืงื” ืคื ื™ืžื™ืช ืฉืœ Postgres, ื”ืžื›ื™ืœื” ืžื™ื“ืข ืžืฉื•ืขืจ ืขืœ ืžืกืคืจ ื”ืฉื•ืจื•ืช ื‘ื˜ื‘ืœืื•ืช, ืžืกืคืจ ืฉื•ืจื•ืช "ื—ื™ื•ืช" ื•ื›ื•'. ืืชื” ื™ื›ื•ืœ ืœืžืฆื•ื ื•ืจื™ืืฆื™ื•ืช ืจื‘ื•ืช ืฉืœ ืกืงืจื™ืคื˜ื™ื ืžื•ื›ื ื™ื ื‘ืื™ื ื˜ืจื ื˜. ืœืงื—ื ื• ื›ื‘ืกื™ืก ืชึทืกืจึดื™ื˜ ืž-PostgreSQL Experts, ืฉื™ื›ื•ืœื™ื ืœื”ืขืจื™ืš ื˜ื‘ืœืื•ืช ื ืคื™ื—ื•ืช ื™ื—ื“ ืขื ืžื“ื“ื™ ื˜ื•ืกื˜ ื•-bloat btree. ืžื ื™ืกื™ื•ื ื ื•, ื”ืฉื’ื™ืื” ืฉืœื• ื”ื™ื 10-20%.

ื“ืจืš ื ื•ืกืคืช ื”ื™ื ืœื”ืฉืชืžืฉ ื‘ืชื•ืกืฃ pgstattuple, ื”ืžืืคืฉืจ ืœืš ืœื”ืกืชื›ืœ ื‘ืชื•ืš ื”ื“ืคื™ื ื•ืœืงื‘ืœ ื’ื ืขืจืš ื ืคื™ื—ื•ืช ืžืฉื•ืขืจ ื•ื’ื ืžื“ื•ื™ืง. ืื‘ืœ ื‘ืžืงืจื” ื”ืฉื ื™, ืชืฆื˜ืจืš ืœืกืจื•ืง ืืช ื›ืœ ื”ื˜ื‘ืœื”.

ืื ื• ืจื•ืื™ื ืขืจืš ื ืคื™ื—ื•ืช ืงื˜ืŸ, ืขื“ 20%, ืžืงื•ื‘ืœ. ื–ื” ื™ื›ื•ืœ ืœื”ื™ื—ืฉื‘ ื›ืื ืœื•ื’ื™ ืฉืœ fillfactor ืขื‘ื•ืจ ื˜ื‘ืœืื•ืช ะธ ืื™ื ื“ืงืกื™ื. ื‘-50% ื•ืžืขืœื”, ืขืœื•ืœื•ืช ืœื”ืชื—ื™ืœ ื‘ืขื™ื•ืช ื‘ื‘ื™ืฆื•ืขื™ื.

ื“ืจื›ื™ื ืœื”ื™ืœื—ื ื‘ื ืคื™ื—ื•ืช

ืœ-Postgres ื™ืฉ ื›ืžื” ื“ืจื›ื™ื ืœื”ืชืžื•ื“ื“ ืขื ื ืคื™ื—ื•ืช ืžื—ื•ืฅ ืœืงื•ืคืกื”, ืื‘ืœ ื”ืŸ ืœื ืชืžื™ื“ ืžืชืื™ืžื•ืช ืœื›ื•ืœื.

ื”ื’ื“ืจ ืืช AUTOVACUUM ื›ืš ืฉืœื ืชืชืจื—ืฉ ื ืคื™ื—ื•ืช. ืื• ืœื™ืชืจ ื“ื™ื•ืง, ืœืฉืžื•ืจ ืืช ื–ื” ื‘ืจืžื” ื”ืžืงื•ื‘ืœืช ืขืœื™ืš. ื–ื” ื ืจืื” ื›ืžื• ืขืฆื” "ืฉืœ ื”ืงืคื˜ืŸ", ืื‘ืœ ื‘ืžืฆื™ืื•ืช ื–ื” ืœื ืชืžื™ื“ ืงืœ ืœื”ืฉื™ื’. ืœื“ื•ื’ืžื”, ื™ืฉ ืœืš ืคื™ืชื•ื— ืคืขื™ืœ ืขื ืฉื™ื ื•ื™ื™ื ืงื‘ื•ืขื™ื ื‘ืกื›ื™ืžืช ื”ื ืชื•ื ื™ื, ืื• ืฉืžืชื‘ืฆืขืช ื”ืขื‘ืจืช ื ืชื•ื ื™ื ื›ืœืฉื”ื™. ื›ืชื•ืฆืื” ืžื›ืš, ืคืจื•ืคื™ืœ ื”ื˜ืขื™ื ื” ืฉืœืš ืขืฉื•ื™ ืœื”ืฉืชื ื•ืช ืœืขืชื™ื ืงืจื•ื‘ื•ืช ื•ื™ืฉืชื ื” ื‘ื“ืจืš ื›ืœืœ ืžื˜ื‘ืœื” ืœื˜ื‘ืœื”. ื–ื” ืื•ืžืจ ืฉืืชื” ืฆืจื™ืš ื›ืœ ื”ื–ืžืŸ ืœืขื‘ื•ื“ ืงืฆืช ืงื“ื™ืžื” ื•ืœื”ืชืื™ื ืืช AUTOVACUUM ืœืคืจื•ืคื™ืœ ื”ืžืฉืชื ื” ืฉืœ ื›ืœ ืฉื•ืœื—ืŸ. ืื‘ืœ ื‘ืจื•ืจ ืฉื–ื” ืœื ืงืœ ืœืขืฉื•ืช.

ืกื™ื‘ื” ื ืคื•ืฆื” ื ื•ืกืคืช ืœื›ืš ืฉ-AUTOVACUUM ืœื ื™ื›ื•ืœ ืœืขืžื•ื“ ื‘ืงืฆื‘ ืฉืœ ื˜ื‘ืœืื•ืช ื”ื™ื ื‘ื’ืœืœ ืฉื™ืฉ ืขืกืงืื•ืช ืืจื•ื›ื•ืช ื˜ื•ื•ื— ืฉืžื•ื ืขื•ืช ืžืžื ื• ืœื ืงื•ืช ืืช ื”ื ืชื•ื ื™ื ื”ื–ืžื™ื ื™ื ืœืื•ืชืŸ ืขืกืงืื•ืช. ื’ื ื”ื”ืžืœืฆื” ื›ืืŸ ื‘ืจื•ืจื” - ื”ื™ืคื˜ืจ ืžืขืกืงืื•ืช "ืžืชื ื“ื ื“ื•ืช" ื•ืžื–ืขืจ ืืช ื–ืžืŸ ื”ืขืกืงืื•ืช ื”ืคืขื™ืœื•ืช. ืื‘ืœ ืื ื”ืขื•ืžืก ืขืœ ื”ืืคืœื™ืงืฆื™ื” ืฉืœืš ื”ื•ื ื”ื›ืœืื” ืฉืœ OLAP ื•-OLTP, ืื– ืืชื” ื™ื›ื•ืœ ื‘ื• ื–ืžื ื™ืช ืœืงื‘ืœ ืขื“ื›ื•ื ื™ื ืชื›ื•ืคื™ื ื•ืฉืื™ืœืชื•ืช ืงืฆืจื•ืช, ื›ืžื• ื’ื ืคืขื•ืœื•ืช ืืจื•ื›ื•ืช ื˜ื•ื•ื— - ืœืžืฉืœ, ื‘ื ื™ื™ืช ื“ื•ื—. ื‘ืžืฆื‘ ื›ื–ื” ื›ื“ืื™ ืœื—ืฉื•ื‘ ืขืœ ืคื™ื–ื•ืจ ื”ืขื•ืžืก ืขืœ ื‘ืกื™ืกื™ื ืฉื•ื ื™ื, ืžื” ืฉื™ืืคืฉืจ ื›ื•ื•ื ื•ืŸ ืขื“ื™ืŸ ื™ื•ืชืจ ืฉืœ ื›ืœ ืื—ื“ ืžื”ื.

ื“ื•ื’ืžื” ื ื•ืกืคืช - ื’ื ืื ื”ืคืจื•ืคื™ืœ ื”ื•ื ื”ื•ืžื•ื’ื ื™, ืื‘ืœ ืžืกื“ ื”ื ืชื•ื ื™ื ื ืžืฆื ื‘ืขื•ืžืก ื’ื‘ื•ื” ืžืื•ื“, ืื– ืืคื™ืœื• ื”-AUTOVACUUM ื”ืื’ืจืกื™ื‘ื™ ื‘ื™ื•ืชืจ ืขืœื•ืœ ืœื ืœื”ืชืžื•ื“ื“, ื•ืชืชืจื—ืฉ ื ืคื™ื—ื•ืช. ืงื ื” ืžื™ื“ื” (ืื ื›ื™ ืื• ืื•ืคืงื™) ื”ื•ื ื”ืคืชืจื•ืŸ ื”ื™ื—ื™ื“.

ืžื” ืœืขืฉื•ืช ื‘ืžืฆื‘ ืฉื‘ื• ื”ื’ื“ืจืชื AUTOVACUUM, ืื‘ืœ ื”ื ืคื™ื—ื•ืช ืžืžืฉื™ื›ื” ืœื’ื“ื•ืœ.

ืงื‘ื•ืฆื” ื•ืืงื•ื ืžืœื ื‘ื•ื ื” ืžื—ื“ืฉ ืืช ื”ืชื•ื›ืŸ ืฉืœ ื˜ื‘ืœืื•ืช ื•ืื™ื ื“ืงืกื™ื ื•ืžืฉืื™ืจ ื‘ื”ื ืจืง ื ืชื•ื ื™ื ืจืœื•ื•ื ื˜ื™ื™ื. ื›ื“ื™ ืœืžื ื•ืข bloat, ื–ื” ืขื•ื‘ื“ ื‘ืฆื•ืจื” ืžื•ืฉืœืžืช, ืื‘ืœ ื‘ืžื”ืœืš ื”ื‘ื™ืฆื•ืข ืฉืœื• ื ืงืœื˜ ื ืขื™ืœื” ื‘ืœืขื“ื™ืช ืขืœ ื”ืฉื•ืœื—ืŸ (AccessExclusiveLock), ืฉืœื ื™ืืคืฉืจ ื‘ื™ืฆื•ืข ืฉืื™ืœืชื•ืช ื‘ื˜ื‘ืœื” ื–ื•, ืืคื™ืœื• ื‘ื•ื—ืจ. ืื ืืชื” ื™ื›ื•ืœ ืœื”ืจืฉื•ืช ืœืขืฆืžืš ืœื”ืคืกื™ืง ืืช ื”ืฉื™ืจื•ืช ืฉืœืš ืื• ื—ืœืง ืžืžื ื• ืœื–ืžืŸ ืžื” (ืžืขืฉืจื•ืช ื“ืงื•ืช ืขื“ ืžืกืคืจ ืฉืขื•ืช ืชืœื•ื™ ื‘ื’ื•ื“ืœ ื‘ืกื™ืก ื”ื ืชื•ื ื™ื ื•ื”ื—ื•ืžืจื” ืฉืœืš), ืื– ืืคืฉืจื•ืช ื–ื• ื”ื™ื ื”ื˜ื•ื‘ื” ื‘ื™ื•ืชืจ. ืœืžืจื‘ื” ื”ืฆืขืจ, ืื™ืŸ ืœื ื• ื–ืžืŸ ืœื”ืคืขื™ืœ ืืช VACUUM FULL ื‘ืžื”ืœืš ื”ืชื—ื–ื•ืงื” ื”ืžืชื•ื›ื ื ืช, ื•ืœื›ืŸ ืฉื™ื˜ื” ื–ื• ืื™ื ื” ืžืชืื™ืžื” ืœื ื•.

ืงื‘ื•ืฆื” CLUSTER ื‘ื•ื ื” ืžื—ื“ืฉ ืืช ืชื•ื›ืŸ ื”ื˜ื‘ืœืื•ืช ื‘ืื•ืชื• ืื•ืคืŸ ื›ืžื• VACUUM FULL, ืืš ืžืืคืฉืจ ืœืฆื™ื™ืŸ ืื™ื ื“ืงืก ืœืคื™ื• ื”ื ืชื•ื ื™ื ื™ื•ื–ืžื ื• ืคื™ื–ื™ืช ื‘ื“ื™ืกืง (ืืš ื‘ืขืชื™ื“ ื”ืกื“ืจ ืœื ืžื•ื‘ื˜ื— ืœืฉื•ืจื•ืช ื—ื“ืฉื•ืช). ื‘ืžืฆื‘ื™ื ืžืกื•ื™ืžื™ื, ื–ื•ื”ื™ ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ื˜ื•ื‘ื” ืขื‘ื•ืจ ืžืกืคืจ ืฉืื™ืœืชื•ืช - ืขื ืงืจื™ืืช ืจืฉื•ืžื•ืช ืžืจื•ื‘ื•ืช ืœืคื™ ืื™ื ื“ืงืก. ื”ื—ื™ืกืจื•ืŸ ืฉืœ ื”ืคืงื•ื“ื” ื–ื”ื” ืœื–ื” ืฉืœ VACUUM FULL - ื”ื™ื ื ื•ืขืœืช ืืช ื”ื˜ื‘ืœื” ื‘ื–ืžืŸ ื”ืคืขื•ืœื”.

ืงื‘ื•ืฆื” REINDEX ื“ื•ืžื” ืœืฉื ื™ื™ื ื”ืงื•ื“ืžื™ื, ืืš ื‘ื•ื ื” ืžื—ื“ืฉ ืื™ื ื“ืงืก ืกืคืฆื™ืคื™ ืื• ืืช ื›ืœ ื”ืื™ื ื“ืงืกื™ื ืฉืœ ื”ื˜ื‘ืœื”. ื”ืžื ืขื•ืœื™ื ืžืขื˜ ื—ืœืฉื™ื ื™ื•ืชืจ: ShareLock ืขืœ ื”ื˜ื‘ืœื” (ืžื•ื ืข ืฉื™ื ื•ื™ื™ื, ืืš ืžืืคืฉืจ ื‘ื—ื™ืจื”) ื•-AccessExclusiveLock ืขืœ ื”ืื™ื ื“ืงืก ืฉื ื‘ื ื” ืžื—ื“ืฉ (ื—ื•ืกื ืฉืื™ืœืชื•ืช ื‘ืืžืฆืขื•ืช ืื™ื ื“ืงืก ื–ื”). ืขื ื–ืืช, ื‘ื’ืจืกื” ื”-12 ืฉืœ Postgres ื”ื•ืคื™ืข ืคืจืžื˜ืจ ื‘ืžืงื‘ื™ืœ, ื”ืžืืคืฉืจ ืœืš ืœื‘ื ื•ืช ืžื—ื“ืฉ ืืช ื”ืื™ื ื“ืงืก ืžื‘ืœื™ ืœื—ืกื•ื ื”ื•ืกืคื”, ืฉื™ื ื•ื™ ืื• ืžื—ื™ืงื” ื‘ืžืงื‘ื™ืœ ืฉืœ ืจืฉื•ืžื•ืช.

ื‘ื’ืจืกืื•ืช ืงื•ื“ืžื•ืช ืฉืœ Postgres, ืืชื” ื™ื›ื•ืœ ืœื”ืฉื™ื’ ืชื•ืฆืื” ื“ื•ืžื” ืœ-REINDEX ื‘ื•-ื–ืžื ื™ืช ื‘ืืžืฆืขื•ืช ืฆื•ืจ ืื™ื ื“ืงืก ื‘ืžืงื‘ื™ืœ. ื”ื•ื ืžืืคืฉืจ ืœื™ืฆื•ืจ ืื™ื ื“ืงืก ืœืœื ื ืขื™ืœื” ืงืคื“ื ื™ืช (ShareUpdateExclusiveLock, ืฉืื™ื ื• ืžืคืจื™ืข ืœืฉืื™ืœืชื•ืช ืžืงื‘ื™ืœื•ืช), ื•ืื– ืœื”ื—ืœื™ืฃ ืืช ื”ืื™ื ื“ืงืก ื”ื™ืฉืŸ ื‘ื—ื“ืฉ ื•ืœืžื—ื•ืง ืืช ื”ืื™ื ื“ืงืก ื”ื™ืฉืŸ. ื–ื” ืžืืคืฉืจ ืœืš ืœื—ืกืœ ืืช ื ืคื™ื—ื•ืช ื”ืžื“ื“ ืžื‘ืœื™ ืœื”ืคืจื™ืข ืœื™ื™ืฉื•ื ืฉืœืš. ื—ืฉื•ื‘ ืœืงื—ืช ื‘ื—ืฉื‘ื•ืŸ ืฉื›ืืฉืจ ื‘ื•ื ื™ื ืžื—ื“ืฉ ืื™ื ื“ืงืกื™ื ื™ื”ื™ื” ืขื•ืžืก ื ื•ืกืฃ ืขืœ ืชืช-ืžืขืจื›ืช ื”ื“ื™ืกืง.

ืœืคื™ื›ืš, ืื ืขื‘ื•ืจ ืื™ื ื“ืงืกื™ื ื™ืฉ ื“ืจื›ื™ื ืœื—ืกืœ ืืช ื”ื ืคื™ื—ื•ืช "ืขืœ ื”ื–ื‘ื•ื‘", ืื– ืื™ืŸ ื›ืืœื” ืขื‘ื•ืจ ื˜ื‘ืœืื•ืช. ื›ืืŸ ื ื›ื ืกื•ืช ืœืชืžื•ื ื” ื”ืจื—ื‘ื•ืช ื—ื™ืฆื•ื ื™ื•ืช ืฉื•ื ื•ืช: pg_repack (ืœืฉืขื‘ืจ pg_reorg), pgcompact, pgcompacttable ื•ืื—ืจื™ื. ื‘ืžืืžืจ ื–ื”, ืœื ืืฉื•ื•ื” ื‘ื™ื ื™ื”ื ื•ืื“ื‘ืจ ืจืง ืขืœ pg_repack, ืฉื‘ื•, ืœืื—ืจ ืฉื™ื ื•ื™ ืžืกื•ื™ื, ืื ื• ืžืฉืชืžืฉื™ื ื‘ืขืฆืžื ื•.

ืื™ืš pg_repack ืขื•ื‘ื“

Postgres: bloat, pg_repack ื•ืื™ืœื•ืฆื™ื ื“ื—ื•ื™ื™ื
ื ื ื™ื— ืฉื™ืฉ ืœื ื• ื˜ื‘ืœื” ืจื’ื™ืœื” ืœื’ืžืจื™ - ืขื ืื™ื ื“ืงืกื™ื, ื”ื’ื‘ืœื•ืช ื•ืœืฆืขืจื™ ืขื ื ืคื™ื—ื•ืช. ื”ืฉืœื‘ ื”ืจืืฉื•ืŸ ืฉืœ pg_repack ื”ื•ื ืœื™ืฆื•ืจ ื˜ื‘ืœืช ื™ื•ืžืŸ ืœืื—ืกื•ืŸ ื ืชื•ื ื™ื ืขืœ ื›ืœ ื”ืฉื™ื ื•ื™ื™ื ื‘ื–ืžืŸ ืฉื”ื™ื ืคื•ืขืœืช. ื”ื˜ืจื™ื’ืจ ื™ืฉื›ืคืœ ืืช ื”ืฉื™ื ื•ื™ื™ื ื”ืœืœื• ืขื‘ื•ืจ ื›ืœ ื”ื•ืกืคื”, ืขื“ื›ื•ืŸ ื•ืžื—ื™ืงื”. ืœืื—ืจ ืžื›ืŸ ื ื•ืฆืจืช ื˜ื‘ืœื”, ื“ื•ืžื” ืœื–ื• ื”ืžืงื•ืจื™ืช ื‘ืžื‘ื ื”, ืืš ืœืœื ืื™ื ื“ืงืกื™ื ื•ื”ื’ื‘ืœื•ืช, ื›ื“ื™ ืœื ืœื”ืื˜ ืืช ืชื”ืœื™ืš ื”ื›ื ืกืช ื”ื ืชื•ื ื™ื.

ืœืื—ืจ ืžื›ืŸ, pg_repack ืžืขื‘ื™ืจ ืืช ื”ื ืชื•ื ื™ื ืžื”ื˜ื‘ืœื” ื”ื™ืฉื ื” ืœื˜ื‘ืœื” ื”ื—ื“ืฉื”, ืžืกื ืŸ ืื•ื˜ื•ืžื˜ื™ืช ืืช ื›ืœ ื”ืฉื•ืจื•ืช ื”ืœื ืจืœื•ื•ื ื˜ื™ื•ืช, ื•ืœืื—ืจ ืžื›ืŸ ื™ื•ืฆืจ ืื™ื ื“ืงืกื™ื ืœื˜ื‘ืœื” ื”ื—ื“ืฉื”. ื‘ืžื”ืœืš ื‘ื™ืฆื•ืข ื›ืœ ื”ืคืขื•ืœื•ืช ื”ืœืœื•, ืฉื™ื ื•ื™ื™ื ืžืฆื˜ื‘ืจื™ื ื‘ื˜ื‘ืœืช ื”ื™ื•ืžืŸ.

ื”ืฉืœื‘ ื”ื‘ื ื”ื•ื ื”ืขื‘ืจืช ื”ืฉื™ื ื•ื™ื™ื ืœื˜ื‘ืœื” ื”ื—ื“ืฉื”. ื”ื”ื’ื™ืจื” ืžืชื‘ืฆืขืช ืขืœ ืคื ื™ ืžืกืคืจ ืื™ื˜ืจืฆื™ื•ืช, ื•ื›ืืฉืจ ื ื•ืชืจื• ืคื—ื•ืช ืž-20 ืขืจื›ื™ื ื‘ื˜ื‘ืœืช ื”ื™ื•ืžืŸ, pg_repack ืจื•ื›ืฉ ื ืขื™ืœื” ื—ื–ืงื”, ืžืขื‘ื™ืจ ืืช ื”ื ืชื•ื ื™ื ื”ืขื“ื›ื ื™ื™ื ื‘ื™ื•ืชืจ ื•ืžื—ืœื™ืฃ ืืช ื”ื˜ื‘ืœื” ื”ื™ืฉื ื” ื‘ื—ื“ืฉื” ื‘ื˜ื‘ืœืื•ืช ืžืขืจื›ืช Postgres. ื–ื” ื”ื–ืžืŸ ื”ื™ื—ื™ื“ ื•ื”ืงืฆืจ ืžืื•ื“ ืฉื‘ื• ืœื ืชื•ื›ืœ ืœืขื‘ื•ื“ ืขื ื”ืฉื•ืœื—ืŸ. ืœืื—ืจ ืžื›ืŸ, ื”ื˜ื‘ืœื” ื”ื™ืฉื ื” ื•ื”ื˜ื‘ืœื” ืขื ื”ื™ื•ืžื ื™ื ื ืžื—ืงื•ืช ื•ืžืชืคื ื” ืžืงื•ื ื‘ืžืขืจื›ืช ื”ืงื‘ืฆื™ื. ื”ืชื”ืœื™ืš ื”ื•ืฉืœื.

ื”ื›ืœ ื ืจืื” ืžืฆื•ื™ืŸ ื‘ืชื™ืื•ืจื™ื”, ืื‘ืœ ืžื” ืงื•ืจื” ื‘ืคื•ืขืœ? ื‘ื“ืงื ื• ืืช pg_repack ืœืœื ืขื•ืžืก ื•ืชื—ืช ืขื•ืžืก, ื•ื‘ื“ืงื ื• ืืช ืคืขื•ืœืชื• ื‘ืžืงืจื” ืฉืœ ืขืฆื™ืจื” ืžื•ืงื“ืžืช (ื‘ืžื™ืœื™ื ืื—ืจื•ืช, ื‘ืืžืฆืขื•ืช Ctrl+C). ื›ืœ ื”ื‘ื“ื™ืงื•ืช ื”ื™ื• ื—ื™ื•ื‘ื™ื•ืช.

ื”ืœื›ื ื• ืœื—ื ื•ืช ื”ืžื–ื•ืŸ - ื•ืื– ื”ื›ืœ ืœื ื”ืœืš ื›ืžื• ืฉืฆื™ืคื™ื ื•.

ืคื ืงื™ื™ืง ืจืืฉื•ืŸ ื‘ืžื‘ืฆืข

ื‘ืืฉื›ื•ืœ ื”ืจืืฉื•ืŸ ืงื™ื‘ืœื ื• ืฉื’ื™ืื” ืœื’ื‘ื™ ื”ืคืจื” ืฉืœ ืื™ืœื•ืฅ ื™ื™ื—ื•ื“ื™:

$ ./pg_repack -t tablename -o id
INFO: repacking table "tablename"
ERROR: query failed: 
    ERROR: duplicate key value violates unique constraint "index_16508"
DETAIL:  Key (id, index)=(100500, 42) already exists.

ืœืžื’ื‘ืœื” ื–ื• ื”ื™ื” ืฉื ืฉื ื•ืฆืจ ืื•ื˜ื•ืžื˜ื™ืช index_16508 - ื”ื•ื ื ื•ืฆืจ ืขืœ ื™ื“ื™ pg_repack. ืขืœ ืกืžืš ื”ืชื›ื•ื ื•ืช ื”ื›ืœื•ืœื•ืช ื‘ื”ืจื›ื‘ื•, ืงื‘ืขื ื• ืืช ื”ืื™ืœื•ืฅ "ืฉืœื ื•" ื”ืชื•ืื ืœื•. ื”ืชื‘ืจืจ ืฉื”ื‘ืขื™ื” ื”ื™ื ืฉืœื ืžื“ื•ื‘ืจ ื‘ืžื’ื‘ืœื” ืจื’ื™ืœื” ืœื—ืœื•ื˜ื™ืŸ, ืืœื ื‘ืžื’ื‘ืœื” ื ื“ื—ื™ืช (ืื™ืœื•ืฅ ื“ื—ื•ื™), ื›ืœื•ืžืจ. ื”ืื™ืžื•ืช ืฉืœื• ืžื‘ื•ืฆืข ืžืื•ื—ืจ ื™ื•ืชืจ ืžืคืงื•ื“ืช sql, ืžื” ืฉืžื•ื‘ื™ืœ ืœืชื•ืฆืื•ืช ื‘ืœืชื™ ืฆืคื•ื™ื•ืช.

ืื™ืœื•ืฆื™ื ื“ื—ื•ื™ื™ื: ืžื“ื•ืข ื”ื ื ื—ื•ืฆื™ื ื•ื›ื™ืฆื“ ื”ื ืคื•ืขืœื™ื

ืชื™ืื•ืจื™ื” ืงื˜ื ื” ืœื’ื‘ื™ ื”ื’ื‘ืœื•ืช ื“ื—ื•ื™ื•ืช.
ื”ื‘ื” ื ื‘ื—ืŸ ื“ื•ื’ืžื” ืคืฉื•ื˜ื”: ื™ืฉ ืœื ื• ืกืคืจ ืขื™ื•ืŸ ื‘ื˜ื‘ืœื” ืฉืœ ืžื›ื•ื ื™ื•ืช ืขื ืฉืชื™ ืชื›ื•ื ื•ืช - ืฉื ื•ืกื“ืจ ื”ืžื›ื•ื ื™ืช ื‘ืกืคืจื™ื™ื”.
Postgres: bloat, pg_repack ื•ืื™ืœื•ืฆื™ื ื“ื—ื•ื™ื™ื

create table cars
(
  name text constraint pk_cars primary key,
  ord integer not null constraint uk_cars unique
);



ื ื ื™ื— ืฉื”ื™ื™ื ื• ืฆืจื™ื›ื™ื ืœื”ื—ืœื™ืฃ ืืช ื”ืžื›ื•ื ื™ืช ื”ืจืืฉื•ื ื” ื•ื”ืฉื ื™ื™ื”. ื”ืคืชืจื•ืŸ ื”ืคืฉื•ื˜ ื”ื•ื ืœืขื“ื›ืŸ ืืช ื”ืขืจืš ื”ืจืืฉื•ืŸ ืœืฉื ื™, ื•ื”ืฉื ื™ ืœืจืืฉื•ืŸ:

begin;
  update cars set ord = 2 where name = 'audi';
  update cars set ord = 1 where name = 'bmw';
commit;

ืื‘ืœ ื›ืืฉืจ ืื ื• ืžืจื™ืฆื™ื ืืช ื”ืงื•ื“ ื”ื–ื”, ืื ื• ืžืฆืคื™ื ืœื”ืคืจืช ืื™ืœื•ืฅ ืžื›ื™ื•ื•ืŸ ืฉืกื“ืจ ื”ืขืจื›ื™ื ื‘ื˜ื‘ืœื” ื”ื•ื ื™ื™ื—ื•ื“ื™:

[23305] ERROR: duplicate key value violates unique constraint โ€œuk_carsโ€
Detail: Key (ord)=(2) already exists.

ืื™ืš ืื ื™ ื™ื›ื•ืœ ืœืขืฉื•ืช ืืช ื–ื” ืื—ืจืช? ืืคืฉืจื•ืช ืจืืฉื•ื ื”: ื”ื•ืกืฃ ืชื—ืœื™ืฃ ืขืจืš ื ื•ืกืฃ ืœื”ื–ืžื ื” ืฉืžื•ื‘ื˜ื—ืช ืฉืœื ืชืชืงื™ื™ื ื‘ื˜ื‘ืœื”, ืœืžืฉืœ "-1". ื‘ืชื›ื ื•ืช, ื–ื” ื ืงืจื "ื”ื—ืœืคืช ืขืจื›ื™ื ืฉืœ ืฉื ื™ ืžืฉืชื ื™ื ื“ืจืš ืฉืœื™ืฉื™". ื”ื—ื™ืกืจื•ืŸ ื”ื™ื—ื™ื“ ืฉืœ ืฉื™ื˜ื” ื–ื• ื”ื•ื ื”ืขื“ื›ื•ืŸ ื”ื ื•ืกืฃ.

ืืคืฉืจื•ืช ืฉื ื™ื™ื”: ืขืฆื‘ ืžื—ื“ืฉ ืืช ื”ื˜ื‘ืœื” ื›ื“ื™ ืœื”ืฉืชืžืฉ ื‘ืกื•ื’ ื ืชื•ื ื™ื ืฉืœ ื ืงื•ื“ื” ืฆืคื” ืขื‘ื•ืจ ืขืจืš ื”ืกื“ืจ ื‘ืžืงื•ื ืžืกืคืจื™ื ืฉืœืžื™ื. ืœืื—ืจ ืžื›ืŸ, ื‘ืขืช ืขื“ื›ื•ืŸ ื”ืขืจืš ืž-1, ืœืžืฉืœ, ืœ-2.5, ื”ืขืจืš ื”ืจืืฉื•ืŸ "ืชืขืžื•ื“" ืื•ื˜ื•ืžื˜ื™ืช ื‘ื™ืŸ ื”ืฉื ื™ ืœืฉืœื™ืฉื™. ื”ืคืชืจื•ืŸ ื”ื–ื” ืขื•ื‘ื“, ืื‘ืœ ื™ืฉ ืฉืชื™ ืžื’ื‘ืœื•ืช. ืจืืฉื™ืช, ื–ื” ืœื ื™ืขื‘ื•ื“ ืขื‘ื•ืจืš ืื ื”ืขืจืš ืžืฉืžืฉ ืื™ืคืฉื”ื• ื‘ืžืžืฉืง. ืฉื ื™ืช, ื‘ื”ืชืื ืœื“ื™ื•ืง ืกื•ื’ ื”ื ืชื•ื ื™ื, ื™ื”ื™ื” ืœืš ืžืกืคืจ ืžื•ื’ื‘ืœ ืฉืœ ื”ื•ืกืคื•ืช ืืคืฉืจื™ื•ืช ืœืคื ื™ ื—ื™ืฉื•ื‘ ืžื—ื“ืฉ ืฉืœ ื”ืขืจื›ื™ื ืฉืœ ื›ืœ ื”ืจืฉื•ืžื•ืช.

ืืคืฉืจื•ืช ืฉืœื™ืฉื™ืช: ืœื”ืคื•ืš ืืช ื”ืื™ืœื•ืฅ ืœื“ื—ื•ืช ื›ืš ืฉื”ื•ื ื™ื™ื‘ื“ืง ืจืง ื‘ื–ืžืŸ ื”ื”ืชื—ื™ื™ื‘ื•ืช:

create table cars
(
  name text constraint pk_cars primary key,
  ord integer not null constraint uk_cars unique deferrable initially deferred
);

ืžื›ื™ื•ื•ืŸ ืฉื”ื”ื™ื’ื™ื•ืŸ ืฉืœ ื”ื‘ืงืฉื” ื”ืจืืฉื•ื ื™ืช ืฉืœื ื• ืžื‘ื˜ื™ื— ืฉื›ืœ ื”ืขืจื›ื™ื ื”ื ื™ื™ื—ื•ื“ื™ื™ื ื‘ื–ืžืŸ ื”ื”ืชื—ื™ื™ื‘ื•ืช, ื–ื” ื™ืฆืœื™ื—.

ื”ื“ื•ื’ืžื” ืฉื ื™ื“ื•ื ื” ืœืขื™ืœ ื”ื™ื, ื›ืžื•ื‘ืŸ, ืžืื•ื“ ืกื™ื ืชื˜ื™ืช, ืื‘ืœ ื”ื™ื ื—ื•ืฉืคืช ืืช ื”ืจืขื™ื•ืŸ. ื‘ืืคืœื™ืงืฆื™ื” ืฉืœื ื•, ืื ื• ืžืฉืชืžืฉื™ื ื‘ืื™ืœื•ืฆื™ื ื“ื—ื•ื™ื™ื ื›ื“ื™ ืœื™ื™ืฉื ืœื•ื’ื™ืงื” ืฉืื—ืจืื™ืช ืขืœ ืคืชืจื•ืŸ ื”ืชื ื’ืฉื•ื™ื•ืช ื›ืืฉืจ ืžืฉืชืžืฉื™ื ื‘ื• ื–ืžื ื™ืช ืขื•ื‘ื“ื™ื ืขื ืื•ื‘ื™ื™ืงื˜ื™ ื•ื•ื™ื“ื’'ื˜ ืžืฉื•ืชืคื™ื ื‘ืœื•ื—. ืฉื™ืžื•ืฉ ื‘ื”ื’ื‘ืœื•ืช ื›ืืœื” ืžืืคืฉืจ ืœื ื• ืœื”ืคื•ืš ืืช ืงื•ื“ ื”ืืคืœื™ืงืฆื™ื” ืœืคืฉื•ื˜ ื™ื•ืชืจ.

ื‘ืื•ืคืŸ ื›ืœืœื™, ื‘ื”ืชืื ืœืกื•ื’ ื”ืื™ืœื•ืฅ, ืœ-Postgres ื™ืฉ ืฉืœื•ืฉ ืจืžื•ืช ืฉืœ ืคื™ืจื•ื˜ ืœื‘ื“ื™ืงืชืŸ: ืจืžื•ืช ืฉื•ืจื”, ืขืกืงื” ื•ื‘ื™ื˜ื•ื™.
Postgres: bloat, pg_repack ื•ืื™ืœื•ืฆื™ื ื“ื—ื•ื™ื™ื
ืžืงื•ืจ: ืžื’ืจืฉื™ื

CHECK ื•- NOT NULL ืชืžื™ื“ ืžืกื•ืžื ื™ื ื‘ืจืžืช ื”ืฉื•ืจื”; ืขื‘ื•ืจ ืžื’ื‘ืœื•ืช ืื—ืจื•ืช, ื›ืคื™ ืฉื ื™ืชืŸ ืœืจืื•ืช ืžื”ื˜ื‘ืœื”, ื™ืฉื ืŸ ืืคืฉืจื•ื™ื•ืช ืฉื•ื ื•ืช. ืืชื” ื™ื›ื•ืœ ืœืงืจื•ื ืขื•ื“ ื›ืืŸ.

ืœืกื™ื›ื•ื ืงืฆืจ, ืื™ืœื•ืฆื™ื ื“ื—ื•ื™ื™ื ื‘ืžืกืคืจ ืžืฆื‘ื™ื ืžืกืคืงื™ื ืงื•ื“ ืงืจื™ื ื™ื•ืชืจ ื•ืคื—ื•ืช ืคืงื•ื“ื•ืช. ืขื ื–ืืช, ืืชื” ืฆืจื™ืš ืœืฉืœื ืขืœ ื–ื” ืขืœ ื™ื“ื™ ืกื™ื‘ื•ืš ืฉืœ ืชื”ืœื™ืš ืื™ืชื•ืจ ื”ื‘ืื’ื™ื, ืฉื›ืŸ ื”ืจื’ืข ืฉื‘ื• ืžืชืจื—ืฉืช ื”ืฉื’ื™ืื” ื•ื”ืจื’ืข ืฉื‘ื• ืืชื” ืžื’ืœื” ืขืœ ื›ืš ืžื•ืคืจื“ื™ื ื‘ื–ืžืŸ. ื‘ืขื™ื” ืืคืฉืจื™ืช ื ื•ืกืคืช ื”ื™ื ืฉื”ืžืชื–ืžืŸ ืœื ืชืžื™ื“ ื™ื•ื›ืœ ืœื‘ื ื•ืช ืชื•ื›ื ื™ืช ืื•ืคื˜ื™ืžืœื™ืช ืื ื”ื‘ืงืฉื” ื›ืจื•ื›ื” ื‘ืื™ืœื•ืฅ ื“ื—ื•ื™.

ืฉื™ืคื•ืจ ืฉืœ pg_repack

ืกืงืจื ื• ืžื”ื ืื™ืœื•ืฆื™ื ื“ื—ื•ื™ื™ื, ืื‘ืœ ืื™ืš ื”ื ืงืฉื•ืจื™ื ืœื‘ืขื™ื” ืฉืœื ื•? ื‘ื•ืื• ื ื–ื›ื•ืจ ืืช ื”ืฉื’ื™ืื” ืฉืงื™ื‘ืœื ื• ืงื•ื“ื ืœื›ืŸ:

$ ./pg_repack -t tablename -o id
INFO: repacking table "tablename"
ERROR: query failed: 
    ERROR: duplicate key value violates unique constraint "index_16508"
DETAIL:  Key (id, index)=(100500, 42) already exists.

ื–ื” ืžืชืจื—ืฉ ื›ืืฉืจ ื ืชื•ื ื™ื ืžื•ืขืชืงื™ื ืžื˜ื‘ืœืช ื™ื•ืžืŸ ืœื˜ื‘ืœื” ื—ื“ืฉื”. ื–ื” ื ืจืื” ืžื•ื–ืจ ื›ื™... ื”ื ืชื•ื ื™ื ื‘ื˜ื‘ืœืช ื”ื™ื•ืžืŸ ืžื—ื•ื™ื‘ื™ื ื™ื—ื“ ืขื ื”ื ืชื•ื ื™ื ื‘ื˜ื‘ืœืช ื”ืžืงื•ืจ. ืื ื”ื ืขื•ืžื“ื™ื ื‘ืื™ืœื•ืฆื™ื ืฉืœ ื”ื˜ื‘ืœื” ื”ืžืงื•ืจื™ืช, ืื™ืš ื”ื ื™ื›ื•ืœื™ื ืœื”ืคืจ ืืช ืื•ืชื ื”ืื™ืœื•ืฆื™ื ื‘ื˜ื‘ืœื” ื”ื—ื“ืฉื”?

ื›ืคื™ ืฉืžืชื‘ืจืจ, ืฉื•ืจืฉ ื”ื‘ืขื™ื” ื˜ืžื•ืŸ ื‘ืฉืœื‘ ื”ืงื•ื“ื ืฉืœ pg_repack, ืฉื™ื•ืฆืจ ืจืง ืื™ื ื“ืงืกื™ื, ืืš ืœื ืื™ืœื•ืฆื™ื: ืœื˜ื‘ืœื” ื”ื™ืฉื ื” ื”ื™ื” ืื™ืœื•ืฅ ื™ื™ื—ื•ื“ื™, ื•ื”ื—ื“ืฉื” ื™ืฆืจื” ืื™ื ื“ืงืก ื™ื™ื—ื•ื“ื™ ื‘ืžืงื•ื.

Postgres: bloat, pg_repack ื•ืื™ืœื•ืฆื™ื ื“ื—ื•ื™ื™ื

ื—ืฉื•ื‘ ืœืฆื™ื™ืŸ ื›ืืŸ ืฉืื ื”ืื™ืœื•ืฅ ื ื•ืจืžืœื™ ื•ืœื ื ื“ื—ื”, ืื– ื”ืžื“ื“ ื”ื™ื™ื—ื•ื“ื™ ืฉื ื•ืฆืจ ื‘ืžืงื•ื ืฉื•ื•ื” ืขืจืš ืœืื™ืœื•ืฅ ื”ื–ื”, ืžื›ื™ื•ื•ืŸ ืื™ืœื•ืฆื™ื ื™ื™ื—ื•ื“ื™ื™ื ื‘-Postgres ืžื™ื•ืฉืžื™ื ืขืœ ื™ื“ื™ ื™ืฆื™ืจืช ืื™ื ื“ืงืก ื™ื™ื—ื•ื“ื™. ืื‘ืœ ื‘ืžืงืจื” ืฉืœ ืื™ืœื•ืฅ ื“ื—ื•ื™, ื”ื”ืชื ื”ื’ื•ืช ืื™ื ื” ื–ื”ื”, ืžื›ื™ื•ื•ืŸ ืฉืœื ื ื™ืชืŸ ืœื“ื—ื•ืช ืืช ื”ืื™ื ื“ืงืก ื•ื”ื•ื ืชืžื™ื“ ืžืกื•ืžืŸ ื‘ื–ืžืŸ ื‘ื™ืฆื•ืข ื”ืคืงื•ื“ื” sql.

ืœืคื™ื›ืš, ืžื”ื•ืช ื”ื‘ืขื™ื” ื ืขื•ืฆื” ื‘"ื”ืฉื”ื™ื”" ืฉืœ ื”ื‘ื“ื™ืงื”: ื‘ื˜ื‘ืœื” ื”ืžืงื•ืจื™ืช ื”ื™ื ืžืชืจื—ืฉืช ื‘ื–ืžืŸ ื”-commit, ื•ื‘ื˜ื‘ืœื” ื”ื—ื“ืฉื” ื‘ื–ืžืŸ ื‘ื™ืฆื•ืข ื”ืคืงื•ื“ื” sql. ื”ืžืฉืžืขื•ืช ื”ื™ื ืฉืขืœื™ื ื• ืœื•ื•ื“ื ืฉื”ื‘ื“ื™ืงื•ืช ืžื‘ื•ืฆืขื•ืช ื–ื”ื” ื‘ืฉื ื™ ื”ืžืงืจื™ื: ืื• ืชืžื™ื“ ื‘ืื™ื—ื•ืจ, ืื• ืชืžื™ื“ ืžื™ื“.

ืื– ืื™ื–ื” ืจืขื™ื•ื ื•ืช ื”ื™ื• ืœื ื•?

ืฆื•ืจ ืื™ื ื“ืงืก ื“ื•ืžื” ืœื“ื—ื•ื™

ื”ืจืขื™ื•ืŸ ื”ืจืืฉื•ืŸ ื”ื•ื ืœื‘ืฆืข ืืช ืฉืชื™ ื”ื‘ื“ื™ืงื•ืช ื‘ืžืฆื‘ ืžื™ื™ื“ื™. ื–ื” ืขืœื•ืœ ืœื™ืฆื•ืจ ืžืกืคืจ ื”ื’ื‘ืœื•ืช ื—ื™ื•ื‘ื™ื•ืช ื›ื•ื–ื‘ื•ืช, ืื‘ืœ ืื ื™ืฉ ืžืขื˜ ืžื”ืŸ, ื–ื” ืœื ืืžื•ืจ ืœื”ืฉืคื™ืข ืขืœ ืขื‘ื•ื“ืช ื”ืžืฉืชืžืฉื™ื, ืฉื›ืŸ ื”ืชื ื’ืฉื•ื™ื•ืช ื›ืืœื” ื”ืŸ ืžืฆื‘ ื ื•ืจืžืœื™ ืขื‘ื•ืจื. ื”ื ืžืชืจื—ืฉื™ื, ืœืžืฉืœ, ื›ืืฉืจ ืฉื ื™ ืžืฉืชืžืฉื™ื ืžืชื—ื™ืœื™ื ืœืขืจื•ืš ืืช ืื•ืชื• ื™ื™ืฉื•ืžื•ืŸ ื‘ื• ื–ืžื ื™ืช, ื•ืœืœืงื•ื— ืฉืœ ื”ืžืฉืชืžืฉ ื”ืฉื ื™ ืื™ืŸ ื–ืžืŸ ืœืงื‘ืœ ืžื™ื“ืข ืฉื”ื•ื•ื™ื“ื’'ื˜ ื›ื‘ืจ ื—ืกื•ื ืœืขืจื™ื›ื” ืขืœ ื™ื“ื™ ื”ืžืฉืชืžืฉ ื”ืจืืฉื•ืŸ. ื‘ืžืฆื‘ ื›ื–ื”, ื”ืฉืจืช ืžืกืจื‘ ืœืžืฉืชืžืฉ ื”ืฉื ื™, ื•ื”ืœืงื•ื— ืฉืœื• ืžื—ื–ื™ืจ ืืช ื”ืฉื™ื ื•ื™ื™ื ื•ื—ื•ืกื ืืช ื”ื•ื•ื™ื“ื’'ื˜. ืงืฆืช ืžืื•ื—ืจ ื™ื•ืชืจ, ื›ืฉื”ืžืฉืชืžืฉ ื”ืจืืฉื•ืŸ ื™ืกื™ื™ื ืืช ื”ืขืจื™ื›ื”, ื”ืฉื ื™ ื™ืงื‘ืœ ืžื™ื“ืข ืฉื”ื•ื•ื™ื“ื’'ื˜ ื›ื‘ืจ ืœื ื—ืกื•ื ื•ื™ื•ื›ืœ ืœื—ื–ื•ืจ ืขืœ ื”ืคืขื•ืœื” ืฉืœื•.

Postgres: bloat, pg_repack ื•ืื™ืœื•ืฆื™ื ื“ื—ื•ื™ื™ื

ื›ื“ื™ ืœื”ื‘ื˜ื™ื— ืฉื”ื”ืžื—ืื•ืช ื™ื”ื™ื• ืชืžื™ื“ ื‘ืžืฆื‘ ืœื ื ื“ื—ื”, ื™ืฆืจื ื• ืื™ื ื“ืงืก ื—ื“ืฉ ื”ื“ื•ืžื” ืœืื™ืœื•ืฅ ื”ื ื“ื—ื” ื”ืžืงื•ืจื™:

CREATE UNIQUE INDEX CONCURRENTLY uk_tablename__immediate ON tablename (id, index);
-- run pg_repack
DROP INDEX CONCURRENTLY uk_tablename__immediate;

ื‘ืกื‘ื™ื‘ืช ื”ื‘ื“ื™ืงื”, ืงื™ื‘ืœื ื• ืจืง ื›ืžื” ืฉื’ื™ืื•ืช ืฆืคื•ื™ื•ืช. ื”ึทืฆืœึธื—ึธื”! ื”ืจืฆื ื• ืฉื•ื‘ ืืช pg_repack ื‘ื”ืคืงื” ื•ืงื™ื‘ืœื ื• 5 ืฉื’ื™ืื•ืช ื‘ืืฉื›ื•ืœ ื”ืจืืฉื•ืŸ ืชื•ืš ืฉืขื” ืฉืœ ืขื‘ื•ื“ื”. ื–ื• ืชื•ืฆืื” ืžืงื•ื‘ืœืช. ืขื ื–ืืช, ื›ื‘ืจ ื‘ืืฉื›ื•ืœ ื”ืฉื ื™ ืžืกืคืจ ื”ืฉื’ื™ืื•ืช ื’ื“ืœ ืžืฉืžืขื•ืชื™ืช ื•ื ืืœืฆื ื• ืœื”ืคืกื™ืง ืืช pg_repack.

ืœืžื” ื–ื” ืงืจื”? ื”ืกื‘ื™ืจื•ืช ืœื”ืชืจื—ืฉื•ืช ืฉื’ื™ืื” ืชืœื•ื™ื” ื‘ื›ืžื” ืžืฉืชืžืฉื™ื ืขื•ื‘ื“ื™ื ืขื ืื•ืชื ื•ื•ื™ื“ื’'ื˜ื™ื ื‘ื• ื–ืžื ื™ืช. ื›ื›ืœ ื”ื ืจืื”, ื‘ืื•ืชื• ืจื’ืข ื”ื™ื• ื”ืจื‘ื” ืคื—ื•ืช ืฉื™ื ื•ื™ื™ื ืชื—ืจื•ืชื™ื™ื ืขื ื”ื ืชื•ื ื™ื ื”ืžืื•ื—ืกื ื™ื ื‘ืืฉื›ื•ืœ ื”ืจืืฉื•ืŸ ืžืืฉืจ ื‘ืื—ืจื™ื, ื›ืœื•ืžืจ. ืคืฉื•ื˜ ื”ื™ื” ืœื ื• "ืžื–ืœ".

ื”ืจืขื™ื•ืŸ ืœื ืขื‘ื“. ื‘ืฉืœื‘ ื–ื”, ืจืื™ื ื• ืฉื ื™ ืคืชืจื•ื ื•ืช ื ื•ืกืคื™ื: ื›ืชื•ื‘ ืžื—ื“ืฉ ืืช ืงื•ื“ ื”ื™ื™ืฉื•ื ืฉืœื ื• ื›ื“ื™ ืœื•ื•ืชืจ ืขืœ ืื™ืœื•ืฆื™ื ื“ื—ื•ื™ื™ื, ืื• "ืœืœืžื“" ืืช pg_repack ืœืขื‘ื•ื“ ืื™ืชื. ื‘ื—ืจื ื• ื‘ืฉื ื™.

ื”ื—ืœืฃ ืื™ื ื“ืงืกื™ื ื‘ื˜ื‘ืœื” ื”ื—ื“ืฉื” ื‘ืื™ืœื•ืฆื™ื ื“ื—ื•ื™ื™ื ืžื”ื˜ื‘ืœื” ื”ืžืงื•ืจื™ืช

ืžื˜ืจืช ื”ืขื“ื›ื•ืŸ ื”ื™ื™ืชื” ื‘ืจื•ืจื” - ืื ืœื˜ื‘ืœื” ื”ืžืงื•ืจื™ืช ื™ืฉ ืื™ืœื•ืฅ ื“ื—ื•ื™, ืื– ืขื‘ื•ืจ ื”ื—ื“ืฉ ืืชื” ืฆืจื™ืš ืœื™ืฆื•ืจ ืื™ืœื•ืฅ ื›ื–ื”, ื•ืœื ืื™ื ื“ืงืก.

ื›ื“ื™ ืœื‘ื“ื•ืง ืืช ื”ืฉื™ื ื•ื™ื™ื ืฉืœื ื•, ื›ืชื‘ื ื• ืžื‘ื—ืŸ ืคืฉื•ื˜:

  • ื˜ื‘ืœื” ืขื ืื™ืœื•ืฅ ื“ื—ื•ื™ ื•ืจืฉื•ืžื” ืื—ืช;
  • ื”ื›ื ืก ื ืชื•ื ื™ื ื‘ืœื•ืœืื” ืฉืžืชื ื’ืฉืช ืขื ืจืฉื•ืžื” ืงื™ื™ืžืช;
  • ื‘ืฆืข ืขื“ื›ื•ืŸ - ื”ื ืชื•ื ื™ื ืื™ื ื ืžืชื ื’ืฉื™ื ื™ื•ืชืจ;
  • ืœื‘ืฆืข ืืช ื”ืฉื™ื ื•ื™ื™ื.

create table test_table
(
  id serial,
  val int,
  constraint uk_test_table__val unique (val) deferrable initially deferred 
);

INSERT INTO test_table (val) VALUES (0);
FOR i IN 1..10000 LOOP
  BEGIN
    INSERT INTO test_table VALUES (0) RETURNING id INTO v_id;
    UPDATE test_table set val = i where id = v_id;
    COMMIT;
  END;
END LOOP;

ื”ื’ืจืกื” ื”ืžืงื•ืจื™ืช ืฉืœ pg_repack ืชืžื™ื“ ืงืจืกื” ื‘ื”ื•ืกืคื” ื”ืจืืฉื•ื ื”, ื”ื’ืจืกื” ืฉืฉื•ื ืชื” ืขื‘ื“ื” ืœืœื ืฉื’ื™ืื•ืช. ื’ื“ื•ืœ.

ืื ื—ื ื• ื”ื•ืœื›ื™ื ืœื™ื™ืฆื•ืจ ื•ืฉื•ื‘ ืžืงื‘ืœื™ื ืฉื’ื™ืื” ื‘ืื•ืชื• ืฉืœื‘ ืฉืœ ื”ืขืชืงืช ื ืชื•ื ื™ื ืžื˜ื‘ืœืช ื”ื™ื•ืžืŸ ืœืื—ื“ ื—ื“ืฉ:

$ ./pg_repack -t tablename -o id
INFO: repacking table "tablename"
ERROR: query failed: 
    ERROR: duplicate key value violates unique constraint "index_16508"
DETAIL:  Key (id, index)=(100500, 42) already exists.

ืžืฆื‘ ืงืœืืกื™: ื”ื›ืœ ืขื•ื‘ื“ ื‘ืกื‘ื™ื‘ื•ืช ื‘ื“ื™ืงื”, ืื‘ืœ ืœื ื‘ื™ื™ืฆื•ืจ?!

APPLY_COUNT ื•ื”ืฆื•ืžืช ืฉืœ ืฉืชื™ ืงื‘ื•ืฆื•ืช

ื”ืชื—ืœื ื• ืœื ืชื— ืืช ื”ืงื•ื“ ืžืžืฉ ืฉื•ืจื” ืื—ืจ ืฉื•ืจื” ื•ื’ื™ืœื™ื ื• ื ืงื•ื“ื” ื—ืฉื•ื‘ื”: ื ืชื•ื ื™ื ืžื•ืขื‘ืจื™ื ืžื˜ื‘ืœืช ื”ื™ื•ืžืŸ ืœื—ื“ืฉื” ื‘ืืฆื•ื•ื”, ื”ืงื‘ื•ืข APPLY_COUNT ื”ืฆื‘ื™ืข ืขืœ ื’ื•ื“ืœ ื”ืืฆื•ื•ื”:

for (;;)
{
num = apply_log(connection, table, APPLY_COUNT);

if (num > MIN_TUPLES_BEFORE_SWITCH)
     continue;  /* there might be still some tuples, repeat. */
...
}

ื”ื‘ืขื™ื” ื”ื™ื ืฉื”ื ืชื•ื ื™ื ืžื”ื˜ืจื ื–ืงืฆื™ื” ื”ืžืงื•ืจื™ืช, ืฉื‘ื” ืžืกืคืจ ืคืขื•ืœื•ืช ืขืœื•ืœื•ืช ืœื”ืคืจ ืืช ื”ืื™ืœื•ืฅ, ื›ืฉื”ืŸ ืžื•ืขื‘ืจื•ืช, ื™ื›ื•ืœื™ื ืœื”ืกืชื™ื™ื ื‘ืฆื•ืžืช ืฉืœ ืฉืชื™ ืืฆื•ื•ืช - ืžื—ืฆื™ืช ืžื”ืคืงื•ื“ื•ืช ื™ืชื‘ืฆืขื• ื‘ืืฆื•ื•ื” ื”ืจืืฉื•ื ื”, ื•ื”ื—ืฆื™ ื”ืฉื ื™. ื‘ืฉื ื™ื™ื”. ื•ื”ื ื”, ืชืœื•ื™ ื‘ืžื–ืœ ืฉืœืš: ืื ื”ืงื‘ื•ืฆื•ืช ืœื ืžืคืจื•ืช ืฉื•ื ื“ื‘ืจ ื‘ืžื ื” ื”ืจืืฉื•ื ื”, ืื– ื”ื›ืœ ื‘ืกื“ืจ, ืื‘ืœ ืื ื›ืŸ, ืžืชืจื—ืฉืช ืฉื’ื™ืื”.

APPLY_COUNT ืฉื•ื•ื” ืœ-1000 ืจืฉื•ืžื•ืช, ืžื” ืฉืžืกื‘ื™ืจ ืžื“ื•ืข ื”ื‘ื“ื™ืงื•ืช ืฉืœื ื• ื”ื™ื• ืžื•ืฆืœื—ื•ืช - ื”ืŸ ืœื ื›ื™ืกื• ืืช ื”ืžืงืจื” ืฉืœ "ืฆื•ืžืช ืืฆื•ื•ื”". ื”ืฉืชืžืฉื ื• ื‘ืฉืชื™ ืคืงื•ื“ื•ืช - ื”ื•ืกืคื” ื•ืขื“ื›ื•ืŸ, ื›ืš ืฉื‘ื“ื™ื•ืง 500 ื˜ืจื ื–ืงืฆื™ื•ืช ืฉืœ ืฉืชื™ ืคืงื•ื“ื•ืช ืชืžื™ื“ ื”ื•ืฆื‘ื• ื‘ืืฆื•ื•ื” ื•ืœื ื ืชืงืœื ื• ื‘ื‘ืขื™ื•ืช. ืœืื—ืจ ื”ื•ืกืคืช ื”ืขื“ื›ื•ืŸ ื”ืฉื ื™, ื”ืขืจื™ื›ื” ืฉืœื ื• ื”ืคืกื™ืงื” ืœืขื‘ื•ื“:

FOR i IN 1..10000 LOOP
  BEGIN
    INSERT INTO test_table VALUES (1) RETURNING id INTO v_id;
    UPDATE test_table set val = i where id = v_id;
    UPDATE test_table set val = i where id = v_id; -- one more update
    COMMIT;
  END;
END LOOP;

ืœื›ืŸ, ื”ืžืฉื™ืžื” ื”ื‘ืื” ื”ื™ื ืœื•ื•ื“ื ืฉื”ื ืชื•ื ื™ื ืžื”ื˜ื‘ืœื” ื”ืžืงื•ืจื™ืช, ืฉืฉื•ื ืชื” ื‘ื˜ืจื ื–ืงืฆื™ื” ืื—ืช, ืžื’ื™ืขื” ืœื˜ื‘ืœื” ื”ื—ื“ืฉื” ื’ื ื‘ืชื•ืš ื˜ืจื ื–ืงืฆื™ื” ืื—ืช.

ืกื™ืจื•ื‘ ืžืืฆื•ื•ื”

ื•ืฉื•ื‘ ื”ื™ื• ืœื ื• ืฉื ื™ ืคืชืจื•ื ื•ืช. ืจืืฉื™ืช: ื‘ื•ืื• ื ื˜ื•ืฉ ืœื—ืœื•ื˜ื™ืŸ ืืช ื”ื—ืœื•ืงื” ืœืืฆื•ื•ืช ื•ื ืขื‘ื™ืจ ื ืชื•ื ื™ื ื‘ืขืกืงื” ืื—ืช. ื”ื™ืชืจื•ืŸ ืฉืœ ืคืชืจื•ืŸ ื–ื” ื”ื™ื” ื”ืคืฉื˜ื•ืช ืฉืœื• - ืฉื™ื ื•ื™ื™ ื”ืงื•ื“ ื”ื ื“ืจืฉื™ื ื”ื™ื• ืžื™ื ื™ืžืœื™ื™ื (ืื’ื‘, ื‘ื’ืจืกืื•ืช ื™ืฉื ื•ืช ื™ื•ืชืจ pg_reorg ืขื‘ื“ ื‘ื“ื™ื•ืง ื›ืš). ืื‘ืœ ื™ืฉ ื‘ืขื™ื” - ืื ื—ื ื• ื™ื•ืฆืจื™ื ืขืกืงื” ืืจื•ื›ืช ืฉื ื™ื, ื•ื–ื”, ื›ืืžื•ืจ, ืื™ื•ื ืขืœ ื”ื•ืคืขืชื” ืฉืœ ื ืคื™ื—ื•ืช ื—ื“ืฉื”.

ื”ืคืชืจื•ืŸ ื”ืฉื ื™ ืžื•ืจื›ื‘ ื™ื•ืชืจ, ืื‘ืœ ื›ื ืจืื” ื ื›ื•ืŸ ื™ื•ืชืจ: ืฆื•ืจ ืขืžื•ื“ื” ื‘ื˜ื‘ืœืช ื”ื™ื•ืžืŸ ืขื ืžื–ื”ื” ื”ืขืกืงื” ืฉื”ื•ืกื™ืคื” ื ืชื•ื ื™ื ืœื˜ื‘ืœื”. ืœืื—ืจ ืžื›ืŸ, ื›ืืฉืจ ืื ื• ืžืขืชื™ืงื™ื ื ืชื•ื ื™ื, ืื ื• ื™ื›ื•ืœื™ื ืœืงื‘ืฅ ืื•ืชื ืœืคื™ ืชื›ื•ื ื” ื–ื• ื•ืœื•ื•ื“ื ืฉื”ืฉื™ื ื•ื™ื™ื ื”ืงืฉื•ืจื™ื ืžื•ืขื‘ืจื™ื ื™ื—ื“. ื”ืืฆื•ื•ื” ืชื™ื•ื•ืฆืจ ืžืžืกืคืจ ืขืกืงืื•ืช (ืื• ืื—ืช ื’ื“ื•ืœื”) ื•ื’ื•ื“ืœื” ื™ืฉืชื ื” ื‘ื”ืชืื ืœื›ืžื•ืช ื”ื ืชื•ื ื™ื ืฉืฉื•ื ื• ื‘ืขืกืงืื•ืช ืืœื•. ื—ืฉื•ื‘ ืœืฆื™ื™ืŸ ื›ื™ ืžืื—ืจ ืฉื ืชื•ื ื™ื ืžืขืกืงื•ืช ืฉื•ื ื•ืช ื ื›ื ืกื™ื ืœื˜ื‘ืœืช ื”ื™ื•ืžืŸ ื‘ืกื“ืจ ืืงืจืื™, ืœื ื ื™ืชืŸ ื™ื”ื™ื” ืœืงืจื•ื ืื•ืชื ื‘ืจืฆืฃ, ื›ืคื™ ืฉื”ื™ื” ื‘ืขื‘ืจ. seqscan ืขื‘ื•ืจ ื›ืœ ื‘ืงืฉื” ืขื ืกื™ื ื•ืŸ ืœืคื™ tx_id ื”ื•ื ื™ืงืจ ืžื“ื™, ื™ืฉ ืฆื•ืจืš ื‘ืื™ื ื“ืงืก, ืื‘ืœ ื–ื” ื’ื ื™ืื˜ ืืช ื”ืฉื™ื˜ื” ื‘ื’ืœืœ ื”ืชืงื•ืจื” ืฉืœ ื”ืขื“ื›ื•ืŸ ืฉืœื”. ื‘ืื•ืคืŸ ื›ืœืœื™, ื›ืžื• ืชืžื™ื“, ืืชื” ืฆืจื™ืš ืœื”ืงืจื™ื‘ ืžืฉื”ื•.

ืื– ื”ื—ืœื˜ื ื• ืœื”ืชื—ื™ืœ ืขื ื”ืืคืฉืจื•ืช ื”ืจืืฉื•ื ื”, ืžื›ื™ื•ื•ืŸ ืฉื”ื™ื ืคืฉื•ื˜ื” ื™ื•ืชืจ. ืจืืฉื™ืช, ื”ื™ื” ืฆื•ืจืš ืœื”ื‘ื™ืŸ ื”ืื ืขืกืงื” ืืจื•ื›ื” ืชื”ื•ื•ื” ื‘ืขื™ื” ืืžื™ืชื™ืช. ืžื›ื™ื•ื•ืŸ ืฉื”ื”ืขื‘ืจื” ื”ืขื™ืงืจื™ืช ืฉืœ ื”ื ืชื•ื ื™ื ืžื”ื˜ื‘ืœื” ื”ื™ืฉื ื” ืœื—ื“ืฉื” ืžืชืจื—ืฉืช ื’ื ื‘ืขืกืงื” ืื—ืช ืืจื•ื›ื”, ื”ืฉืืœื” ื”ืคื›ื” ืœ"ื›ืžื” ื ื’ื“ื™ืœ ืืช ื”ืขืกืงื” ื”ื–ื•?" ืžืฉืš ื”ืขืกืงื” ื”ืจืืฉื•ื ื” ืชืœื•ื™ ื‘ืขื™ืงืจ ื‘ื’ื•ื“ืœ ื”ืฉื•ืœื—ืŸ. ืžืฉืš ื”ื–ืžืŸ ืฉืœ ื—ื“ืฉ ืชืœื•ื™ ื‘ื›ืžื” ืฉื™ื ื•ื™ื™ื ืžืฆื˜ื‘ืจื™ื ื‘ื˜ื‘ืœื” ื‘ืžื”ืœืš ื”ืขื‘ืจืช ื”ื ืชื•ื ื™ื, ื›ืœื•ืžืจ. ืขืœ ืขื•ืฆืžืช ื”ืขื•ืžืก. ืจื™ืฆืช pg_repack ื”ืชืจื—ืฉื” ื‘ื–ืžืŸ ืฉืœ ืขื•ืžืก ืฉื™ืจื•ืช ืžื™ื ื™ืžืœื™, ื•ื ืคื— ื”ืฉื™ื ื•ื™ื™ื ื”ื™ื” ืงื˜ืŸ ื‘ืื•ืคืŸ ืœื ืคืจื•ืคื•ืจืฆื™ื•ื ืœื™ ื‘ื”ืฉื•ื•ืื” ืœื’ื•ื“ืœ ื”ืžืงื•ืจื™ ืฉืœ ื”ื˜ื‘ืœื”. ื”ื—ืœื˜ื ื• ืฉืื ื—ื ื• ื™ื›ื•ืœื™ื ืœื”ื–ื ื™ื— ืืช ื”ื–ืžืŸ ืฉืœ ืขืกืงื” ื—ื“ืฉื” (ืœืฉื ื”ืฉื•ื•ืื”, ื‘ืžืžื•ืฆืข ื–ื” 1 ืฉืขื” ื•-2-3 ื“ืงื•ืช).

ื”ื ื™ืกื•ื™ื™ื ื”ื™ื• ื—ื™ื•ื‘ื™ื™ื. ื”ืฉืงื” ื’ื ื‘ื”ืคืงื”. ืœืฉื ื”ื‘ื”ื™ืจื•ืช, ื”ื ื” ืชืžื•ื ื” ื‘ื’ื•ื“ืœ ืฉืœ ืื—ื“ ืžื‘ืกื™ืกื™ ื”ื ืชื•ื ื™ื ืœืื—ืจ ื”ื”ืคืขืœื”:

Postgres: bloat, pg_repack ื•ืื™ืœื•ืฆื™ื ื“ื—ื•ื™ื™ื

ืžื›ื™ื•ื•ืŸ ืฉื”ื™ื™ื ื• ืžืจื•ืฆื™ื ืœื—ืœื•ื˜ื™ืŸ ืžื”ืคืชืจื•ืŸ ื”ื–ื”, ืœื ื ื™ืกื™ื ื• ืœื™ื™ืฉื ืืช ื”ืฉื ื™, ืื‘ืœ ืื ื—ื ื• ืฉื•ืงืœื™ื ืืคืฉืจื•ืช ืœื“ื•ืŸ ื‘ื• ืขื ืžืคืชื—ื™ ื”ื”ืจื—ื‘ื”. ื”ื’ืจืกื” ื”ื ื•ื›ื—ื™ืช ืฉืœื ื•, ืœืžืจื‘ื” ื”ืฆืขืจ, ืขื“ื™ื™ืŸ ืœื ืžื•ื›ื ื” ืœืคืจืกื•ื, ืžื›ื™ื•ื•ืŸ ืฉืคืชืจื ื• ืืช ื”ื‘ืขื™ื” ืจืง โ€‹โ€‹ื‘ื”ื’ื‘ืœื•ืช ื“ื—ื•ื™ื•ืช ื™ื™ื—ื•ื“ื™ื•ืช, ื•ื‘ืฉื‘ื™ืœ ืชื™ืงื•ืŸ ืžืœื ื™ืฉ ืฆื•ืจืš ืœืกืคืง ืชืžื™ื›ื” ืœืกื•ื’ื™ื ืื—ืจื™ื. ืื ื• ืžืงื•ื•ื™ื ืฉื ื•ื›ืœ ืœืขืฉื•ืช ื–ืืช ื‘ืขืชื™ื“.

ืื•ืœื™ ื™ืฉ ืœืš ืฉืืœื”, ืœืžื” ื‘ื›ืœืœ ื”ืกืชื‘ื›ื ื• ื‘ืกื™ืคื•ืจ ื”ื–ื” ืขื ื”ืฉื™ื ื•ื™ ืฉืœ pg_repack, ื•ืœื ื”ืฉืชืžืฉื ื•, ืœืžืฉืœ, ื‘ืื ืœื•ื’ื™ื ืฉืœื•? ื‘ืฉืœื‘ ืžืกื•ื™ื ื’ื ื—ืฉื‘ื ื• ืขืœ ื–ื”, ืื‘ืœ ื”ื—ื•ื•ื™ื” ื”ื—ื™ื•ื‘ื™ืช ืฉืœ ืฉื™ืžื•ืฉ ืžื•ืงื“ื ื™ื•ืชืจ, ื‘ื˜ื‘ืœืื•ืช ืœืœื ืื™ืœื•ืฆื™ื ื“ื—ื•ื™ื™ื, ื”ื ื™ืขื” ืื•ืชื ื• ืœื ืกื•ืช ืœื”ื‘ื™ืŸ ืืช ืžื”ื•ืช ื”ื‘ืขื™ื” ื•ืœืชืงืŸ ืื•ืชื”. ื‘ื ื•ืกืฃ, ื’ื ืฉื™ืžื•ืฉ ื‘ืคืชืจื•ื ื•ืช ืื—ืจื™ื ื“ื•ืจืฉ ื–ืžืŸ ืœืขืจื™ื›ืช ื‘ื“ื™ืงื•ืช, ืื– ื”ื—ืœื˜ื ื• ืฉืงื•ื“ื ื›ืœ ื ื ืกื” ืœืชืงืŸ ื‘ื• ืืช ื”ื‘ืขื™ื”, ื•ืื ื ื‘ื™ืŸ ืฉืœื ื ื•ื›ืœ ืœืขืฉื•ืช ื–ืืช ื‘ื–ืžืŸ ืกื‘ื™ืจ, ืื– ื ืชื—ื™ืœ ืœื”ืกืชื›ืœ ืขืœ ืื ืœื•ื’ื™ื .

ืžืžืฆืื™ื

ืžื” ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœื”ืžืœื™ืฅ โ€‹โ€‹ืขืœ ืกืžืš ื”ื ื™ืกื™ื•ืŸ ืฉืœื ื•:

  1. ืขืงื•ื‘ ืื—ืจ ื”ื ืคื™ื—ื•ืช ืฉืœืš. ื‘ื”ืชื‘ืกืก ืขืœ ื ืชื•ื ื™ ื ื™ื˜ื•ืจ, ืืชื” ื™ื›ื•ืœ ืœื”ื‘ื™ืŸ ื‘ืื™ื–ื• ืฆื•ืจื” ืžื•ื’ื“ืจืช ื”ื•ื•ืืงื•ื ื”ืื•ื˜ื•ืžื˜ื™.
  2. ื›ื•ื•ื ืŸ ืืช AUTOVACUUM ื›ื“ื™ ืœืฉืžื•ืจ ืขืœ ื”ื ืคื™ื—ื•ืช ื‘ืจืžื” ืžืงื•ื‘ืœืช.
  3. ืื ื”ื ืคื™ื—ื•ืช ืขื“ื™ื™ืŸ ื’ื“ืœื” ื•ืืชื” ืœื ื™ื›ื•ืœ ืœื”ืชื’ื‘ืจ ืขืœื™ื” ื‘ืืžืฆืขื•ืช ื›ืœื™ื ืžื—ื•ืฅ ืœืงื•ืคืกื”, ืืœ ืชืคื—ื“ ืœื”ืฉืชืžืฉ ื‘ื”ืจื—ื‘ื•ืช ื—ื™ืฆื•ื ื™ื•ืช. ื”ืขื™ืงืจ ืœื‘ื“ื•ืง ื”ื›ืœ ื”ื™ื˜ื‘.
  4. ืืœ ืชืคื—ื“ ืœืฉื ื•ืช ืคืชืจื•ื ื•ืช ื—ื™ืฆื•ื ื™ื™ื ื›ื“ื™ ืฉื™ืชืื™ืžื• ืœืฆืจื›ื™ื ืฉืœืš - ืœืคืขืžื™ื ื–ื” ื™ื›ื•ืœ ืœื”ื™ื•ืช ื™ืขื™ืœ ื™ื•ืชืจ ื•ืืคื™ืœื• ืงืœ ื™ื•ืชืจ ืžืืฉืจ ืœืฉื ื•ืช ืืช ื”ืงื•ื“ ืฉืœืš.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”