Postgres: bloat, pg_repack ืื•ืŸ ื“ื™ืคืขืจื“ ืงืึทื ืกื˜ืจื™ื™ื ืฅ

Postgres: bloat, pg_repack ืื•ืŸ ื“ื™ืคืขืจื“ ืงืึทื ืกื˜ืจื™ื™ื ืฅ

ื“ื™ ื•ื•ื™ืจืงื•ื ื’ ืคื•ืŸ ื‘ืœืึธื•ื˜ื™ื ื’ ืื•ื™ืฃ ื˜ื™ืฉืŸ ืื•ืŸ ื™ื ื“ืขืงืกื™ื– ืื™ื– ื•ื•ื™ื™ื“ืœื™ ื‘ืึทื•ื•ื•ืกื˜ ืื•ืŸ ืื™ื– ืคืึธืจืฉื˜ืขืœืŸ ื ื™ื˜ ื‘ืœื•ื™ื– ืื™ืŸ Postgres. ืขืก ื–ืขื ืขืŸ ื•ื•ืขื’ืŸ ืฆื• ื”ืึทื ื“ืœืขืŸ ืžื™ื˜ ืขืก ืื•ื™ืก ืคื•ืŸ ื“ื™ ืงืขืกื˜ืœ, ื•ื•ื™ VACUUM FULL ืึธื“ืขืจ CLUSTER, ืึธื‘ืขืจ ื–ื™ื™ ืฉืœืึธืก ื˜ื™ืฉืŸ ื‘ืขืฉืึทืก ืึธืคึผืขืจืึทืฆื™ืข ืื•ืŸ ื“ืขืจื™ื‘ืขืจ ืงืขื ืขืŸ ื ื™ื˜ ืฉื˜ืขื ื“ื™ืง ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜.

ื“ืขืจ ืึทืจื˜ื™ืงืœ ื•ื•ืขื˜ ืึทื ื˜ื”ืึทืœื˜ืŸ ืึท ื‘ื™ืกืœ ื˜ืขืึธืจื™ืข ื•ื•ืขื’ืŸ ื•ื•ื™ ื‘ืœืึธืึทื˜ ืึทืงืขืจื–, ื•ื•ื™ ืื™ืจ ืงืขื ืขืŸ ืงืขืžืคืŸ ืขืก, ื•ื•ืขื’ืŸ ื“ื™ืคืขืจื“ ืงืึทื ืกื˜ืจื™ื™ื ืฅ ืื•ืŸ ื“ื™ ืคืจืื‘ืœืขืžืขืŸ ื•ื•ืึธืก ื–ื™ื™ ื‘ืจืขื ื’ืขืŸ ืฆื• ื“ื™ ื ื•ืฆืŸ ืคื•ืŸ ื“ื™ pg_repack ืคืึทืจืœืขื ื’ืขืจื•ื ื’.

ื“ืขืจ ืึทืจื˜ื™ืงืœ ืื™ื– ื’ืขืฉืจื™ื‘ืŸ ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ืžื™ื™ืŸ ืจืขื“ืข ืื™ืŸ PgConf.Russia 2020.

ืคืืจื•ื•ืืก ื˜ื•ื˜ ื‘ืœืึธื•ื˜ื™ื ื’ ืคืึทืœืŸ?

Postgres ืื™ื– ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ืึท ืžื•ืœื˜ื™-ื•ื•ืขืจืกื™ืข ืžืึธื“ืขืœ (MVCC). ื–ื™ื™ึทืŸ ืขืกืึทื ืก ืื™ื– ืึทื– ื™ืขื“ืขืจ ืจื•ื“ืขืจืŸ ืื™ืŸ ื“ื™ ื˜ื™ืฉ ืงืขื ืขืŸ ื”ืึธื‘ืŸ ืขื˜ืœืขื›ืข ื•ื•ืขืจืกื™ืขืก, ื‘ืฉืขืช ื˜ืจืึทื ื–ืึทืงืฉืึทื ื– ื–ืขืŸ ื ื™ื˜ ืžืขืจ ื•ื•ื™ ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ื•ื•ืขืจืกื™ืขืก, ืึธื‘ืขืจ ื ื™ื˜ ื“ืึทื•ื•ืงืข ื“ื™ ื–ืขืœื‘ืข. ื“ืึธืก ืึทืœืึทื•ื– ืขื˜ืœืขื›ืข ื˜ืจืึทื ื–ืึทืงืฉืึทื ื– ืฆื• ืึทืจื‘ืขื˜ืŸ ืกื™ื™ืžืึทืœื˜ื™ื™ื ื™ืึทืกืœื™ ืื•ืŸ ื”ืึธื‘ืŸ ื›ึผืžืขื˜ ืงื™ื™ืŸ ืคึผืจืึทืœ ืื•ื™ืฃ ื™ืขื“ืขืจ ืื ื“ืขืจืขืจ.

ื“ืึธืš, ืึทืœืข ื“ื™ ื•ื•ืขืจืกื™ืขืก ื“ืึทืจืคึฟืŸ ืฆื• ื–ื™ื™ืŸ ืกื˜ืึธืจื“. Postgres ืึทืจื‘ืขื˜ ืžื™ื˜ ื–ื›ึผืจื•ืŸ ื‘ืœืึทื˜ ืคึฟืึทืจ ื‘ืœืึทื˜ ืื•ืŸ ืึท ื‘ืœืึทื˜ ืื™ื– ื“ื™ ืžื™ื ื™ืžื•ื ืกื•ืžืข ืคื•ืŸ โ€‹โ€‹โ€‹โ€‹ื“ืึทื˜ืŸ ื•ื•ืึธืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ืœื™ื™ืขื ืขืŸ ืคื•ืŸ ื“ื™ืกืง ืึธื“ืขืจ ื’ืขืฉืจื™ื‘ืŸ. ืœืึธืžื™ืจ ืงื•ืงืŸ ืื™ืŸ ืึท ืงืœื™ื™ืŸ ื‘ื™ื™ึทืฉืคึผื™ืœ ืฆื• ืคึฟืึทืจืฉื˜ื™ื™ืŸ ื•ื•ื™ ื“ืึธืก ื›ืึทืคึผืึทื ื–.

ื–ืืœ ืก ื–ืึธื’ืŸ ืžื™ืจ ื”ืึธื‘ืŸ ืึท ื˜ื™ืฉ ืฆื• ื•ื•ืึธืก ืžื™ืจ ื”ืึธื‘ืŸ ืฆื•ื’ืขืœื™ื™ื’ื˜ ืขื˜ืœืขื›ืข ืจืขืงืึธืจื“ืก. ื ื™ื• ื“ืึทื˜ืŸ ื–ืขื ืขืŸ ืืจื•ื™ืก ืื•ื™ืฃ ื“ืขืจ ืขืจืฉื˜ืขืจ ื‘ืœืึทื˜ ืคื•ืŸ ื“ืขืจ ื˜ืขืงืข ื•ื•ื• ื“ื™ ื˜ื™ืฉ ืื™ื– ืกื˜ืึธืจื“. ื“ืึธืก ื–ืขื ืขืŸ ืœืขื‘ืŸ ื•ื•ืขืจืกื™ืขืก ืคื•ืŸ ืจืึธื•ื– ื•ื•ืึธืก ื–ืขื ืขืŸ ื‘ืืจืขื›ื˜ื™ื’ื˜ ืคึฟืึทืจ ืื ื“ืขืจืข ื˜ืจืึทื ื–ืึทืงืฉืึทื ื– ื ืึธืš ืึท ื™ื‘ืขืจื’ืขื‘ืŸ (ืคึฟืึทืจ ืคึผืึทืฉื˜ืขืก, ืžื™ืจ ื•ื•ืขืœืŸ ื™ื‘ืขืจื ืขืžืขืŸ ืึทื– ื“ื™ ืืคื’ืขื–ื•ื ื“ืขืจื˜ืงื™ื™ื˜ ืžื“ืจื’ื” ืื™ื– ืœื™ื™ืขื ืขืŸ ืงืึทืžื™ื˜ืึทื“).

Postgres: bloat, pg_repack ืื•ืŸ ื“ื™ืคืขืจื“ ืงืึทื ืกื˜ืจื™ื™ื ืฅ

ืžื™ืจ ื“ืขืจื ืึธืš ื“ืขืจื”ื™ื™ึทื ื˜ื™ืงื˜ ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ืื™ื™ื ืกืŸ, ื“ืขืจืžื™ื˜ ืžืึทืจืงื™ื ื’ ื“ื™ ืึทืœื˜ ื•ื•ืขืจืกื™ืข ื•ื•ื™ ื ื™ื˜ ืžืขืจ ื‘ืึทื˜ื™ื™ึทื˜ื™ืง.

Postgres: bloat, pg_repack ืื•ืŸ ื“ื™ืคืขืจื“ ืงืึทื ืกื˜ืจื™ื™ื ืฅ

ืฉืจื™ื˜ ื“ื•ืจืš ืฉืจื™ื˜, ืึทืคึผื“ื™ื™ื˜ื™ื ื’ ืื•ืŸ ื•ื™ืกืžืขืงืŸ ืจื•ื“ืขืจืŸ ื•ื•ืขืจืกื™ืขืก, ืžื™ืจ ืขื ื“ื™ืงื˜ ื–ื™ืš ืžื™ื˜ ืึท ื‘ืœืึทื˜ ืื™ืŸ ื•ื•ืึธืก ื‘ืขืขืจืขืš ื”ืึทืœื‘ ืคื•ืŸ ื“ื™ ื“ืึทื˜ืŸ ืื™ื– "ืžื™ืกื˜". ื“ื™ ื“ืึทื˜ืŸ ื–ืขื ืขืŸ ื ื™ืฉื˜ ืงืขื ื˜ื™ืง ืคึฟืึทืจ ืงื™ื™ืŸ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ.

Postgres: bloat, pg_repack ืื•ืŸ ื“ื™ืคืขืจื“ ืงืึทื ืกื˜ืจื™ื™ื ืฅ

Postgres ื”ืื˜ ืึท ืžืขืงืึทื ื™ื–ืึทื VACUUM, ื•ื•ืึธืก ืงืœื™ื ื– ืื•ื™ืก ืคืึทืจืขืœื˜ืขืจื˜ ื•ื•ืขืจืกื™ืขืก ืื•ืŸ ืžืื›ื˜ ืคึผืœืึทืฅ ืคึฟืึทืจ ื ื™ื™ึทืข ื“ืึทื˜ืŸ. ืึธื‘ืขืจ ืื•ื™ื‘ ืขืก ืื™ื– ื ื™ืฉื˜ ืงืึทื ืคื™ื’ื™ืขืจื“ ืึทื’ืจืขืกื™ื•ื•ืœื™ ื’ืขื ื•ื’ ืึธื“ืขืจ ืื™ื– ืคืึทืจื ื•ืžืขืŸ ืืจื‘ืขื˜ืŸ ืื™ืŸ ืื ื“ืขืจืข ื˜ื™ืฉืŸ, ื“ืขืžืึธืœื˜ "ืžื™ืกื˜ ื“ืึทื˜ืŸ" ื‘ืœื™ื™ื‘ื˜, ืื•ืŸ ืžื™ืจ ื”ืึธื‘ืŸ ืฆื• ื ื•ืฆืŸ ื ืึธืš ื‘ืœืขื˜ืขืจ ืคึฟืึทืจ ื ื™ื™ึทืข ื“ืึทื˜ืŸ.

ืึทื–ื•ื™ ืื™ืŸ ืื•ื ื“ื–ืขืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ืื™ืŸ ืขื˜ืœืขื›ืข ืคื•ื ื˜ ืื™ืŸ ืฆื™ื™ื˜, ื“ื™ ื˜ื™ืฉ ื•ื•ืขื˜ ืฆื•ื ื•ื™ืคืฉื˜ืขืœื  ื–ื™ืš ืคื•ืŸ ืคื™ืจ ื‘ืœืขื˜ืขืจ, ืึธื‘ืขืจ ื‘ืœื•ื™ื– ื”ืึทืœื‘ ืคื•ืŸ ืขืก ื•ื•ืขื˜ ืึทื ื˜ื”ืึทืœื˜ืŸ ืœืขื‘ืŸ ื“ืึทื˜ืŸ. ื•ื•ื™ ืึท ืจืขื–ื•ืœื˜ืึทื˜, ื•ื•ืขืŸ ืึทืงืกืขืก ื“ื™ ื˜ื™ืฉ, ืžื™ืจ ื•ื•ืขืœืŸ ืœื™ื™ืขื ืขืŸ ืคื™ืœ ืžืขืจ ื“ืึทื˜ืŸ ื•ื•ื™ ื ื™ื™ื˜ื™ืง.

Postgres: bloat, pg_repack ืื•ืŸ ื“ื™ืคืขืจื“ ืงืึทื ืกื˜ืจื™ื™ื ืฅ

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

Postgres: bloat, pg_repack ืื•ืŸ ื“ื™ืคืขืจื“ ืงืึทื ืกื˜ืจื™ื™ื ืฅ

ื•ื•ืขืŸ ื“ื™ ื ื•ืžืขืจ ืคื•ืŸ ืึทื–ืึท ืœื™ื™ื“ื™ืง ืึธื“ืขืจ ื”ืขื›ืกื˜ ืฉื™ื˜ืขืจ ื‘ืœืขื˜ืขืจ ื•ื•ืขืจื˜ ื’ืจื•ื™ืก, ื•ื•ืึธืก ืื™ื– ื’ืขืจื•ืคืŸ ื‘ืœืึธื•ื˜ื™ื ื’, ืขืก ื”ื™ื™ื‘ื˜ ืฆื• ื•ื•ื™ืจืงืŸ ืคืึธืจืฉื˜ืขืœื•ื ื’.

ืึทืœืฅ ื“ื™ืกืงืจื™ื™ื‘ื“ ืื•ื™ื‘ืŸ ืื™ื– ื“ื™ ืžืึทืงืึทื ื™ืงืก ืคื•ืŸ ื“ื™ ืคึผืึทืกื™ืจื•ื ื’ ืคื•ืŸ ื‘ืœืึธื•ื˜ื™ื ื’ ืื™ืŸ ื˜ื™ืฉืŸ. ืื™ืŸ ื™ื ื“ืขืงืกื™ื– ื“ืึธืก ื›ืึทืคึผืึทื ื– ืื™ืŸ ืคื™ืœ ื“ื™ ื–ืขืœื‘ืข ื•ื•ืขื’.

ืฆื™ ืื™ืš ื”ืึธื‘ืŸ ืึท ื‘ืœืึธื˜ืข?

ืขืก ื–ืขื ืขืŸ ืขื˜ืœืขื›ืข ื•ื•ืขื’ืŸ ืฆื• ื‘ืึทืฉืœื™ืกืŸ ืื•ื™ื‘ ืื™ืจ ื”ืึธื‘ืŸ ืึท ื‘ืœืึธื•ื˜ื™ื ื’. ื“ืขืจ ื’ืขื“ืึทื ืง ืคื•ืŸ ื“ืขืจ ืขืจืฉื˜ืขืจ ืื™ื– ืฆื• ื ื•ืฆืŸ ื™ื ืขืจืœืขืš Postgres ืกื˜ืึทื˜ื™ืกื˜ื™ืง, ื•ื•ืึธืก ื›ึผื•ืœืœ ื“ืขืจื ืขื ื˜ืขืจื  ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ื•ื•ืขื’ืŸ ื“ื™ ื ื•ืžืขืจ ืคื•ืŸ ืจืึธื•ื– ืื™ืŸ ื˜ื™ืฉืŸ, ื“ื™ ื ื•ืžืขืจ ืคื•ืŸ "ืœืขื‘ืŸ" ืจืึธื•ื–, ืืื–"ื• ื•. ืื™ืจ ืงืขื ืขืŸ ื’ืขืคึฟื™ื ืขืŸ ืคื™ืœืข ื•ื•ืขืจื™ื™ื™ืฉืึทื ื– ืคื•ืŸ ืคืึทืจื˜ื™ืง ืกืงืจื™ืคึผืก ืื•ื™ืฃ ื“ืขืจ ืื™ื ื˜ืขืจื ืขืฅ. ืžื™ืจ ื’ืขื ื•ืžืขืŸ ื•ื•ื™ ืึท ื™ืงืขืจ ืฉืจื™ืคื˜ ืคึฟื•ืŸ PostgreSQL ืขืงืกืคึผืขืจืฅ, ื•ื•ืึธืก ืงืขื ืขืŸ ืึธืคึผืฉืึทืฆืŸ ื‘ืœืึธืึทื˜ ื˜ื™ืฉืŸ ืฆื•ื–ืืžืขืŸ ืžื™ื˜ ื˜ืึธืกื˜ ืื•ืŸ ื‘ืœืึธืึทื˜ ื‘ื˜ืจื™ ื™ื ื“ืขืงืกื™ื–. ืื™ืŸ ืื•ื ื“ื–ืขืจ ื“ืขืจืคืึทืจื•ื ื’, ื“ืขืจ ื˜ืขื•ืช ืื™ื– 10-20%.

ืืŸ ืื ื“ืขืจ ื•ื•ืขื’ ืื™ื– ืฆื• ื ื•ืฆืŸ ื“ื™ ืคืึทืจืœืขื ื’ืขืจื•ื ื’ pgstattuple, ื•ื•ืึธืก ืึทืœืึทื•ื– ืื™ืจ ืฆื• ืงื•ืงืŸ ืื™ืŸ ื“ื™ ื‘ืœืขื˜ืขืจ ืื•ืŸ ื‘ืึทืงื•ืžืขืŸ ื‘ื™ื™ื“ืข ืึทืŸ ืขืกื˜ื™ืžืึทื˜ืขื“ ืื•ืŸ ืึท ืคึผื™ื ื˜ืœืขืš ื‘ืœืึธื•ื˜ ื•ื•ืขืจื˜. ืื‘ืขืจ ืื™ืŸ ื“ื™ ืจื’ืข ืคืึทืœ, ืื™ืจ ื•ื•ืขื˜ ื”ืึธื‘ืŸ ืฆื• ื™ื‘ืขืจืงื•ืงืŸ ื“ื™ ื’ืื ืฆืข ื˜ื™ืฉ.

ืžื™ืจ ื‘ืึทื˜ืจืึทื›ื˜ืŸ ืึท ืงืœื™ื™ืŸ ื‘ืœืึธื•ื˜ ื•ื•ืขืจื˜, ืึทืจื•ื™ืฃ ืฆื• 20%, ืคึผืึทืกื™ืง. ืขืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ื‘ืื˜ืจืื›ื˜ ื•ื•ื™ ืึทืŸ ืึทื ืึทืœืึธื’ ืคื•ืŸ ืคื™ืœืคืึทืงื˜ืึธืจ ืคึฟืึทืจ ื˜ื™ืฉืŸ ะธ ื™ื ื“ืขืงืกื™ื–. ื‘ื™ื™ 50% ืื•ืŸ ื”ืขื›ืขืจ, ืคืึธืจืฉื˜ืขืœื•ื ื’ ืคึผืจืึธื‘ืœืขืžืก ืงืขืŸ ืึธื ื”ื™ื™ื‘ืŸ.

ื•ื•ืขื’ืŸ ืฆื• ืงืึทืžื‘ืึทื˜ ื‘ืœืึธื•ื˜ื™ื ื’

Postgres ื”ืื˜ ืขื˜ืœืขื›ืข ื•ื•ืขื’ืŸ ืฆื• ื”ืึทื ื“ืœืขืŸ ืžื™ื˜ ื‘ืœืึธื•ื˜ื™ื ื’ ืื•ื™ืก ืคื•ืŸ ื“ื™ ืงืขืกื˜ืœ, ืึธื‘ืขืจ ื–ื™ื™ ื–ืขื ืขืŸ ื ื™ืฉื˜ ืฉื˜ืขื ื“ื™ืง ืคึผืึทืกื™ืง ืคึฟืึทืจ ืึทืœืขืžืขืŸ.

ืงืึทื ืคื™ื’ื™ืขืจ AUTOVACUUM ืึทื–ื•ื™ ืึทื– ื‘ืœืึธื•ื˜ื™ื ื’ ืงืขืŸ ื ื™ืฉื˜ ืคึผืึทืกื™ืจืŸ. ืึธื“ืขืจ ืžืขืจ ื’ืขื ื•ื™, ืฆื• ื”ืึทืœื˜ืŸ ืขืก ืื•ื™ืฃ ืึท ื’ืœื™ื™ึทืš ืคึผืึทืกื™ืง ืคึฟืึทืจ ืื™ืจ. ื“ืึธืก ืžื™ื™ื ื˜ ื•ื•ื™ ืึท "ืงืึทืคึผื™ื˜ืึทืŸ ืก" ืขืฆื”, ืึธื‘ืขืจ ืื™ืŸ ืคืึทืงื˜ ื“ืึธืก ืื™ื– ื ื™ืฉื˜ ืฉื˜ืขื ื“ื™ืง ื’ืจื™ื ื’ ืฆื• ื“ืขืจื’ืจื™ื™ื›ืŸ. ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ืื™ืจ ื”ืึธื‘ืŸ ืึทืงื˜ื™ื•ื• ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’ ืžื™ื˜ ืจืขื’ื•ืœืขืจ ืขื ื“ืขืจื•ื ื’ืขืŸ ืฆื• ื“ื™ ื“ืึทื˜ืŸ ืกื›ืขืžืข, ืึธื“ืขืจ ืขื˜ืœืขื›ืข ืžื™ืŸ ืคื•ืŸ ื“ืึทื˜ืŸ ืžื™ื’ืจืึทื˜ื™ืึธืŸ ืื™ื– ื’ืขื ื•ืžืขืŸ. ื•ื•ื™ ืึท ืจืขื–ื•ืœื˜ืึทื˜, ื“ื™ื™ืŸ ืžืึทืกืข ืคึผืจืึธืคื™ืœ ืงืขืŸ ืึธืคื˜ ื˜ื•ื™ืฉืŸ ืื•ืŸ ื•ื•ืขื˜ ื˜ื™ืคึผื™ืงืœื™ ื‘ื™ื™ึทื˜ืŸ ืคื•ืŸ ื˜ื™ืฉ ืฆื• ื˜ื™ืฉ. ื“ืขื ืžื™ื˜ืœ ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืงืขืกื™ื™ื“ืขืจ ืึทืจื‘ืขื˜ ืึท ื‘ื™ืกืœ ืคืึธืจื•ื™ืก ืื•ืŸ ืกื˜ืจื•ื™ืขืจืŸ AUTOVACUUM ืฆื• ื“ื™ ื˜ืฉืึทื ื’ื™ื ื’ ืคึผืจืึธืคื™ืœ ืคื•ืŸ ื™ืขื“ืขืจ ื˜ื™ืฉ. ืื‘ืขืจ ื“ืึธืš ืื™ื– ื“ืึธืก ื ื™ืฉื˜ ื’ืจื™ื ื’ ืฆื• ื˜ืึธืŸ.

ืืŸ ืื ื“ืขืจ ืคึผืจืึธืกื˜ ืกื™ื‘ื” ื•ื•ืึธืก AUTOVACUUM ืงืขืŸ ื ื™ืฉื˜ ื”ืึทืœื˜ืŸ ื–ื™ืš ืžื™ื˜ ื˜ื™ืฉืŸ ืื™ื– ื•ื•ื™ื™ึทืœ ืขืก ื–ืขื ืขืŸ ืœืึทื ื’-ืœื•ื™ืคืŸ ื˜ืจืึทื ื–ืึทืงืฉืึทื ื– ื•ื•ืึธืก ืคืึทืจืžื™ื™ื“ืŸ ืขืก ืคื•ืŸ ืจื™ื™ื ื™ืงื•ื ื’ ื“ื™ ื“ืึทื˜ืŸ ื•ื•ืึธืก ื–ืขื ืขืŸ ื‘ืืจืขื›ื˜ื™ื’ื˜ ืคึฟืึทืจ ื“ื™ ื˜ืจืึทื ื–ืึทืงืฉืึทื ื–. ื“ื™ ืจืขืงืึธืžืขื ื“ืึทืฆื™ืข ื“ืึธ ืื™ื– ืื•ื™ืš ืงืœืึธืจ ื•ื•ื™ ื“ืขืจ ื˜ืึธื’ - ื‘ืึทืงื•ืžืขืŸ ื‘ืึทืคืจื™ื™ึทืขืŸ ืคื•ืŸ "ื“ืึทื ื’ื’ื™ื ื’" ื˜ืจืึทื ื–ืึทืงืฉืึทื ื– ืื•ืŸ ืžื™ื ืึทืžื™ื™ื– ื“ื™ ืฆื™ื™ื˜ ืคื•ืŸ ืึทืงื˜ื™ื•ื• ื˜ืจืึทื ื–ืึทืงืฉืึทื ื–. ืึธื‘ืขืจ ืื•ื™ื‘ ื“ื™ ืžืึทืกืข ืื•ื™ืฃ ื“ื™ื™ืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืื™ื– ืึท ื›ื™ื™ื‘ืจื™ื“ ืคื•ืŸ OLAP ืื•ืŸ OLTP, ืื™ืจ ืงืขื ืขืŸ ืกื™ื™ืžืึทืœื˜ื™ื™ื ื™ืึทืกืœื™ ื”ืึธื‘ืŸ ืคื™ืœืข ืึธืคื˜ ื“ืขืจื”ื™ื™ึทื ื˜ื™ืงื•ื ื’ืขืŸ ืื•ืŸ ืงื•ืจืฅ ืคึฟืจืื’ืŸ, ื•ื•ื™ ื’ืขื–ื•ื ื˜ ื•ื•ื™ ืœืึทื ื’-ื˜ืขืจืžื™ืŸ ืึทืคึผืขืจื™ื™ืฉืึทื ื– - ืœืžืฉืœ, ื‘ื•ื™ืขืŸ ืึท ื‘ืึทืจื™ื›ื˜. ืื™ืŸ ืึทื–ืึท ืึท ืกื™ื˜ื•ืึทืฆื™ืข, ืขืก ืื™ื– ื•ื•ืขืจื˜ ืฆื• ื˜ืจืึทื›ื˜ืŸ ื•ื•ืขื’ืŸ ืคืึทืจืฉืคึผืจื™ื™ื˜ืŸ ื“ื™ ืžืึทืกืข ืื•ื™ืฃ ืคืึทืจืฉื™ื“ืขื ืข ื‘ืึทืกืขืก, ื•ื•ืึธืก ื•ื•ืขื˜ ืœืึธื–ืŸ ืžืขืจ ืคื™ื™ืŸ-ื˜ื•ื ื™ื ื’ ืคื•ืŸ ื™ืขื“ืขืจ ืคื•ืŸ ื–ื™ื™.

ืืŸ ืื ื“ืขืจ ื‘ื™ื™ืฉืคึผื™ืœ - ืืคื™ืœื• ืื•ื™ื‘ ื“ืขืจ ืคึผืจืึธืคื™ืœ ืื™ื– ื›ืึธื•ืžืึทื“ื–ืฉื™ื ื™ืึทืก, ืึธื‘ืขืจ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก ืื™ื– ืื•ื ื˜ืขืจ ืึท ื–ื™ื™ืขืจ ื”ื•ื™ืš ืžืึทืกืข, ืืคื™ืœื• ื“ื™ ืžืขืจืกื˜ ืึทื’ืจืขืกื™ื•ื• AUTOVACUUM ืงืขืŸ ื ื™ืฉื˜ ืงืึธืคึผืข, ืื•ืŸ ืึท ื‘ืœืึธื•ื˜ื™ื ื’ ื•ื•ืขื˜ ืคึผืึทืกื™ืจืŸ. ืกืงื™ื™ืœื™ื ื’ (ื•ื•ืขืจื˜ื™ืงืึทืœ ืึธื“ืขืจ ื”ืึธืจื™ื–ืึธื ื˜ืึทืœ) ืื™ื– ื“ื™ ื‘ืœื•ื™ื– ืœื™ื™ื–ื•ื ื’.

ื•ื•ืึธืก ืฆื• ื˜ืึธืŸ ืื™ืŸ ืึท ืกื™ื˜ื•ืึทืฆื™ืข ื•ื•ืขืŸ ืื™ืจ ื”ืึธื˜ ื‘ืึทืฉื˜ืขื˜ื™ืงื˜ AUTOVACUUM, ืึธื‘ืขืจ ื“ื™ ื‘ืœืึธื•ื˜ื™ื ื’ ื”ืืœื˜ ืฆื• ื•ื•ืึทืงืกืŸ.

ืงืึธืœืขืงื˜ื™ื•ื• ื•ื•ืึทืงื•ื•ื ืคื•ืœ ืจื™ื‘ื™ืœื“ื– ื“ื™ ืื™ื ื”ืึทืœื˜ ืคื•ืŸ ื˜ื™ืฉืŸ ืื•ืŸ ื™ื ื“ืขืงืกื™ื– ืื•ืŸ ืœืึธื–ืŸ ื‘ืœื•ื™ื– ื‘ืึทื˜ื™ื™ึทื˜ื™ืง ื“ืึทื˜ืŸ ืื™ืŸ ื–ื™ื™. ืฆื• ืขืœื™ืžื™ื ื™ืจืŸ ื‘ืœืึธื•ื˜ื™ื ื’, ืขืก ืึทืจื‘ืขื˜ ื‘ื™ืฉืœื™ื™ืžืขืก, ืึธื‘ืขืจ ื‘ืขืฉืึทืก ื–ื™ื™ึทืŸ ื“ื•ืจื›ืคื™ืจื•ื ื’ ืึท ื•ื™ืกืฉืœื™ืกื™ืง ืฉืœืึธืก ืื•ื™ืฃ ื“ื™ ื˜ื™ืฉ ืื™ื– ืงืึทืคึผื˜ืฉืขืจื“ (ืึทืงืกืขืกืขืงืกืงืœื•ืกื™ื•ื•ืขืœืึทืง), ื•ื•ืึธืก ื•ื•ืขื˜ ื ื™ืฉื˜ ืœืึธื–ืŸ ืขืงืกืึทืงื™ื•ื˜ื™ื ื’ ืงื•ื•ื™ืจื™ื– ืื•ื™ืฃ ื“ืขื ื˜ื™ืฉ, ืืคื™ืœื• ืกืึทืœืขืงืฅ. ืื•ื™ื‘ ืื™ืจ ืงืขื ืขืŸ ืคืึทืจื’ื™ื ืขื  ื–ื™ืš ืฆื• ื”ืึทืœื˜ืŸ ื“ื™ื™ืŸ ื“ื™ื ืกื˜ ืึธื“ืขืจ ื˜ื™ื™ืœ ืคื•ืŸ ืขืก ืคึฟืึทืจ ืขื˜ืœืขื›ืข ืžืึธืœ (ืคื•ืŸ ื˜ืขื ืก ืคื•ืŸ ืžื™ื ื•ื˜ ืฆื• ืขื˜ืœืขื›ืข ืฉืขื” ื“ื™ืคึผืขื ื“ื™ื ื’ ืื•ื™ืฃ ื“ื™ ื’ืจื™ื™ืก ืคื•ืŸ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก ืื•ืŸ ื“ื™ื™ืŸ ื™ื™ึทื–ื ื•ื•ืึทืจื’), ื“ืขืจ ืึธืคึผืฆื™ืข ืื™ื– ื“ืขืจ ื‘ืขืกื˜ืขืจ. ืฆื•ื ื‘ืึทื“ื•ื™ืขืจืŸ, ืžื™ืจ ื˜ืึธืŸ ื ื™ื˜ ื”ืึธื‘ืŸ ืฆื™ื™ื˜ ืฆื• ืœื•ื™ืคืŸ ื•ื•ืึทืงื•ื•ื ืคื•ืœ ื‘ืขืฉืึทืก ื“ื™ ืกืงืขื“ื–ืฉื•ืœื“ ื•ื™ืฉืึทืœื˜, ืึทื–ื•ื™ ื“ืขื ืื•ืคึฟืŸ ืื™ื– ื ื™ืฉื˜ ืคึผืึทืกื™ืง ืคึฟืึทืจ ืื•ื ื“ื–.

ืงืึธืœืขืงื˜ื™ื•ื• ืงื ื•ื™ืœ ืจื™ื‘ื™ืœื“ื– ื“ื™ ืื™ื ื”ืึทืœื˜ ืคื•ืŸ ื˜ื™ืฉืŸ ืื™ืŸ ื“ื™ ื–ืขืœื‘ืข ื•ื•ืขื’ ื•ื•ื™ VACUUM FULL, ืึธื‘ืขืจ ืึทืœืึทื•ื– ืื™ืจ ืฆื• ืกืคึผืขืฆื™ืคื™ืฆื™ืจืŸ ืึทืŸ ืื™ื ื“ืขืงืก ืœื•ื™ื˜ ื•ื•ืึธืก ื“ื™ ื“ืึทื˜ืŸ ื•ื•ืขื˜ ื–ื™ื™ืŸ ืคื™ื–ื™ืงืœื™ ืึธืจื“ืขืจื“ ืื•ื™ืฃ ื“ื™ืกืง (ืึธื‘ืขืจ ืื™ืŸ ื“ืขืจ ืฆื•ืงื•ื ืคึฟื˜, ื“ื™ ืกื“ืจ ืื™ื– ื ื™ืฉื˜ ื’ืขืจืึทื ื˜ื™ื“ ืคึฟืึทืจ ื ื™ื™ึทืข ืจืึธื•ื–). ืื™ืŸ ื–ื™ื›ืขืจ ืกื™ื˜ื•ืึทื˜ื™ืึธื ืก, ื“ืึธืก ืื™ื– ืึท ื’ื•ื˜ ืึทืคึผื˜ืึทืžืึทื–ื™ื™ืฉืึทืŸ ืคึฟืึทืจ ืึท ื ื•ืžืขืจ ืคื•ืŸ ืคึฟืจืื’ืŸ - ืžื™ื˜ ืœื™ื™ืขื ืขืŸ ืงื™ื™ืคืœ ืจืขืงืึธืจื“ืก ืœื•ื™ื˜ ืื™ื ื“ืขืงืก. ื“ื™ ื›ื™ืกืึธืจืŸ ืคื•ืŸ ื“ื™ ื‘ืึทืคึฟืขืœ ืื™ื– ื“ื™ ื–ืขืœื‘ืข ื•ื•ื™ ื“ื™ ื•ื•ืึทืงื•ื•ื ืคื•ืœ - ืขืก ืœืึทืงืก ื“ื™ ื˜ื™ืฉ ื‘ืขืฉืึทืก ืึธืคึผืขืจืึทืฆื™ืข.

ืงืึธืœืขืงื˜ื™ื•ื• REINDEX ืขื ืœืขืš ืฆื• ื“ื™ ืคืจื™ืขืจื“ื™ืงืข ืฆื•ื•ื™ื™, ืึธื‘ืขืจ ืจื™ื‘ื™ืœื“ื– ืึท ืกืคึผืขืฆื™ืคื™ืฉ ืื™ื ื“ืขืงืก ืึธื“ืขืจ ืึทืœืข ื™ื ื“ืขืงืกื™ื– ืคื•ืŸ ื“ื™ ื˜ื™ืฉ. ืœืึทืงืก ื–ืขื ืขืŸ ืึท ื‘ื™ืกืœ ืฉื•ื•ืึทืš: ืฉืึทืจืขืœืึธืงืง ืื•ื™ืฃ ื“ื™ ื˜ื™ืฉ (ืคึผืจื™ื•ื•ืขื ืฅ ืžืึธื“ื™ืคื™ืงืึทื˜ื™ืึธื ืก, ืึธื‘ืขืจ ืึทืœืึทื•ื– ืื•ื™ืกืงืœื™ื™ึทื‘ืŸ) ืื•ืŸ 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). ืึทืœืข ื˜ืขืกืฅ ื–ืขื ืขืŸ positive.

ืžื™ืจ ื’ืขื’ืื ื’ืขืŸ ืฆื• ื“ื™ ืขืกื ื•ื•ืึทืจื’ ืงืจืึธื - ืื•ืŸ ื“ืขืžืึธืœื˜ ืึทืœืฅ ืื™ื– ื ื™ืฉื˜ ื’ืขื’ืื ื’ืขืŸ ื•ื•ื™ ืžื™ืจ ื“ืขืจื•ื•ืึทืจื˜.

ืขืจืฉื˜ืขืจ ืคึผืึทื ืงื™ื™ืง ืื•ื™ืฃ ืคืึทืจืงื•ื™ืฃ

ืื•ื™ืฃ ื“ืขืจ ืขืจืฉื˜ืขืจ ืงื ื•ื™ืœ ืžื™ืจ ื‘ืืงื•ืžืขืŸ ืึท ื˜ืขื•ืช ื•ื•ืขื’ืŸ ืึท ื”ื™ืœืขืœ ืคื•ืŸ ืึท ื™ื™ื ืฆื™ืง ืงืึทื ืกื˜ืจื™ื™ื ืฅ:

$ ./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 ื‘ืึทืคึฟืขืœ ืื™ื– ืขืงืกืึทืงื™ื•ื˜ืึทื“.

ืื–ื•ื™, ื“ื™ ืขืกืึทื ืก ืคื•ืŸ ื“ื™ ืคึผืจืึธื‘ืœืขื ืœื™ื’ื˜ ืื™ืŸ ื“ื™ "ืคืึทืจื”ืึทืœื˜ืŸ" ืคื•ืŸ ื“ื™ ื˜ืฉืขืง: ืื™ืŸ ื“ืขืจ ืึธืจื™ื’ื™ื ืขืœ ื˜ื™ืฉ ืขืก ืึทืงืขืจื– ืื™ืŸ ื“ืขืจ ืฆื™ื™ื˜ ืคื•ืŸ ื™ื‘ืขืจื’ืขื‘ืŸ, ืื•ืŸ ืื™ืŸ ื“ื™ ื ื™ื™ึทืข ื˜ื™ืฉ ืื™ืŸ ื“ืขืจ ืฆื™ื™ื˜ ื•ื•ืขืŸ ื“ื™ sql ื‘ืึทืคึฟืขืœ ืื™ื– ืขืงืกืึทืงื™ื•ื˜ืึทื“. ื“ืขื ืžื™ื˜ืœ ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืžืึทื›ืŸ ื–ื™ื›ืขืจ ืึทื– ื“ื™ ื˜ืฉืขืงืก ื–ืขื ืขืŸ ื“ื•ืจื›ื’ืขืงืึธื›ื˜ ื“ื™ ื–ืขืœื‘ืข ืื™ืŸ ื‘ื™ื™ื“ืข ืงืึทืกืขืก: ืึธื“ืขืจ ืฉื˜ืขื ื“ื™ืง ื“ื™ืœื™ื™ื“ ืึธื“ืขืจ ืฉื˜ืขื ื“ื™ืง ืžื™ื“.

ืึทื–ื•ื™ ื•ื•ืึธืก ื’ืขื“ืื ืงืขืŸ ื”ืึธื‘ืŸ ืžื™ืจ ื”ืึธื‘ืŸ?

ืฉืึทืคึฟืŸ ืึทืŸ ืื™ื ื“ืขืงืก ืขื ืœืขืš ืฆื• ื“ื™ืคืขืจื“

ื“ืขืจ ืขืจืฉื˜ืขืจ ื’ืขื“ืึทื ืง ืื™ื– ืฆื• ื“ื•ืจื›ืคื™ืจืŸ ื‘ื™ื™ื“ืข ื˜ืฉืขืงืก ืื™ืŸ ื‘ืึทืœื“ื™ืง ืžืึธื“ืข. ื“ืึธืก ืงืขืŸ ื“ื–ืฉืขื ืขืจื™ื™ื˜ ืขื˜ืœืขื›ืข ืคืึทืœืฉ positive ืจื™ืกื˜ืจื™ืงืฉืึทื ื–, ืึธื‘ืขืจ ืื•ื™ื‘ ืขืก ื–ืขื ืขืŸ ื•ื•ื™ื™ื ื™ืง ืคื•ืŸ ื–ื™ื™, ื“ืึธืก ื–ืึธืœ ื ื™ืฉื˜ ื•ื•ื™ืจืงืŸ ื“ื™ ืึทืจื‘ืขื˜ ืคื•ืŸ ื ื™ืฆืขืจืก, ื•ื•ื™ื™ึทืœ ืึทื–ืึท ืงืึธื ืคืœื™ืงื˜ ืื™ื– ืึท ื ืึธืจืžืึทืœ ืกื™ื˜ื•ืึทืฆื™ืข ืคึฟืึทืจ ื–ื™ื™. ื–ื™ื™ ืคืึทืœืŸ, ืœืžืฉืœ, ื•ื•ืขืŸ ืฆื•ื•ื™ื™ ื™ื•ื–ืขืจื– ืึธื ื”ื™ื™ื‘ืŸ ืฆื• ืจืขื“ืึทื’ื™ืจืŸ ื“ื™ ื–ืขืœื‘ืข ื•ื•ื™ื“ื–ืฉื™ื˜ ืื™ืŸ ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ืฆื™ื™ื˜, ืื•ืŸ ื“ืขืจ ืงืœื™ืขื ื˜ ืคื•ืŸ ื“ื™ ืฆื•ื•ื™ื™ื˜ ื‘ืึทื ื™ืฆืขืจ ื”ืื˜ ื ื™ืฉื˜ ื”ืึธื‘ืŸ ืฆื™ื™ื˜ ืฆื• ื‘ืึทืงื•ืžืขืŸ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืึทื– ื“ื™ ื•ื•ื™ื“ื–ืฉื™ื˜ ืื™ื– ืฉื•ื™ืŸ ืืคื’ืขืฉื˜ืขืœื˜ ืคึฟืึทืจ ืขื“ื™ื˜ื™ื ื’ ื“ื•ืจืš ื“ืขืจ ืขืจืฉื˜ืขืจ ื‘ืึทื ื™ืฆืขืจ. ืื™ืŸ ืึทื–ืึท ืึท ืกื™ื˜ื•ืึทืฆื™ืข, ื“ืขืจ ืกืขืจื•ื•ืขืจ ื•ื•ื™ืœ ื“ื™ ืจื’ืข ื‘ืึทื ื™ืฆืขืจ, ืื•ืŸ ื–ื™ื™ืŸ ืงืœื™ืขื ื˜ ืจืึธืœืœืก ืฆื•ืจื™ืง ื“ื™ ืขื ื“ืขืจื•ื ื’ืขืŸ ืื•ืŸ ื‘ืœืึทืงืก ื“ื™ ื•ื•ื™ื“ื–ืฉื™ื˜. ื ื‘ื™ืกืœ ืฉืคึผืขื˜ืขืจ, ื•ื•ืขืŸ ื“ืขืจ ืขืจืฉื˜ืขืจ ื‘ืึทื ื™ืฆืขืจ ืงืึทืžืคึผืœื™ืฅ ืขื“ื™ื˜ื™ื ื’, ื“ืขืจ ืฆื•ื•ื™ื™ื˜ืขืจ ื•ื•ืขื˜ ื‘ืึทืงื•ืžืขืŸ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืึทื– ื“ื™ ื•ื•ื™ื“ื–ืฉื™ื˜ ืื™ื– ื ื™ื˜ ืžืขืจ ืืคื’ืขืฉื˜ืขืœื˜ ืื•ืŸ ืงืขื ืขืŸ ืื™ื‘ืขืจื—ื–ืจืŸ ื–ื™ื™ืขืจ ืงืึทืžืฃ.

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 ื’ืขืืจื‘ืขื˜ ืคึผื•ื ืงื˜ ืึทื–ื•ื™). ืื‘ืขืจ ืขืก ืื™ื– ืึท ืคึผืจืึธื‘ืœืขื - ืžื™ืจ ื–ืขื ืขืŸ ืฉืืคืŸ ืึท ืœืึทื ื’-ืœื•ื™ืคืŸ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ, ืื•ืŸ ื“ืึธืก, ื•ื•ื™ ืคืจื™ืขืจ ื’ืขื–ืื’ื˜, ืื™ื– ืึท ืกืึทืงืึธื ืข ืฆื• ื“ื™ ื™ืžืขืจื“ื–ืฉืึทื ืก ืคื•ืŸ ืึท ื ื™ื™ึท ื‘ืœืึธืึทื˜.

ื“ื™ ืจื’ืข ืœื™ื™ื–ื•ื ื’ ืื™ื– ืžืขืจ ืงืึธืžืคึผืœื™ืฆื™ืจื˜, ืึธื‘ืขืจ ืžื™ืกื˜ืึธืžืข ืžืขืจ ืจื™ื›ื˜ื™ืง: ืฉืึทืคึฟืŸ ืึท ื–ื™ื™ึทืœ ืื™ืŸ ื“ื™ ืงืœืึธืฅ ื˜ื™ืฉ ืžื™ื˜ ื“ื™ ื™ื™ื“ืขื ืึทืคื™ื™ื“ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ื•ื•ืึธืก ืฆื•ื’ืขื’ืขื‘ืŸ ื“ืึทื˜ืŸ ืฆื• ื“ื™ ื˜ื™ืฉ. ื“ืขืจื ืึธืš, ื•ื•ืขืŸ ืžื™ืจ ื ืึธื›ืžืึทื›ืŸ ื“ืึทื˜ืŸ, ืžื™ืจ ืงืขื ืขืŸ ื’ืจื•ืคึผืข ืขืก ื“ื•ืจืš ื“ืขื ืึทื˜ืจื™ื‘ื™ื•ื˜ ืื•ืŸ ืขื ืฉื•ืจ ืึทื– ืคึฟืึทืจื‘ื•ื ื“ืขื ืข ืขื ื“ืขืจื•ื ื’ืขืŸ ื–ืขื ืขืŸ ื˜ืจืึทื ืกืคืขืจื“ ืฆื•ื–ืึทืžืขืŸ. ื“ืขืจ ืคึผืขืงืœ ื•ื•ืขื˜ ื–ื™ื™ืŸ ื’ืขืฉืืคืŸ ืคื•ืŸ ืขื˜ืœืขื›ืข ื˜ืจืึทื ื–ืึทืงืฉืึทื ื– (ืึธื“ืขืจ ืื™ื™ืŸ ื’ืจื•ื™ืก ืื™ื™ื ืขืจ) ืื•ืŸ ื–ื™ื™ึทืŸ ื’ืจื™ื™ืก ื•ื•ืขื˜ ื‘ื™ื™ึทื˜ืŸ ื“ื™ืคึผืขื ื“ื™ื ื’ ืื•ื™ืฃ ื•ื•ื™ ืคื™ืœ ื“ืึทื˜ืŸ ืื™ื– ื˜ืฉื™ื™ื ื“ื–ืฉื“ ืื™ืŸ ื“ื™ ื˜ืจืึทื ื–ืึทืงืฉืึทื ื–. ืขืก ืื™ื– ื•ื•ื™ื›ื˜ื™ืง ืฆื• ื˜ืึธืŸ ืึทื– ื–ื™ื ื˜ ื“ืึทื˜ืŸ ืคื•ืŸ ืคืึทืจืฉื™ื“ืขื ืข ื˜ืจืึทื ื–ืึทืงืฉืึทื ื– ืึทืจื™ื™ึทืŸ ื“ื™ ืงืœืึธืฅ ื˜ื™ืฉ ืื™ืŸ ืึท ื˜ืจืึทืค - ืกื“ืจ, ืขืก ื•ื•ืขื˜ ื ื™ื˜ ืžืขืจ ื–ื™ื™ืŸ ืžืขื’ืœืขืš ืฆื• ืœื™ื™ืขื ืขืŸ ืขืก ืกืึทืงื•ื•ืขื ื˜ืฉืึทืœื™, ื•ื•ื™ ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ ืคืจื™ืขืจ. ืกืขืงืกืงืึทืŸ ืคึฟืึทืจ ื™ืขื“ืขืจ ื‘ืงืฉื” ืžื™ื˜ ืคึฟื™ืœื˜ืจื™ืจื•ื ื’ ื“ื•ืจืš tx_id ืื™ื– ืฆื• ื˜ื™ื™ึทืขืจ, ืึทืŸ ืื™ื ื“ืขืงืก ืื™ื– ื“ืืจืฃ, ืึธื‘ืขืจ ืขืก ื•ื•ืขื˜ ืื•ื™ืš ืคึผืึทืžืขืœืขืš ืึทืจืึธืคึผ ื“ืขื ืื•ืคึฟืŸ ืจืขื›ื˜ ืฆื• ื“ืขืจ ืึธื•ื•ื•ืขืจื›ืขื“ ืคื•ืŸ ืึทืคึผื“ื™ื™ื˜ื™ื ื’ ืขืก. ืื™ืŸ ืึทืœื’ืขืžื™ื™ืŸ, ื•ื•ื™ ืฉื˜ืขื ื“ื™ืง, ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืงืจื‘ืŸ ืขืคึผืขืก.

ืึทื–ื•ื™, ืžื™ืจ ื‘ืึทืฉืœืึธืกืŸ ืฆื• ืึธื ื”ื™ื™ื‘ืŸ ืžื™ื˜ ื“ืขืจ ืขืจืฉื˜ืขืจ ืึธืคึผืฆื™ืข, ื•ื•ื™ื™ึทืœ ืขืก ืื™ื– ืกื™ืžืคึผืœืขืจ. ืขืจืฉื˜ืขืจ, ืขืก ืื™ื– ื ื™ื™ื˜ื™ืง ืฆื• ืคึฟืึทืจืฉื˜ื™ื™ืŸ ืฆื™ ืึท ืœืึทื ื’ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ื•ื•ืึธืœื˜ ื–ื™ื™ืŸ ืึท ืคืึทืงื˜ื™ืฉ ืคึผืจืึธื‘ืœืขื. ื–ื™ื ื˜ ื“ื™ ื”ื•ื™ืคึผื˜ ืึทืจื™ื‘ืขืจืคื™ืจืŸ ืคื•ืŸ ื“ืึทื˜ืŸ ืคื•ืŸ ื“ื™ ืึทืœื˜ ื˜ื™ืฉ ืฆื• ื“ื™ ื ื™ื™ึทืข ืื™ื– ืื•ื™ืš ืึทืงืขืจื– ืื™ืŸ ืึท ืœืึทื ื’ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ, ื“ื™ ืงืฉื™ื ืื™ื– ืคืืจื•ื•ืื ื“ืœืขืŸ ืื™ืŸ "ื•ื•ื™ ืคื™ืœ ื•ื•ืขื˜ ืžื™ืจ ืคืึทืจื’ืจืขืกืขืจืŸ ื“ืขื ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ?" ื“ืขืจ ื’ืขื“ื•ื™ืขืจ ืคื•ืŸ ื“ืขืจ ืขืจืฉื˜ืขืจ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ื“ืขืคึผืขื ื“ืก ื“ืขืจ ื”ื•ื™ืคึผื˜ ืื•ื™ืฃ ื“ื™ ื’ืจื™ื™ืก ืคื•ืŸ ื“ืขื ื˜ื™ืฉ. ื“ืขืจ ื’ืขื“ื•ื™ืขืจ ืคื•ืŸ ืึท ื ื™ื™ึท ืื™ื™ื ืขืจ ื“ืขืคึผืขื ื“ืก ืื•ื™ืฃ ื•ื•ื™ ืคื™ืœืข ืขื ื“ืขืจื•ื ื’ืขืŸ ืึทืงื™ื•ืžื™ืึทืœื™ื™ื˜ ืื™ืŸ ื“ื™ ื˜ื™ืฉ ื‘ืขืฉืึทืก ื“ื™ ื“ืึทื˜ืŸ ืึทืจื™ื‘ืขืจืคื™ืจืŸ, ื™.ืข. ืื•ื™ืฃ ื“ื™ ื™ื ื˜ืขื ืกื™ื˜ื™ ืคื•ืŸ ื“ื™ ืžืึทืกืข. ื“ื™ ืคึผื’_ืจืขืคึผืึทืงืง ืœื•ื™ืคืŸ ืื™ื– ืคืืจื’ืขืงื•ืžืขืŸ ืื™ืŸ ืึท ืฆื™ื™ื˜ ืคื•ืŸ ืžื™ื ื™ืžืึทืœ ืกืขืจื•ื•ื™ืก ืžืึทืกืข, ืื•ืŸ ื“ื™ ื‘ืึทื ื“ ืคื•ืŸ ืขื ื“ืขืจื•ื ื’ืขืŸ ืื™ื– ื’ืขื•ื•ืขืŸ ื“ื™ืกืคึผืจืึทืคึผืึธืจืฉืึทื ืึทื˜ืœื™ ืงืœื™ื™ืŸ ืงืึทืžืคึผืขืจื“ ืฆื• ื“ื™ ืึธืจื™ื’ื™ื ืขืœ ื’ืจื™ื™ืก ืคื•ืŸ ื“ืขื ื˜ื™ืฉ. ืžื™ืจ ื‘ืึทืฉืœืึธืกืŸ ืึทื– ืžื™ืจ ืงืขื ืขืŸ ืคืึทืจืœืึธื–ืŸ ื“ื™ ืฆื™ื™ื˜ ืคื•ืŸ ืึท ื ื™ื™ึทืข ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ (ืคึฟืึทืจ ืคืึทืจื’ืœื™ื™ึทืš, ืขืก ืื™ื– ื“ื•ืจื›ืฉื ื™ื˜ืœืขืš 1 ืฉืขื” ืื•ืŸ 2-3 ืžื™ื ื•ื˜).

ื“ื™ ื™ืงืกืคึผืขืจืึทืžืึทื ืฅ ื–ืขื ืขืŸ positive. ืงืึทื˜ืขืจ ืื•ื™ืฃ ืคึผืจืึธื“ื•ืงืฆื™ืข ืื•ื™ืš. ืคึฟืึทืจ ืงืœืขืจื™ื˜ื™, ื“ืึธ ืื™ื– ืึท ื‘ื™ืœื“ ืžื™ื˜ ื“ื™ ื’ืจื™ื™ืก ืคื•ืŸ ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืกื™ื– ื ืึธืš ืคืœื™ืกื ื“ื™ืง:

Postgres: bloat, pg_repack ืื•ืŸ ื“ื™ืคืขืจื“ ืงืึทื ืกื˜ืจื™ื™ื ืฅ

ื–ื™ื ื˜ ืžื™ืจ ื–ืขื ืขืŸ ื’ืึธืจ ืฆื•ืคึฟืจื™ื“ืŸ ืžื™ื˜ ื“ืขื ืœื™ื™ื–ื•ื ื’, ืžื™ืจ ื”ืึธื‘ืŸ ื ื™ืฉื˜ ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ื™ื ืกื˜ืจื•ืžืขื ื˜ ื“ื™ ืจื’ืข, ืึธื‘ืขืจ ืžื™ืจ ื‘ืึทื˜ืจืึทื›ื˜ืŸ ื“ื™ ืžืขื’ืœืขื›ืงื™ื™ื˜ ืฆื• ื“ื™ืกืงื•ื˜ื™ืจืŸ ืขืก ืžื™ื˜ ื“ื™ ืคืึทืจืœืขื ื’ืขืจื•ื ื’ ื“ืขื•ื•ืขืœืึธืคึผืขืจืก. ืื•ื ื“ื–ืขืจ ืงืจืึทื ื˜ ืจืขื•ื•ื™ื–ื™ืข, ืœื™ื™ื“ืขืจ, ืื™ื– ื ืึธืš ื ื™ืฉื˜ ื’ืจื™ื™ื˜ ืคึฟืึทืจ ืืจื•ื™ืกื’ืขื‘ืŸ, ื•ื•ื™ื™ึทืœ ืžื™ืจ ื‘ืœื•ื™ื– ืกืึทืœื•ื•ื“ ื“ืขื ืคึผืจืึธื‘ืœืขื ืžื™ื˜ ื™ื™ื ืฆื™ืง ื“ื™ืคืขืจื“ ืจื™ืกื˜ืจื™ืงืฉืึทื ื–, ืื•ืŸ ืคึฟืึทืจ ืึท ืคื•ืœ-ืคืœืขื“ื–ืฉื“ ืœืึทื˜ืข ืขืก ืื™ื– ื ื™ื™ื˜ื™ืง ืฆื• ืฆื•ืฉื˜ืขืœืŸ ืฉื˜ื™ืฆืŸ ืคึฟืึทืจ ืื ื“ืขืจืข ื˜ื™ื™ืคึผืก. ืžื™ืจ ื”ืึธืคืŸ ืฆื• ืงืขื ืขืŸ ืฆื• ื˜ืึธืŸ ื“ืึธืก ืื™ืŸ ื“ืขืจ ืฆื•ืงื•ื ืคึฟื˜.

ื˜ืึธืžืขืจ ืื™ืจ ื”ืึธื˜ ืึท ืงืฉื™ื, ื•ื•ืึธืก ื”ืึธื‘ืŸ ืžื™ืจ ืืคื™ืœื• ื‘ืึทืงื•ืžืขืŸ ื™ื ื•ื•ืึทืœื•ื•ื“ ืื™ืŸ ื“ืขื ื’ืขืฉื™ื›ื˜ืข ืžื™ื˜ ื“ื™ ืžืึธื“ื™ืคื™ืงืึทื˜ื™ืึธืŸ ืคื•ืŸ pg_repack, ืื•ืŸ ื˜ืึธืŸ ื ื™ื˜, ืœืžืฉืœ, ื ื•ืฆืŸ ื–ื™ื™ึทืŸ ืึทื ืึทืœืึธื’ื•ืขืก? ืื™ืŸ ืขื˜ืœืขื›ืข ืคื•ื ื˜ ืžื™ืจ ืื•ื™ืš ื’ืขื“ืึทื ืง ื•ื•ืขื’ืŸ ื“ืขื, ืึธื‘ืขืจ ื“ื™ positive ื“ืขืจืคืึทืจื•ื ื’ ืคื•ืŸ ื ื™ืฆืŸ ืขืก ืคืจื™ืขืจ, ืื•ื™ืฃ ื˜ื™ืฉืŸ ืึธืŸ ื“ื™ืคืขืจื“ ืงืึทื ืกื˜ืจื™ื™ื ืฅ, ืžืึธื•ื˜ืึทื•ื•ื™ื™ื˜ืึทื“ ืื•ื ื“ื– ืฆื• ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ืคึฟืึทืจืฉื˜ื™ื™ืŸ ื“ื™ ืขืกืึทื ืก ืคื•ืŸ ื“ืขื ืคึผืจืึธื‘ืœืขื ืื•ืŸ ืคืึทืจืจื™ื›ื˜ืŸ ืขืก. ืื™ืŸ ืึทื“ื™ืฉืึทืŸ, ื“ื™ ื ื•ืฆืŸ ืคื•ืŸ ืื ื“ืขืจืข ืกืึทืœื•ืฉืึทื ื– ืจื™ืงื•ื•ื™ื™ืขืจื– ืฆื™ื™ื˜ ืฆื• ื“ื•ืจื›ืคื™ืจืŸ ื˜ืขืกืฅ, ืึทื–ื•ื™ ืžื™ืจ ื‘ืึทืฉืœืึธืกืŸ ืึทื– ืžื™ืจ ื•ื•ืขืœืŸ ืขืจืฉื˜ืขืจ ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ืคืึทืจืจื™ื›ื˜ืŸ ื“ืขื ืคึผืจืึธื‘ืœืขื ืื™ืŸ ืขืก, ืื•ืŸ ืื•ื™ื‘ ืžื™ืจ ืื™ื™ื ื’ืขื–ืขืŸ ืึทื– ืžื™ืจ ืงืขื ืขืŸ ื ื™ืฉื˜ ื˜ืึธืŸ ื“ืึธืก ืื™ืŸ ืึท ื’ืœื™ื™ึทืš ืฆื™ื™ื˜, ืžื™ืจ ื•ื•ืขืœืŸ ืึธื ื”ื™ื™ื‘ืŸ ืงื•ืงืŸ ืื™ืŸ ืึทื ืึทืœืึธื’ื•ืขืก. .

ืคื™ื™ื ื“ื™ื ื’ื–

ื•ื•ืึธืก ืžื™ืจ ืงืขื ืขืŸ ืจืขืงืึธืžืขื ื“ื™ืจืŸ ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ืื•ื ื“ื–ืขืจ ืื™ื™ื’ืขื ืข ื“ืขืจืคืึทืจื•ื ื’:

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

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

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’