Postgres: bloat, pg_repack เปเบฅเบฐเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบ—เบตเปˆเป€เบฅเบทเปˆเบญเบ™เป€เบงเบฅเบฒ

Postgres: bloat, pg_repack เปเบฅเบฐเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบ—เบตเปˆเป€เบฅเบทเปˆเบญเบ™เป€เบงเบฅเบฒ

เบœเบปเบ™เบเบฐเบ—เบปเบšเบ‚เบญเบ‡ bloat เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปเบฅเบฐเบ”เบฑเบ”เบชเบฐเบ™เบตเปเบกเปˆเบ™เป€เบ›เบฑเบ™เบ—เบตเปˆเบฎเบนเป‰เบˆเบฑเบเบขเปˆเบฒเบ‡เบเบงเป‰เบฒเบ‡เบ‚เบงเบฒเบ‡เปเบฅเบฐเบ›เบฐเบˆเบธเบšเบฑเบ™เบšเปเปˆเบžเบฝเบ‡เปเบ•เปˆเบขเบนเปˆเปƒเบ™ Postgres. เบกเบตเบงเบดเบ—เบตเบ—เบตเปˆเบˆเบฐเบˆเบฑเบ”เบเบฒเบ™เบเบฑเบšเบกเบฑเบ™เบญเบญเบเบˆเบฒเบเบเปˆเบญเบ‡, เป€เบŠเบฑเปˆเบ™ VACUUM FULL เบซเบผเบท CLUSTER, เปเบ•เปˆเบžเบงเบเบกเบฑเบ™เบฅเบฑเบญเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เปเบฅเบฐเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบˆเบถเปˆเบ‡เบšเปเปˆเบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบ•เบฐเบซเบผเบญเบ”เป€เบงเบฅเบฒ.

เบšเบปเบ”เบ„เบงเบฒเบกเบˆเบฐเบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบ—เบดเบ”เบชเบฐเบ”เบตเป€เบฅเบฑเบเบ™เป‰เบญเบเบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™ bloat เป€เบเบตเบ”เบ‚เบถเป‰เบ™, เบงเบดเบ—เบตเบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ•เปเปˆเบชเบนเป‰เบเบฑเบšเบกเบฑเบ™, เบเปˆเบฝเบงเบเบฑเบšเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบ—เบตเปˆเป€เบฅเบทเปˆเบญเบ™เป€เบงเบฅเบฒเปเบฅเบฐเบšเบฑเบ™เบซเบฒเบ—เบตเปˆเบžเบงเบเป€เบ‚เบปเบฒเบ™เปเบฒเป€เบญเบปเบฒเบเบฒเบ™เบ‚เบฐเบซเบเบฒเบ pg_repack.

เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบ–เบทเบเบ‚เบฝเบ™เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆ เบ„เบณเป€เบงเบปเป‰เบฒเบ‚เบญเบ‡เบ‚เป‰เบญเบ เบ—เบตเปˆ PgConf.Russia 2020.

เป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบˆเบดเปˆเบ‡เป€เบเบตเบ”เบเบฒเบ™เบญเบฑเบเป€เบชเบš?

Postgres เปเบกเปˆเบ™เบญเบตเบ‡เปƒเบชเปˆเปเบšเบšเบˆเปเบฒเบฅเบญเบ‡เบซเบผเบฒเบเบฎเบธเปˆเบ™ (MVCC). เป‚เบ”เบเป€เบ™เบทเป‰เบญเปเบ—เป‰เปเบฅเป‰เบงเบ‚เบญเบ‡เบกเบฑเบ™เปเบกเปˆเบ™เบงเปˆเบฒเปเบ•เปˆเบฅเบฐเปเบ–เบงเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบชเบฒเบกเบฒเบ”เบกเบตเบซเบผเบฒเบเบฎเบธเปˆเบ™, เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒเป€เบšเบดเปˆเบ‡เบšเปเปˆเบกเบตเบซเบผเบฒเบเบเปˆเบงเบฒเบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบฎเบธเปˆเบ™เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰, เปเบ•เปˆเบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบ›เบฑเบ™เบญเบฑเบ™เบ”เบฝเบงเบเบฑเบ™. เบ™เบตเป‰เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒเบซเบผเบฒเบเป†เบ„เบฑเป‰เบ‡เป€เบฎเบฑเบ”เบงเบฝเบเบžเป‰เบญเบกเป†เบเบฑเบ™เปเบฅเบฐเป€เบเบทเบญเบšเบšเปเปˆเบกเบตเบœเบปเบ™เบชเบฐเบ—เป‰เบญเบ™เบ•เปเปˆเบเบฑเบ™เปเบฅเบฐเบเบฑเบ™.

เปเบ™เปˆเบ™เบญเบ™, เบชเบฐเบšเบฑเบšเบ—เบฑเบ‡เบซเบกเบปเบ”เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเป„เบงเป‰. Postgres เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบซเบ™เป‰เบฒเบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเป‚เบ”เบเบซเบ™เป‰เบฒเปเบฅเบฐเบซเบ™เป‰เบฒเปเบกเปˆเบ™เบˆเปเบฒเบ™เบงเบ™เบ•เปเบฒเปˆเบชเบธเบ”เบ—เบตเปˆเบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เบˆเบฒเบเปเบœเปˆเบ™เบซเบผเบทเบ‚เบฝเบ™. เบ‚เปเปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบ™เป‰เบญเบเป†เป€เบžเบทเปˆเบญเป€เบ‚เบปเป‰เบฒเปƒเบˆเบงเปˆเบฒเบชเบดเปˆเบ‡เบ™เบตเป‰เป€เบเบตเบ”เบ‚เบทเป‰เบ™เป„เบ”เป‰เปเบ™เบงเปƒเบ”.

เปƒเบซเป‰เป€เบงเบปเป‰เบฒเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบกเบตเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เป€เบžเบตเปˆเบกเบšเบฑเบ™เบ—เบถเบเบˆเปเบฒเบ™เบงเบ™เบซเบ™เบถเปˆเบ‡. เบ‚เปเป‰เบกเบนเบ™เปƒเบซเบกเปˆเป„เบ”เป‰เบ›เบฒเบเบปเบ”เบขเบนเปˆเปƒเบ™เบซเบ™เป‰เบฒเบ—เปเบฒเบญเบดเบ”เบ‚เบญเบ‡เป„เบŸเบฅเปŒเบ—เบตเปˆเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰. เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบชเบฐเบšเบฑเบšเบชเบปเบ”เบ‚เบญเบ‡เปเบ–เบงเบ—เบตเปˆเบกเบตเปƒเบซเป‰เบเบฑเบšเบ—เบธเบฅเบฐเบเปเบฒเบญเบทเปˆเบ™เป†เบซเบผเบฑเบ‡เบˆเบฒเบเบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒ (เบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเบ‡เปˆเบฒเบเบ”เบฒเบ, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเบฅเบฐเบ”เบฑเบšเบเบฒเบ™เป‚เบ”เบ”เบ”เปˆเบฝเบงเปเบกเปˆเบ™ Read Committed).

Postgres: bloat, pg_repack เปเบฅเบฐเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบ—เบตเปˆเป€เบฅเบทเปˆเบญเบ™เป€เบงเบฅเบฒ

เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบ›เบฑเบšเบ›เบธเบ‡เบซเบ™เบถเปˆเบ‡เปƒเบ™เบฅเบฒเบเบเบฒเบ™, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบˆเบถเปˆเบ‡เป€เบฎเบฑเบ”เปƒเบซเป‰เบชเบฐเบšเบฑเบšเป€เบเบปเปˆเบฒเบšเปเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡.

Postgres: bloat, pg_repack เปเบฅเบฐเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบ—เบตเปˆเป€เบฅเบทเปˆเบญเบ™เป€เบงเบฅเบฒ

เบ‚เบฑเป‰เบ™เบ•เบญเบ™เป‚เบ”เบเบ‚เบฑเป‰เบ™เบ•เบญเบ™, เบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡เปเบฅเบฐเบเบฒเบ™เบฅเบถเบšเบชเบฐเบšเบฑเบšเปเบ–เบง, เบžเบงเบเป€เบฎเบปเบฒเบชเบดเป‰เบ™เบชเบธเบ”เบฅเบปเบ‡เบ”เป‰เบงเบเบซเบ™เป‰เบฒเบ—เบตเปˆเบกเบตเบ›เบฐเบกเบฒเบ™เป€เบ„เบดเปˆเบ‡เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เปเบกเปˆเบ™ "เบ‚เบตเป‰เป€เบซเบเบทเป‰เบญ". เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบ™เบตเป‰โ€‹เปเบกเปˆเบ™โ€‹เบšเปเปˆโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เป€เบšเบดเปˆเบ‡โ€‹เป€เบซเบฑเบ™โ€‹เบเบฒเบ™โ€‹เป€เบฎเบฑเบ”โ€‹เบ—เบธโ€‹เบฅเบฐโ€‹เบเปเบฒโ€‹เปƒเบ”โ€‹เบซเบ™เบถเปˆเบ‡โ€‹.

Postgres: bloat, pg_repack เปเบฅเบฐเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบ—เบตเปˆเป€เบฅเบทเปˆเบญเบ™เป€เบงเบฅเบฒ

Postgres เบกเบตเบเบปเบ™เป„เบ เป€เบ„เบทเปˆเบญเบ‡ เบชเบณ เบญเบฒเบ‡, เป€เบŠเบดเปˆเบ‡เป€เบฎเบฑเบ”เบ„เบงเบฒเบกเบชเบฐเบญเบฒเบ”เบชเบฐเบšเบฑเบšเบ—เบตเปˆเบฅเป‰เบฒเบชเบฐเป„เบซเบกเปเบฅเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เบžเบทเป‰เบ™เบ—เบตเปˆเบชเปเบฒเบฅเบฑเบšเบ‚เปเป‰เบกเบนเบ™เปƒเบซเบกเปˆ. เปเบ•เปˆเบ–เป‰เบฒเบกเบฑเบ™เบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบขเปˆเบฒเบ‡เปเบฎเบ‡เบžเบฝเบ‡เบžเปเบซเบผเบทเป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบญเบทเปˆเบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™ "เบ‚เปเป‰เบกเบนเบ™เบ‚เบตเป‰เป€เบซเบเบทเป‰เบญ" เบเบฑเบ‡เบ„เบปเบ‡เบขเบนเปˆ, เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เปƒเบŠเป‰เบซเบ™เป‰เบฒเป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบชเปเบฒเบฅเบฑเบšเบ‚เปเป‰เบกเบนเบ™เปƒเบซเบกเปˆ.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เปƒเบ™เบšเบฒเบ‡เป€เบงเบฅเบฒเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบˆเบฐเบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบชเบตเปˆเบซเบ™เป‰เบฒ, เปเบ•เปˆเบงเปˆเบฒเบžเบฝเบ‡เปเบ•เปˆเป€เบ„เบดเปˆเบ‡เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบกเบฑเบ™เบˆเบฐเบกเบตเบ‚เปเป‰เบกเบนเบ™เบชเบปเบ”. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เป€เบกเบทเปˆเบญเป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบญเปˆเบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบซเบผเบฒเบเบเปˆเบงเบฒเบ„เบงเบฒเบกเบˆเปเบฒเป€เบ›เบฑเบ™.

Postgres: bloat, pg_repack เปเบฅเบฐเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบ—เบตเปˆเป€เบฅเบทเปˆเบญเบ™เป€เบงเบฅเบฒ

เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบ•เบญเบ™เบ™เบตเป‰ VACUUM เบˆเบฐเบฅเบถเบšเบ—เบธเบเบฅเบธเป‰เบ™เปเบ–เบงเบ—เบตเปˆเบšเปเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบญเบญเบ, เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบˆเบฐเบšเปเปˆเบ”เบตเบ‚เบถเป‰เบ™. เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบกเบตเบžเบทเป‰เบ™เบ—เบตเปˆเบซเบงเปˆเบฒเบ‡เปƒเบ™เบซเบ™เป‰เบฒเป€เบงเบฑเบšเบ•เปˆเบฒเบ‡เป†เบซเบผเบทเปเบกเป‰เบเบฐเบ—เบฑเป‰เบ‡เบซเบ™เป‰เบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เบชเปเบฒเบฅเบฑเบšเปเบ–เบงเปƒเบซเบกเปˆ, เปเบ•เปˆเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบเบฑเบ‡เบญเปˆเบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบซเบผเบฒเบเบเบงเปˆเบฒเบ„เบงเบฒเบกเบˆเปเบฒเป€เบ›เบฑเบ™.
เป‚เบ”เบเบงเบดเบ—เบตเบ—เบฒเบ‡เบเบฒเบ™, เบ–เป‰เบฒเบซเบ™เป‰เบฒเป€เบ›เบปเปˆเบฒเบซเบกเบปเบ” (เบซเบ™เป‰เบฒเบ—เบตเบชเบญเบ‡เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ) เปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™เบ•เบญเบ™เบ—เป‰เบฒเบเบ‚เบญเบ‡เป„เบŸเบฅเปŒ, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™ VACUUM เบˆเบฐเบชเบฒเบกเบฒเบ”เบ•เบฑเบ”เบกเบฑเบ™เป„เบ”เป‰. เปเบ•เปˆเบ”เบฝเบงเบ™เบตเป‰เบ™เบฒเบ‡เบขเบนเปˆเปƒเบ™เบเบฒเบ‡, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบšเปเปˆเบกเบตเบซเบเบฑเบ‡เป€เบฎเบฑเบ”เบเบฑเบšเบ™เบฒเบ‡.

Postgres: bloat, pg_repack เปเบฅเบฐเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบ—เบตเปˆเป€เบฅเบทเปˆเบญเบ™เป€เบงเบฅเบฒ

เป€เบกเบทเปˆเบญเบˆเปเบฒเบ™เบงเบ™เบซเบ™เป‰เบฒเป€เบ›เบปเปˆเบฒเบซเบผเบท sparse เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบเบฒเบเป€เบ›เบฑเบ™เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆ, เป€เบŠเบดเปˆเบ‡เป€เบญเบตเป‰เบ™เบงเปˆเบฒ bloat, เบกเบฑเบ™เป€เบฅเบตเปˆเบกเบชเบปเปˆเบ‡เบœเบปเบ™เบเบฐเบ—เบปเบšเบ•เปเปˆเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”.

เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบ—เบตเปˆเบญเบฐเบ—เบดเบšเบฒเบเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เบ™เบตเป‰เปเบกเปˆเบ™เบเบปเบ™เป„เบเบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบเบปเบ”เบ•เบปเบงเบ‚เบญเบ‡ bloat เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡. เปƒเบ™เบ”เบฑเบ”เบŠเบฐเบ™เบตเบ™เบตเป‰เป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เบซเบผเบฒเบเบงเบดเบ—เบตเบ”เบฝเบงเบเบฑเบ™.

เบ‚เป‰เบญเบเบกเบตเบญเบฒเบเบฒเบ™เบ—เป‰เบญเบ‡เบญเบทเบ”เบšเป?

เบกเบตเบซเบผเบฒเบเบงเบดเบ—เบตเปƒเบ™เบเบฒเบ™เบเปเบฒเบ™เบปเบ”เบงเปˆเบฒเบ—เปˆเบฒเบ™เบกเบต bloat. เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ‚เบญเบ‡เบ—เปเบฒเบญเบดเบ”เปเบกเปˆเบ™เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบชเบฐเบ–เบดเบ•เบด Postgres เบžเบฒเบเปƒเบ™, เป€เบŠเบดเปˆเบ‡เบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบ‚เปเป‰เบกเบนเบ™เบ›เบฐเบกเบฒเบ™เบเปˆเบฝเบงเบเบฑเบšเบˆเปเบฒเบ™เบงเบ™เปเบ–เบงเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡, เบˆเปเบฒเบ™เบงเบ™เปเบ–เบง "เบชเบปเบ”" เปเบฅเบฐเบญเบทเปˆเบ™เป†, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบŠเบญเบเบซเบฒเบ•เบปเบงเปเบ›เบ—เบตเปˆเบเบฝเบกเบžเป‰เบญเบกเบซเบผเบฒเบเปƒเบ™เบญเบดเบ™เป€เบ•เบตเป€เบ™เบฑเบ”. เบžเบงเบเป€เบฎเบปเบฒเป€เบญเบปเบฒเป€เบ›เบฑเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™ เบชเบฐเบ„เบฃเบดเบš เบˆเบฒเบเบœเบนเป‰เบŠเปˆเบฝเบงเบŠเบฒเบ™ PostgreSQL, เป€เบŠเบดเปˆเบ‡เบชเบฒเบกเบฒเบ”เบ›เบฐเป€เบกเบตเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ bloat เบžเป‰เบญเบกเบเบฑเบš toast เปเบฅเบฐ bloat btree indexes. เปƒเบ™เบ›เบฐเบชเบปเบšเบเบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ‚เบญเบ‡เบกเบฑเบ™เปเบกเปˆเบ™ 10-20%.

เบญเบตเบเบงเบดเบ—เบตเบซเบ™เบถเปˆเบ‡เปเบกเปˆเบ™เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบเบฒเบ™เบ‚เบฐเบซเบเบฒเบ pgstattuple, เป€เบŠเบดเปˆเบ‡เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เป€เบšเบดเปˆเบ‡เบžเบฒเบเปƒเบ™เบซเบ™เป‰เบฒเป€เบงเบฑเบšเบ•เปˆเบฒเบ‡เป†เปเบฅเบฐเป„เบ”เป‰เบฎเบฑเบšเบ—เบฑเบ‡เบเบฒเบ™เบ„เบฒเบ”เบ„เบฐเป€เบ™เปเบฅเบฐเบกเบนเบ™เบ„เปˆเบฒ bloat เบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™. เปเบ•เปˆเปƒเบ™เบเปเบฅเบฐเบ™เบตเบ—เบตเบชเบญเบ‡, เบ—เปˆเบฒเบ™เบˆเบฐเบ•เป‰เบญเบ‡เบชเบฐเปเบเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”.

เบžเบงเบเป€เบฎเบปเบฒเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบกเบนเบ™เบ„เปˆเบฒ bloat เบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบ, เป€เบ–เบดเบ‡ 20%, เบเบญเบกเบฎเบฑเบšเป„เบ”เป‰. เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเป€เบ›เบฑเบ™ analogue เบ‚เบญเบ‡ fillfactor เบชเปเบฒเบฅเบฑเบš เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ ะธ เบ”เบฑเบ”เบŠเบฐเบ™เบต. เบขเบนเปˆเบ—เบตเปˆ 50% เปเบฅเบฐเบชเบนเบ‡เบเบงเปˆเบฒ, เบšเบฑเบ™เบซเบฒเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบญเบฒเบ”เบˆเบฐเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™.

เบงเบดเบ—เบตเบเบฒเบ™เบ•เปเปˆเบชเบนเป‰เบเบฑเบš bloat

Postgres เบกเบตเบซเบผเบฒเบเบงเบดเบ—เบตเบ—เบตเปˆเบˆเบฐเบˆเบฑเบ”เบเบฒเบ™เบเบฑเบš bloat เบญเบญเบเบˆเบฒเบเบเปˆเบญเบ‡, เปเบ•เปˆเบžเบงเบเบกเบฑเบ™เบšเปเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเบชเปเบฒเบฅเบฑเบšเบ—เบธเบเบ„เบปเบ™.

เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ AUTOVACUUM เป€เบžเบทเปˆเบญเบšเปเปˆเปƒเบซเป‰เป€เบเบตเบ”เบเบฒเบ™เบญเบฑเบเป€เบชเบš. เบซเบผเบทเบซเบผเบฒเบเบเบงเปˆเบฒเบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™, เป€เบžเบทเปˆเบญเบฎเบฑเบเบชเบฒเบกเบฑเบ™เบขเบนเปˆเปƒเบ™เบฅเบฐเบ”เบฑเบšเบ—เบตเปˆเบเบญเบกเบฎเบฑเบšเป„เบ”เป‰. เบ™เบตเป‰เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเป€เบ›เบฑเบ™เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ‚เบญเบ‡ "เบเบฑเบšเบ•เบฑเบ™", เปเบ•เปˆเปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡, เบกเบฑเบ™เบšเปเปˆเปเบกเปˆเบ™เป€เบฅเบทเปˆเบญเบ‡เบ‡เปˆเบฒเบเบ—เบตเปˆเบˆเบฐเบšเบฑเบ™เบฅเบธเป„เบ”เป‰. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ—เปˆเบฒเบ™เบกเบตเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบขเปˆเบฒเบ‡เบซเป‰เบฒเบงเบซเบฑเบ™เบเบฑเบšเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เปเบšเบšเบ›เบปเบเบเบฐเบ•เบดเบ‚เบญเบ‡เบฅเบฐเบšเบปเบšเบ‚เปเป‰เบกเบนเบ™, เบซเบผเบทเบšเบฒเบ‡เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เบเป‰เบฒเบเบ‚เปเป‰เบกเบนเบ™เปเบกเปˆเบ™เป€เบเบตเบ”เบ‚เบถเป‰เบ™. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เป‚เบ›เบฃเป„เบŸเบฅเปŒเบเบฒเบ™เป‚เบซเบผเบ”เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบญเบฒเบ”เบˆเบฐเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เป€เบฅเบทเป‰เบญเบเป† เปเบฅเบฐเป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›เปเบฅเป‰เบงเบˆเบฐเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เป„เบ›เปƒเบ™เปเบ•เปˆเบฅเบฐเบ•เบฒเบ•เบฐเบฅเบฒเบ‡. เบ™เบตเป‰เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเบขเปˆเบฒเบ‡เบ•เปเปˆเป€เบ™เบทเปˆเบญเบ‡เป€เบฅเบฑเบเบ™เป‰เบญเบเบ•เปเปˆเบซเบ™เป‰เบฒเปเบฅเบฐเบ›เบฑเบš AUTOVACUUM เบเบฑเบšเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ‚เบญเบ‡เปเบ•เปˆเบฅเบฐเบ•เบฒเบ•เบฐเบฅเบฒเบ‡. เปเบ•เปˆเปเบ™เปˆเบ™เบญเบ™เบ™เบตเป‰เบšเปเปˆเปเบกเปˆเบ™เป€เบฅเบทเปˆเบญเบ‡เบ‡เปˆเบฒเบเบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”.

เป€เบซเบ”เบœเบปเบ™เบ—เบปเปˆเบงเป„เบ›เบญเบตเบเบญเบฑเบ™เบซเบ™เบถเปˆเบ‡เบ—เบตเปˆ AUTOVACUUM เบšเปเปˆเบชเบฒเบกเบฒเบ”เบ•เบดเบ”เบ•เบฒเบกเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เป„เบ”เป‰เปเบกเปˆเบ™เบเป‰เบญเบ™เบงเปˆเบฒเบกเบตเบ—เบธเบฅเบฐเบเปเบฒเบ—เบตเปˆเบเบฒเบงเบ™เบฒเบ™เบ—เบตเปˆเบ›เป‰เบญเบ‡เบเบฑเบ™เบšเปเปˆเปƒเบซเป‰เบกเบฑเบ™เป€เบฎเบฑเบ”เบ„เบงเบฒเบกเบชเบฐเบญเบฒเบ”เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบกเบตเบขเบนเปˆเปƒเบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒเป€เบซเบผเบปเปˆเบฒเบ™เบฑเป‰เบ™. เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เปเบกเปˆเบ™เบเบฑเบ‡เบˆเบฐเปเบˆเป‰เบ‡ - เบเปเบฒเบˆเบฑเบ”เบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒ "dangling" เปเบฅเบฐเบซเบผเบธเบ”เบœเปˆเบญเบ™เป€เบงเบฅเบฒเบ‚เบญเบ‡เบ—เบธเบฅเบฐเบเปเบฒเบ—เบตเปˆเบกเบตเบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เป„เบซเบง. เปเบ•เปˆเบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบเบฒเบ™เป‚เบซเบผเบ”เปƒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เปเบกเปˆเบ™เบ›เบฐเบชเบปเบกเบ‚เบญเบ‡ OLAP เปเบฅเบฐ OLTP, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบžเป‰เบญเบกเบเบฑเบ™เบกเบตเบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡เป€เบฅเบทเป‰เบญเบเป†เปเบฅเบฐเบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบชเบฑเป‰เบ™, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เปƒเบ™เป„เบฅเบเบฐเบเบฒเบง - เบ•เบปเบงเบขเปˆเบฒเบ‡, เบเบฒเบ™เบชเป‰เบฒเบ‡เบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™. เปƒเบ™เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบง, เบกเบฑเบ™เป€เบ›เบฑเบ™เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเบˆเบฐเบ„เบดเบ”เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เปเบœเปˆเบเบฐเบˆเบฒเบเบเบฒเบ™เป‚เบซเบผเบ”เปƒเบ™เบ—เบปเปˆเบงเบ–เบฒเบ™เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™, เป€เบŠเบดเปˆเบ‡เบˆเบฐเบŠเปˆเบงเบเปƒเบซเป‰เบกเบตเบเบฒเบ™เบ›เบฑเบšเบ•เบปเบงเบ‚เบญเบ‡เปเบ•เปˆเบฅเบฐเบ„เบปเบ™เบซเบผเบฒเบเบ‚เบถเป‰เบ™.

เบ•เบปเบงเบขเปˆเบฒเบ‡เบญเบตเบเบ›เบฐเบเบฒเบ™เบซเบ™เบถเปˆเบ‡ - เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเป‚เบ›เบฃเป„เบŸเบฅเปŒเปเบกเปˆเบ™ homogeneous, เปเบ•เปˆเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เปเบกเปˆเบ™เบขเบนเปˆเบžเบฒเบเปƒเบ•เป‰เบเบฒเบ™เป‚เบซเบผเบ”เบชเบนเบ‡เบซเบผเบฒเบ, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒ AUTOVACUUM เบ—เบตเปˆเบฎเบธเบเบฎเบฒเบ™เบ—เบตเปˆเบชเบธเบ”เบญเบฒเบ”เบˆเบฐเบšเปเปˆเบฎเบฑเบšเบกเบทเบเบฑเบš, เปเบฅเบฐ bloat เบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™. เบเบฒเบ™โ€‹เบ›เบฑเบšโ€‹เบ‚เบฐโ€‹เบซเบ™เบฒเบ” (เบ•เบฑเป‰เบ‡โ€‹เบซเบผเบทโ€‹เปเบ™เบงโ€‹เบ™เบญเบ™โ€‹) เป€เบ›เบฑเบ™โ€‹เบเบฒเบ™โ€‹เปเบเป‰โ€‹เป„เบ‚โ€‹เบžเบฝเบ‡โ€‹เปเบ•เปˆโ€‹.

เบˆเบฐเป€เบฎเบฑเบ”เปเบ™เบงเปƒเบ”เปƒเบ™เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เป„เบ”เป‰เบชเป‰เบฒเบ‡เบ•เบฑเป‰เบ‡ AUTOVACUUM, เปเบ•เปˆ bloat เบเบฑเบ‡เบชเบทเบšเบ•เปเปˆเบ‚เบฐเบซเบเบฒเบเบ•เบปเบง.

เบ—เบตเบกเบ‡เบฒเบ™ เบชเบนเบ™เบเบฒเบเบฒเบ”เป€เบ•เบฑเบก เบเปเปˆเบชเป‰เบฒเบ‡เป€เบ™เบทเป‰เบญเปƒเบ™เบ‚เบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปเบฅเบฐเบ”เบฑเบ”เบŠเบฐเบ™เบตเปเบฅเบฐเบ›เปˆเบญเบเปƒเบซเป‰เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบขเบนเปˆเปƒเบ™เบžเบงเบเบกเบฑเบ™เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™. เป€เบžเบทเปˆเบญเบฅเบปเบšเบฅเป‰เบฒเบ‡ bloat, เบกเบฑเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบขเปˆเบฒเบ‡เบชเบปเบกเบšเบนเบ™, เปเบ•เปˆเปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบฅเบฑเบญเบเบชเบฐเป€เบžเบฒเบฐเบขเบนเปˆเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ–เบทเบเบˆเบฑเบš (AccessExclusiveLock), เป€เบŠเบดเปˆเบ‡เบˆเบฐเบšเปเปˆเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ™เบตเป‰, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเป€เบฅเบทเบญเบ. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบขเบธเบ”เป€เบŠเบปเบฒเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบซเบผเบทเบšเบฒเบ‡เบชเปˆเบงเบ™เบ‚เบญเบ‡เบกเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบšเบฒเบ‡เป€เบงเบฅเบฒ (เบˆเบฒเบเบชเบดเบšเบ™เบฒเบ—เบตเป€เบ–เบดเบ‡เบซเบผเบฒเบเบŠเบปเปˆเบงเป‚เบกเบ‡เป‚เบ”เบเบญเบตเบ‡เบ•เบฒเบกเบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เปเบฅเบฐเบฎเบฒเบ”เปเบงเบ‚เบญเบ‡เบ—เปˆเบฒเบ™), เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ™เบตเป‰เปเบกเปˆเบ™เบ”เบตเบ—เบตเปˆเบชเบธเบ”. เปเบ•เปˆเบซเบ™เป‰เบฒเป€เบชเบเบ”เบฒเบ, เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบกเบตเป€เบงเบฅเบฒเบ—เบตเปˆเบˆเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ VACUUM FULL เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบšเปเบฒเบฅเบธเบ‡เบฎเบฑเบเบชเบฒเบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป„เบงเป‰, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰เบšเปเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเบชเปเบฒเบฅเบฑเบšเบžเบงเบเป€เบฎเบปเบฒ.

เบ—เบตเบกเบ‡เบฒเบ™ เบ›เบดเบ” Rebuilds เป€เบ™เบทเป‰เบญเปƒเบ™เบ‚เบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปƒเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบ”เบฝเบงเบเบฑเบ™เบเบฑเบš VACUUM FULL, เปเบ•เปˆเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเปเบฒเบ™เบปเบ”เบ”เบฑเบ”เบŠเบฐเบ™เบตเบ•เบฒเบกเบ—เบตเปˆเบ‚เปเป‰เบกเบนเบ™เบˆเบฐเบ–เบทเบเบˆเบฑเบ”เบฅเปเบฒเบ”เบฑเบšเบ—เบฒเบ‡เบ”เป‰เบฒเบ™เบฎเปˆเบฒเบ‡เบเบฒเบเบขเบนเปˆเปƒเบ™เปเบœเปˆเบ™ (เปเบ•เปˆเปƒเบ™เบญเบฐเบ™เบฒเบ„เบปเบ”เบ„เปเบฒเบชเบฑเปˆเบ‡เบšเปเปˆเป„เบ”เป‰เบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบชเปเบฒเบฅเบฑเบšเปเบ–เบงเปƒเบซเบกเปˆ). เปƒเบ™เบšเบฒเบ‡เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™, เบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบ—เบตเปˆเบ”เบตเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบˆเปเบฒเบ™เบงเบ™เบซเบ™เบถเปˆเบ‡ - เบ”เป‰เบงเบเบเบฒเบ™เบญเปˆเบฒเบ™เบšเบฑเบ™เบ—เบถเบเบซเบผเบฒเบเป‚เบ”เบเบ”เบฑเบ”เบชเบฐเบ™เบต. เบ‚เปเป‰เป€เบชเบเบ‚เบญเบ‡เบ„เปเบฒเบชเบฑเปˆเบ‡เปเบกเปˆเบ™เบ„เบทเบเบฑเบ™เบเบฑเบš VACUUM FULL - เบกเบฑเบ™เบฅเบฑเบญเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‡เบฒเบ™.

เบ—เบตเบกเบ‡เบฒเบ™ REINDEX เบ„เป‰เบฒเบเบ„เบทเบเบฑเบšเบชเบญเบ‡เบญเบฑเบ™เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ, เปเบ•เปˆเบชเป‰เบฒเบ‡เบ”เบฑเบ”เบชเบฐเบ™เบตเบชเบฐเป€เบžเบฒเบฐเบซเบผเบทเบ”เบฑเบ”เบชเบฐเบ™เบตเบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡. locks เบญเปˆเบญเบ™เป€เบžเบเป€เบฅเบฑเบเบ™เป‰เบญเบ: ShareLock เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ (เบ›เป‰เบญเบ‡เบเบฑเบ™เบเบฒเบ™เบ”เบฑเบ”เปเบ›เบ‡, เปเบ•เปˆเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เป€เบฅเบทเบญเบ) เปเบฅเบฐ AccessExclusiveLock เบขเบนเปˆเปƒเบ™เบ”เบฑเบ”เบŠเบฐเบ™เบตเบ—เบตเปˆเบ–เบทเบเบชเป‰เบฒเบ‡เปƒเบซเบกเปˆ (เบšเบฅเบฑเบญเบเบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเป‚เบ”เบเปƒเบŠเป‰เบ”เบฑเบ”เบŠเบฐเบ™เบตเบ™เบตเป‰). เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เปƒเบ™เบชเบฐเบšเบฑเบšเบ—เบต 12 เบ‚เบญเบ‡ Postgres เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เป„เบ”เป‰เบ›เบฒเบเบปเบ” เบžเป‰เบญเบกเบเบฑเบ™, เป€เบŠเบดเปˆเบ‡เบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เบ”เบฑเบ”เบชเบฐเบ™เบตเบ„เบทเบ™เปƒเบซเบกเปˆเป„เบ”เป‰เป‚เบ”เบเบšเปเปˆเบ•เป‰เบญเบ‡เบ‚เบฑเบ”เบ‚เบงเบฒเบ‡เบเบฒเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบก, เบเบฒเบ™เบ”เบฑเบ”เปเบเป‰, เบซเบผเบทเบเบฒเบ™เบฅเบถเบšเบšเบฑเบ™เบ—เบถเบเบžเป‰เบญเบกเป†เบเบฑเบ™.

เปƒเบ™เบชเบฐเบšเบฑเบšเบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ‚เบญเบ‡ Postgres, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบšเบฑเบ™เบฅเบธเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบเบฑเบš REINDEX เบžเป‰เบญเบกเบเบฑเบ™เป‚เบ”เบเปƒเบŠเป‰ เบชเป‰เบฒเบ‡เบ”เบฑเบ”เบŠเบฐเบ™เบตเบžเป‰เบญเบกเบเบฑเบ™. เบกเบฑเบ™เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเป‰เบฒเบ‡เบ”เบฑเบ”เบชเบฐเบ™เบตเป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบฅเบฑเบญเบเบขเปˆเบฒเบ‡เป€เบ‚เบฑเป‰เบกเบ‡เบงเบ” (ShareUpdateExclusiveLock, เป€เบŠเบดเปˆเบ‡เบšเปเปˆเปเบŠเบเปเบŠเบ‡เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบ‚เบฐเบซเบ™เบฒเบ™), เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ›เปˆเบฝเบ™เบ”เบฑเบ”เบชเบฐเบ™เบตเป€เบเบปเปˆเบฒเบเบฑเบšเบญเบฑเบ™เปƒเบซเบกเปˆเปเบฅเบฐเบฅเบถเบšเบ”เบฑเบ”เบ™เบตเป€เบเบปเปˆเบฒ. เบ™เบตเป‰เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบฅเบปเบšเบฅเป‰เบฒเบ‡เบ”เบฑเบ”เบŠเบฐเบ™เบต bloat เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เปเบŠเบเปเบŠเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เบญเบ‡เบ—เปˆเบฒเบ™. เบกเบฑเบ™เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเบˆเบฐเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบงเปˆเบฒเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบเบฒเบ™เบชเป‰เบฒเบ‡เบ”เบฑเบ”เบชเบฐเบ™เบตเปƒเบซเบกเปˆเบˆเบฐเบกเบตเบเบฒเบ™เป‚เบซเบผเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเปƒเบ™เบฅเบฐเบšเบปเบšเบเปˆเบญเบเบ‚เบญเบ‡เปเบœเปˆเบ™.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ–เป‰เบฒเบ”เบฑเบ”เบชเบฐเบ™เบตเบกเบตเบงเบดเบ—เบตเบ—เบตเปˆเบˆเบฐเบเปเบฒเบˆเบฑเบ”เบเบฒเบ™ bloat "เปƒเบ™เบเบฒเบ™เบšเบดเบ™", เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบšเปเปˆเบกเบตเบ•เบฒเบ•เบฐเบฅเบฒเบ‡. เบ™เบตเป‰เปเบกเปˆเบ™เบšเปˆเบญเบ™เบ—เบตเปˆเบชเปˆเบงเบ™เบ‚เบฐเบซเบเบฒเบเบžเบฒเบเบ™เบญเบเบ•เปˆเบฒเบ‡เป†เป€เบ‚เบปเป‰เบฒเบกเบฒเบกเบตเบšเบปเบ”เบšเบฒเบ”: pg_repack (เป€เบกเบทเปˆเบญเบเปˆเบญเบ™เปเบกเปˆเบ™ pg_reorg), pgcompact, pgcompactable เปเบฅเบฐโ€‹เบญเบทเปˆเบ™เป†. เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบšเปเปˆเป„เบ”เป‰เบ›เบฝเบšเบ—เบฝเบšเบžเบงเบเป€เบ‚เบปเบฒเปเบฅเบฐเบžเบฝเบ‡เปเบ•เปˆเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบš pg_repack, เป€เบŠเบดเปˆเบ‡, เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบ”เบฑเบ”เปเบเป‰เบšเบฒเบ‡เบขเปˆเบฒเบ‡, เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰เบ•เบปเบงเป€เบฎเบปเบฒเป€เบญเบ‡.

pg_repack เป€เบฎเบฑเบ”เบงเบฝเบเปเบ™เบงเปƒเบ”

Postgres: bloat, pg_repack เปเบฅเบฐเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบ—เบตเปˆเป€เบฅเบทเปˆเบญเบ™เป€เบงเบฅเบฒ
เปƒเบซเป‰เป€เบงเบปเป‰เบฒเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบกเบตเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เปเบฒเบกเบฐเบ”เบฒเบขเปˆเบฒเบ‡เบชเบปเบกเบšเบนเบ™ - เบกเบตเบ”เบฑเบ”เบชเบฐเบ™เบต, เบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เปเบฅเบฐ, เปเบ•เปˆเบซเบ™เป‰เบฒเป€เบชเบเบ”เบฒเบ, เบกเบต bloat. เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เปเบฒเบญเบดเบ”เบ‚เบญเบ‡ pg_repack เปเบกเปˆเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบšเบฑเบ™เบ—เบถเบเป€เบžเบทเปˆเบญเป€เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบกเบฑเบ™เปเบฅเปˆเบ™. เบ•เบปเบงเบเบฐเบ•เบธเป‰เบ™เบˆเบฐเป€เบฎเบฑเบ”เบŠเป‰เปเบฒเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบชเปเบฒเบฅเบฑเบšเบ—เบธเบเป†เบเบฒเบ™เปƒเบชเปˆ, เบ›เบฑเบšเบ›เบธเบ‡เปเบฅเบฐเบฅเบถเบš. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เป„เบ”เป‰เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™, เบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบเบฑเบšเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบš, เปเบ•เปˆเบšเปเปˆเบกเบตเบ”เบฑเบ”เบชเบฐเบ™เบตเปเบฅเบฐเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”, เป€เบžเบทเปˆเบญเบšเปเปˆเปƒเบซเป‰เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เปเบŠเบเบ‚เปเป‰เบกเบนเบ™เบŠเป‰เบฒเบฅเบปเบ‡.

เบ•เปเปˆเป„เบ›, pg_repack เป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เป€เบเบปเปˆเบฒเป„เบ›เบซเบฒเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปƒเบซเบกเปˆ, เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เบญเบญเบเบˆเบฒเบเปเบ–เบงเบ—เบตเปˆเบšเปเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”, เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบชเป‰เบฒเบ‡เบ”เบฑเบ”เบชเบฐเบ™เบตเบชเปเบฒเบฅเบฑเบšเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปƒเบซเบกเปˆ. เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‡เบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰, เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบชเบฐเบชเบปเบกเบขเบนเปˆเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบšเบฑเบ™เบ—เบถเบ.

เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ•เปเปˆเป„เบ›เปเบกเปˆเบ™เบเบฒเบ™เป‚เบญเบ™เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เป„เบ›เบซเบฒเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปƒเบซเบกเปˆ. เบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เบเป‰เบฒเบเปเบกเปˆเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™เป„เบฅเบเบฐเบซเบผเบฒเบเป†เบ„เบฑเป‰เบ‡, เปเบฅเบฐเป€เบกเบทเปˆเบญเบกเบตเบซเบ™เป‰เบญเบเบเบงเปˆเบฒ 20 เบฅเบฒเบเบเบฒเบ™เบ—เบตเปˆเป€เบซเบผเบทเบญเบขเบนเปˆเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบšเบฑเบ™เบ—เบถเบ, pg_repack เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบฅเบฑเบญเบเบ—เบตเปˆเป€เบ‚เบฑเป‰เบกเปเบ‚เบ‡, เบเป‰เบฒเบเบ‚เปเป‰เบกเบนเบ™เบซเบผเป‰เบฒเบชเบธเบ”, เปเบฅเบฐเบ›เปˆเบฝเบ™เปเบ—เบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เป€เบเบปเปˆเบฒเบ”เป‰เบงเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปƒเบซเบกเปˆเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบฅเบฐเบšเบปเบš Postgres. เบ™เบตเป‰เปเบกเปˆเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเปเบฅเบฐเบชเบฑเป‰เบ™เบ—เบตเปˆเบชเบธเบ”เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ—เปˆเบฒเบ™เบˆเบฐเบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ•เบฒเบ•เบฐเบฅเบฒเบ‡. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบตเป‰, เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เป€เบเบปเปˆเบฒเปเบฅเบฐเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เบตเปˆเบกเบตเบšเบฑเบ™เบ—เบถเบเบ–เบทเบเบฅเบถเบšเบ–เบดเป‰เบกเปเบฅเบฐเบžเบทเป‰เบ™เบ—เบตเปˆเบ–เบทเบเบ›เปˆเบญเบเบญเบญเบเบกเบฒเปƒเบ™เบฅเบฐเบšเบปเบšเป„เบŸเบฅเปŒ. เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เปเบกเปˆเบ™เบชเปเบฒเป€เบฅเบฑเบ”.

เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบ”เบตเปƒเบ™เบ—เบดเบ”เบชเบฐเบ”เบต, เปเบ•เปˆเบชเบดเปˆเบ‡เบ—เบตเปˆเป€เบเบตเบ”เบ‚เบทเป‰เบ™เปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”? เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบ—เบปเบ”เบชเบญเบš pg_repack เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เป‚เบซเบผเบ”เปเบฅเบฐเบžเบฒเบเปƒเบ•เป‰เบเบฒเบ™เป‚เบซเบผเบ”, เปเบฅเบฐเบเบงเบ”เป€เบšเบดเปˆเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เบกเบฑเบ™เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เบขเบธเบ”เบเปˆเบญเบ™เป„เบงเบญเบฑเบ™เบ„เบงเบ™ (เปƒเบ™เบ„เปเบฒเบชเบฑเบšเบ•เปˆเบฒเบ‡เป†เบญเบทเปˆเบ™เป†, เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ Ctrl+C). เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบ—เบฑเบ‡เปเบปเบ”เปเบกเปˆเบ™เป€เบ›เบฑเบ™เบšเบงเบ.

เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เป„เบ›โ€‹เบฎเป‰เบฒเบ™โ€‹เบญเบฒโ€‹เบซเบฒเบ™ - เปเบฅเบฐโ€‹เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบ™เบฑเป‰เบ™โ€‹เบ—เบธเบโ€‹เบชเบดเปˆเบ‡โ€‹เบ—เบธเบโ€‹เบขเปˆเบฒเบ‡โ€‹เบšเปเปˆโ€‹เป„เบ”เป‰โ€‹เป€เบ›เบฑเบ™โ€‹เป„เบ›โ€‹เบ•เบฒเบกโ€‹เบ—เบตเปˆโ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบ„เบฒเบ”โ€‹เบซเบงเบฑเบ‡โ€‹.

pancake เบ—เปเบฒเบญเบดเบ”เบ—เบตเปˆเบ‚เบฒเบ

เปƒเบ™เบเบธเปˆเบกเบ—เปเบฒเบญเบดเบ”เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบฅเบฐเป€เบกเบตเบ”เบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบ—เบตเปˆเป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฑเบ:

$ ./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. เบญเบตเบ‡เบ•เบฒเบกเบ„เบธเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบฅเบงเบกเบขเบนเปˆเปƒเบ™เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ‚เบญเบ‡เบกเบฑเบ™, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบเปเบฒเบ™เบปเบ”เบ‚เปเป‰เบˆเปเบฒเบเบฑเบ” "เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ" เบ—เบตเปˆเบชเบญเบ”เบ„เปˆเบญเบ‡เบเบฑเบšเบกเบฑเบ™. เบšเบฑเบ™เบซเบฒเป„เบ”เป‰เบเบฒเบเป€เบ›เบฑเบ™เบงเปˆเบฒเบ™เบตเป‰เบšเปเปˆเปเบกเปˆเบ™เบ‚เปเป‰ เบˆเบณ เบเบฑเบ” เบ—เบณ เบกเบฐเบ”เบฒ, เปเบ•เปˆเป€เบ›เบฑเบ™เบเบฒเบ™เป€เบฅเบทเปˆเบญเบ™เป€เบงเบฅเบฒ (เบ‚เปเป‰เบˆเบณเบเบฑเบ”เบ—เบตเปˆเป€เบฅเบทเปˆเบญเบ™เป€เบงเบฅเบฒ), i.e. เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ‚เบญเบ‡เบกเบฑเบ™เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เปเปˆเบกเบฒเบเปˆเบงเบฒเบ„เปเบฒเบชเบฑเปˆเบ‡ 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, เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบ—เปเบฒเบญเบดเบ”เบˆเบฐ "เบขเบทเบ™" เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบฅเบฐเบซเบงเปˆเบฒเบ‡เบ—เบตเบชเบญเบ‡เปเบฅเบฐเบ—เบตเบชเบฒเบก. เบเบฒเบ™เปเบเป‰เป„เบ‚เบ™เบตเป‰เป€เบฎเบฑเบ”เบงเบฝเบ, เปเบ•เปˆเบกเบตเบชเบญเบ‡เบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”. เบซเบ™เป‰เบฒเบ—เปเบฒเบญเบดเบ”, เบกเบฑเบ™เบˆเบฐเบšเปเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบชเปเบฒเบฅเบฑเบšเบ—เปˆเบฒเบ™เบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบกเบนเบ™เบ„เปˆเบฒเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบšเบฒเบ‡เบšเปˆเบญเบ™เปƒเบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš. เบญเบฑเบ™เบ—เบตเบชเบญเบ‡, เบญเบตเบ‡เบ•เบฒเบกเบ„เบงเบฒเบกเปเบกเปˆเบ™เบเปเบฒเบ‚เบญเบ‡เบ›เบฐเป€เบžเบ”เบ‚เปเป‰เบกเบนเบ™, เบ—เปˆเบฒเบ™เบˆเบฐเบกเบตเบˆเปเบฒเบ™เบงเบ™เบˆเปเบฒเบเบฑเบ”เบ‚เบญเบ‡ inserts เบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเบ„เบดเบ”เป„เบฅเปˆเบกเบนเบ™เบ„เปˆเบฒเบ‚เบญเบ‡เบšเบฑเบ™เบ—เบถเบเบ—เบฑเบ‡เบซเบกเบปเบ”.

เบ—เบฒเบ‡โ€‹เป€เบฅเบทเบญเบโ€‹เบ—เบตโ€‹เบชเบฒเบกโ€‹: เป€เบฎเบฑเบ”โ€‹เปƒเบซเป‰โ€‹เบ‚เปเป‰โ€‹เบˆเปเบฒโ€‹เบเบฑเบ”โ€‹เป€เบฅเบทเปˆเบญเบ™โ€‹เป€เบงโ€‹เบฅเบฒโ€‹เป€เบžเบทเปˆเบญโ€‹เปƒเบซเป‰โ€‹เบกเบฑเบ™โ€‹เบ–เบทเบโ€‹เบเบงเบ”โ€‹เบชเบญเบšโ€‹เบžเบฝเบ‡โ€‹เปเบ•เปˆโ€‹เปƒเบ™โ€‹เป€เบงโ€‹เบฅเบฒโ€‹เบ—เบตเปˆโ€‹เบ„เปเบฒโ€‹เบซเบกเบฑเป‰เบ™โ€‹เบชเบฑเบ™โ€‹เบเบฒโ€‹:

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

เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเป€เบซเบ”เบœเบปเบ™เบ‚เบญเบ‡เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบงเปˆเบฒเบกเบนเบ™เบ„เปˆเบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฑเบเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒ, เบกเบฑเบ™เบˆเบฐเบ›เบฐเบชเบปเบšเบœเบปเบ™เบชเปเบฒเป€เบฅเบฑเบ”.

เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเบชเบปเบ™เบ—เบฐเบ™เบฒเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เบ™เบตเป‰เปเบกเปˆเบ™, เปเบ™เปˆเบ™เบญเบ™, เบชเบฑเบ‡เป€เบ„เบฒเบฐเบซเบผเบฒเบ, เปเบ•เปˆเบกเบฑเบ™เป€เบ›เบตเบ”เป€เบœเบตเบเปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”. เปƒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰เบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบ—เบตเปˆเป€เบฅเบทเปˆเบญเบ™เป€เบงเบฅเบฒเป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบซเบ”เบœเบปเบ™เบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเปƒเบ™เบเบฒเบ™เปเบเป‰เป„เบ‚เบ‚เปเป‰เบ‚เบฑเบ”เปเบเปˆเบ‡เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบœเบนเป‰เปƒเบŠเป‰เป€เบฎเบฑเบ”เบงเบฝเบเบžเป‰เบญเบกเป†เบเบฑเบ™เบเบฑเบšเบงเบฑเบ”เบ–เบธ widget เบ—เบตเปˆเปƒเบŠเป‰เบฎเปˆเบงเบกเบเบฑเบ™เปƒเบ™เบเบฐเบ”เบฒเบ™. เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเป€เบฎเบฑเบ”เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เปƒเบซเป‰เบฅเบฐเบซเบฑเบ”เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเป€เบ›เบฑเบ™เบžเบฝเบ‡เป€เบฅเบฑเบเบ™เป‰เบญเบเบ‡เปˆเบฒเบเบ”เบฒเบ.

เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›, เบญเบตเบ‡เบ•เบฒเบกเบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”, Postgres เบกเบตเบชเบฒเบกเบฅเบฐเบ”เบฑเบšเบ‚เบญเบ‡ granularity เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบงเบ”เบชเบญเบšเปƒเบซเป‰เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒ: เปเบ–เบง, เบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒ, เปเบฅเบฐเบฅเบฐเบ”เบฑเบšเบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบ.
Postgres: bloat, pg_repack เปเบฅเบฐเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบ—เบตเปˆเป€เบฅเบทเปˆเบญเบ™เป€เบงเบฅเบฒ
เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: begriffs

เบเบงเบ”เป€เบšเบดเปˆเบ‡ เปเบฅเบฐเบšเปเปˆ NULL เบชเบฐเป€เบซเบกเบตเบ–เบทเบเบเบงเบ”เบชเบญเบšเบขเบนเปˆเปƒเบ™เบฅเบฐเบ”เบฑเบšเปเบ–เบง; เบชเปเบฒเบฅเบฑเบšเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบญเบทเปˆเบ™เป†, เบ”เบฑเปˆเบ‡เบ—เบตเปˆเป€เบซเบฑเบ™เป„เบ”เป‰เบˆเบฒเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡, เบกเบตเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบก เบ—เบตเปˆเบ™เบตเป‰.

เป€เบžเบทเปˆเบญเบชเบฐเบซเบผเบธเบšเป‚เบ”เบเบซเบเปเป‰, เบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบ—เบตเปˆเป€เบฅเบทเปˆเบญเบ™เป€เบงเบฅเบฒเปƒเบ™เบซเบผเบฒเบเป†เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เปƒเบซเป‰เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เป„เบ”เป‰เบซเบผเบฒเบเปเบฅเบฐเบ„เปเบฒเบชเบฑเปˆเบ‡เบซเบ™เป‰เบญเบเบฅเบปเบ‡. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบˆเปˆเบฒเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เบตเป‰เป‚เบ”เบ complicating เบ‚เบฐเบšเบงเบ™เบเบฒเบ™ debugging, เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เป€เบเบตเบ”เบ‚เบถเป‰เบ™เปเบฅเบฐเบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เบŠเบญเบเบซเบฒเบกเบฑเบ™เป„เบ”เป‰เบ–เบทเบเปเบเบเบญเบญเบเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆ. เบšเบฑเบ™เบซเบฒเบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบญเบตเบเบขเปˆเบฒเบ‡เบซเบ™เบถเปˆเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบœเบนเป‰เบเปเบฒเบ™เบปเบ”เป€เบงเบฅเบฒเบญเบฒเบ”เบˆเบฐเบšเปเปˆเบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เปเบœเบ™เบเบฒเบ™เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”เป„เบ”เป‰เบ•เบฐเบซเบผเบญเบ”เป€เบงเบฅเบฒเบ–เป‰เบฒเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบ—เบตเปˆเป€เบฅเบทเปˆเบญเบ™เป€เบงเบฅเบฒ.

เบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡ 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 เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”. เบ™เบตเป‰เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เบทเบเบฑเบ™เปƒเบ™เบ—เบฑเบ‡เบชเบญเบ‡เบเปเบฅเบฐเบ™เบต: เบญเบฒเบ”เบˆเบฐเบŠเบฑเบเบŠเป‰เบฒเบขเบนเปˆเบชเบฐเป€เบซเบกเบต, เบซเบผเบทเบ—เบฑเบ™เบ—เบตเบ—เบฑเบ™เปƒเบ”.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบ„เบงเบฒเบกเบ„เบดเบ”เปเบ™เบงเปƒเบ”?

เบชเป‰เบฒเบ‡เบ”เบฑเบ”เบชเบฐเบ™เบตเบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบš deferred

เบ„เบงเบฒเบกเบ„เบดเบ”เบ—เปเบฒเบญเบดเบ”เปเบกเปˆเบ™เป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ—เบฑเบ‡เบชเบญเบ‡เปƒเบ™เบฎเบนเบšเปเบšเบšเบ—เบฑเบ™เบ—เบต. เบ™เบตเป‰เบญเบฒเบ”เบˆเบฐเบชเป‰เบฒเบ‡เบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบ—เบฒเบ‡เบšเบงเบเบ—เบตเปˆเบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เบซเบผเบฒเบ, เปเบ•เปˆเบ–เป‰เบฒเบกเบตเบˆเปเบฒเบ™เบงเบ™เบซเบ™เป‰เบญเบ, เบ™เบตเป‰เบšเปเปˆเบ„เบงเบ™เบชเบปเปˆเบ‡เบœเบปเบ™เบเบฐเบ—เบปเบšเบ•เปเปˆเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰, เป€เบžเบฒเบฐเบงเปˆเบฒเบ„เบงเบฒเบกเบ‚เบฑเบ”เปเบเป‰เบ‡เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเป€เบ›เบฑเบ™เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ›เบปเบเบเบฐเบ•เบดเบชเปเบฒเบฅเบฑเบšเบžเบงเบเป€เบ‚เบปเบฒ. เบžเบงเบเบกเบฑเบ™เป€เบเบตเบ”เบ‚เบทเป‰เบ™, เบ•เบปเบงเบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™, เป€เบกเบทเปˆเบญเบœเบนเป‰เปƒเบŠเป‰เบชเบญเบ‡เบ„เบปเบ™เป€เบฅเบตเปˆเบกเปเบเป‰เป„เบ‚ widget เบ”เบฝเบงเบเบฑเบ™เปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™, เปเบฅเบฐเบฅเบนเบเบ„เป‰เบฒเบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰เบ—เบตเบชเบญเบ‡เบšเปเปˆเบกเบตเป€เบงเบฅเบฒเบ—เบตเปˆเบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆ widget เบ–เบทเบเบšเบฅเบฑเบญเบเปเบฅเป‰เบงเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ”เบฑเบ”เปเบเป‰เป‚เบ”เบเบœเบนเป‰เปƒเบŠเป‰เบ—เปเบฒเบญเบดเบ”. เปƒเบ™เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบง, เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ›เบฐเบ•เบดเป€เบชเบ”เบœเบนเป‰เปƒเบŠเป‰เบ—เบตเบชเบญเบ‡, เปเบฅเบฐเบฅเบนเบเบ„เป‰เบฒเบ‚เบญเบ‡เบกเบฑเบ™เบเบฑเบšเบ„เบทเบ™เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เปเบฅเบฐเบ‚เบฑเบ”เบ‚เบงเบฒเบ‡ widget. เป€เบฅเบฑเบเบ™เป‰เบญเบเบ•เปเปˆเบกเบฒ, เป€เบกเบทเปˆเบญเบœเบนเป‰เปƒเบŠเป‰เบ—เปเบฒเบญเบดเบ”เบชเปเบฒเป€เบฅเบฑเบ”เบเบฒเบ™เปเบเป‰เป„เบ‚, เบœเบนเป‰เบ—เบตเบชเบญเบ‡เบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆ widget เบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบšเบฅเบฑเบญเบเบญเบตเบเบ•เปเปˆเป„เบ›เปเบฅเบฐเบˆเบฐเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เบŠเป‰เปเบฒเบญเบตเบ.

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.

เป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบกเบฑเบ™เป€เบเบตเบ”เบ‚เบถเป‰เบ™? เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ‚เบญเบ‡เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ—เบตเปˆเป€เบเบตเบ”เบ‚เบทเป‰เบ™เปเบกเปˆเบ™เบ‚เบถเป‰เบ™เบเบฑเบšเบˆเปเบฒเบ™เบงเบ™เบœเบนเป‰เปƒเบŠเป‰เบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš widget เบ”เบฝเบงเบเบฑเบ™เปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™. เบ›เบฒเบเบปเบ”เบ‚เบทเป‰เบ™, เปƒเบ™เป€เบงเบฅเบฒเบ™เบตเป‰เบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ—เบตเปˆเบกเบตเบเบฒเบ™เปเบ‚เปˆเบ‡เบ‚เบฑเบ™เบซเบ™เป‰เบญเบเบฅเบปเบ‡เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™เบเบธเปˆเบกเบ—เปเบฒเบญเบดเบ”เบเปˆเบงเบฒเบ„เบปเบ™เบญเบทเปˆเบ™, i.e. เบžเบงเบเป€เบฎเบปเบฒเบžเบฝเบ‡เปเบ•เปˆ "เป‚เบŠเบเบ”เบต".

เบ„เบงเบฒเบกเบ„เบดเบ”เบšเปเปˆเป„เบ”เป‰เบœเบปเบ™. เปƒเบ™เบˆเบธเบ”เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เป€เบซเบฑเบ™เบงเบดเบ—เบตเปเบเป‰เป„เบ‚เบญเบตเบเบชเบญเบ‡เบขเปˆเบฒเบ‡: เบ‚เบฝเบ™เบฅเบฐเบซเบฑเบ”เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบ„เบทเบ™เปƒเบซเบกเปˆเป€เบžเบทเปˆเบญเปเบˆเบเบขเบฒเบเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบ—เบตเปˆเป€เบฅเบทเปˆเบญเบ™เป€เบงเบฅเบฒ, เบซเบผเบท "เบชเบญเบ™" pg_repack เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบžเบงเบเป€เบ‚เบปเบฒ. เบžเบงเบเป€เบฎเบปเบฒเป€เบฅเบทเบญเบเบญเบฑเบ™เบ—เบตเบชเบญเบ‡.

เปเบ—เบ™เบ—เบตเปˆเบ”เบฑเบ”เบŠเบฐเบ™เบตเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปƒเบซเบกเปˆเบ”เป‰เบงเบเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบ—เบตเปˆเป€เบฅเบทเปˆเบญเบ™เป„เบ›เบˆเบฒเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบš

เบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบ‚เบญเบ‡เบเบฒเบ™เปเบเป‰เป„เบ‚เปเบกเปˆเบ™เป€เบซเบฑเบ™เป„เบ”เป‰เบŠเบฑเบ”เป€เบˆเบ™ - เบ–เป‰เบฒเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบšเบกเบตเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบ—เบตเปˆเป€เบฅเบทเปˆเบญเบ™เป„เบ”เป‰, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบชเปเบฒเบฅเบฑเบšเบชเบฐเบšเบฑเบšเปƒเบซเบกเปˆ, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡เบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบ”เบฑเปˆเบ‡เบเปˆเบฒเบง, เปเบฅเบฐเบšเปเปˆเปเบกเปˆเบ™เบ”เบฑเบ”เบชเบฐเบ™เบต.

เป€เบžเบทเปˆเบญเบ—เบปเบ”เบชเบญเบšเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เบžเบงเบเป€เบฎเบปเบฒเบ‚เบฝเบ™เปเบšเบšเบ—เบปเบ”เบชเบญเบšเบ‡เปˆเบฒเบเป†:

  • เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เบตเปˆเบกเบตเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบ—เบตเปˆเป€เบฅเบทเปˆเบญเบ™เป€เบงเบฅเบฒเปเบฅเบฐเบšเบฑเบ™เบ—เบถเบเบซเบ™เบถเปˆเบ‡;
  • เปƒเบชเปˆเบ‚เปเป‰เบกเบนเบ™เปƒเบ™ loop เบ—เบตเปˆเบ‚เบฑเบ”เปเบเป‰เบ‡เบเบฑเบšเบšเบฑเบ™เบ—เบถเบเบ—เบตเปˆเบกเบตเบขเบนเปˆเปเบฅเป‰เบง;
  • เบ›เบฑเบšเบ›เบธเบ‡เปƒเบซเป‰เบ—เบฑเบ™ โ€“ เบ‚เปเป‰เบกเบนเบ™เบšเปเปˆเบ‚เบฑเบ”เบเบฑเบ™เบญเบตเบเบ•เปเปˆเป„เบ›;
  • เบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡.

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 เบชเบฐเป€เบซเบกเบต crashed เปƒเบ™ insert เบ—เปเบฒเบญเบดเบ”, เบชเบฐเบšเบฑเบšเบ”เบฑเบ”เปเบเป‰เป€เบฎเบฑเบ”เบงเบฝเบเป‚เบ”เบเบšเปเปˆเบกเบตเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”. เบเบดเปˆเบ‡เปƒเบซเบเปˆ.

เบžเบงเบเป€เบฎเบปเบฒเป„เบ›เบซเบฒเบเบฒเบ™เบœเบฐเบฅเบดเบ”เปเบฅเบฐเบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡เป„เบ”เป‰เบฎเบฑเบšเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™เป„เบฅเบเบฐเบ”เบฝเบงเบเบฑเบ™เบ‚เบญเบ‡เบเบฒเบ™เบ„เบฑเบ”เบฅเบญเบเบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบšเบฑเบ™เบ—เบถเบเป„เบ›เบซเบฒเบญเบฑเบ™เปƒเบซเบกเปˆ:

$ ./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 เบšเบฑเบ™เบ—เบถเบ, เป€เบŠเบดเปˆเบ‡เบญเบฐเบ—เบดเบšเบฒเบเบงเปˆเบฒเป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบˆเบถเปˆเบ‡เบ›เบฐเบชเบปเบšเบœเบปเบ™เบชเปเบฒเป€เบฅเบฑเบ” - เบžเบงเบเบกเบฑเบ™เบšเปเปˆเป„เบ”เป‰เบเบงเบกเป€เบญเบปเบฒเบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡ โ€œbatch junctionโ€. เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เปƒเบŠเป‰เบชเบญเบ‡เบ„เปเบฒเบชเบฑเปˆเบ‡ - เปƒเบชเปˆเปเบฅเบฐเบ›เบฑเบšเบ›เบธเบ‡, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เปเบ™เปˆเบ™เบญเบ™ 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;

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบงเบฝเบเบ‡เบฒเบ™เบ•เปเปˆเป„เบ›เปเบกเปˆเบ™เป€เบžเบทเปˆเบญเปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบš, เบ—เบตเปˆเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เปƒเบ™เบซเบ™เบถเปˆเบ‡เบ—เบธเบฅเบฐเบเปเบฒ, เบชเบดเป‰เบ™เบชเบธเบ”เบฅเบปเบ‡เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปƒเบซเบกเปˆเบžเบฒเบเปƒเบ™เบซเบ™เบถเปˆเบ‡เบ—เบธเบฅเบฐเบเปเบฒ.

เบเบฒเบ™เบ›เบฐเบ•เบดเป€เบชเบ”เบˆเบฒเบ batch

เปเบฅเบฐเบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบชเบญเบ‡เบงเบดเบ—เบตเปเบเป‰เป„เบ‚. เบซเบ™เป‰เบฒเบ—เปเบฒเบญเบดเบ”: เปƒเบซเป‰เบ›เบฐเบ–เบดเป‰เบกเบขเปˆเบฒเบ‡เบชเบปเบกเบšเบนเบ™เบเบฒเบ™เปเบšเปˆเบ‡เบ›เบฑเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ batches เปเบฅเบฐเป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™เปƒเบ™เบซเบ™เบถเปˆเบ‡เบ—เบธเบฅเบฐเบเปเบฒ. เบ›เบฐเป‚เบซเบเบ”เบ‚เบญเบ‡เบเบฒเบ™เปเบเป‰เป„เบ‚เบ™เบตเป‰เปเบกเปˆเบ™เบ„เบงเบฒเบกเบ‡เปˆเบฒเบเบ”เบฒเบเบ‚เบญเบ‡เบกเบฑเบ™ - เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป„เบงเป‰เปเบกเปˆเบ™เบซเบ™เป‰เบญเบ (เป‚เบ”เบเบงเบดเบ—เบตเบ—เบฒเบ‡เบเบฒเบ™, เปƒเบ™เบฎเบธเปˆเบ™เป€เบเบปเปˆเบฒ pg_reorg เป€เบฎเบฑเบ”เบงเบฝเบเบ„เบทเบเบฑเบ™). เปเบ•เปˆเบกเบตเบšเบฑเบ™เบซเบฒ - เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เบชเป‰เบฒเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒเบ—เบตเปˆเบเบฒเบงเบ™เบฒเบ™, เปเบฅเบฐเบ™เบตเป‰, เบ”เบฑเปˆเบ‡เบ—เบตเปˆเป„เบ”เป‰เบเปˆเบฒเบงเบกเบฒเบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰, เป€เบ›เบฑเบ™เป„เบžเบ‚เบปเปˆเบกเบ‚เบนเปˆเบ•เปเปˆเบเบฒเบ™เป€เบเบตเบ”เปƒเบซเบกเปˆเบ‚เบญเบ‡ bloat เปƒเบซเบกเปˆ.

เบเบฒเบ™เปเบเป‰เป„เบ‚เบ—เบตเบชเบญเบ‡เปเบกเปˆเบ™เบชเบฑเบšเบชเบปเบ™เบซเบผเบฒเบ, เปเบ•เปˆเบญเบฒเบ”เบˆเบฐเบ–เบทเบเบ•เป‰เบญเบ‡เบเบงเปˆเบฒ: เบชเป‰เบฒเบ‡เบ–เบฑเบ™เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบšเบฑเบ™เบ—เบถเบเบ—เบตเปˆเบกเบตเบ•เบปเบงเบฅเบฐเบšเบธเบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒเบ—เบตเปˆเป€เบžเบตเปˆเบกเบ‚เปเป‰เบกเบนเบ™เปƒเบชเปˆเบ•เบฒเบ•เบฐเบฅเบฒเบ‡. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เป€เบกเบทเปˆเบญเบžเบงเบเป€เบฎเบปเบฒเบ„เบฑเบ”เบฅเบญเบเบ‚เปเป‰เบกเบนเบ™, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบˆเบฑเบ”เบเบธเปˆเบกเบกเบฑเบ™เป‚เบ”เบเบ„เบธเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบ™เบตเป‰เปเบฅเบฐเปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบ–เบทเบเป‚เบญเบ™เป€เบ‚เบปเป‰เบฒเบเบฑเบ™. batch เบˆเบฐเบ–เบทเบเบชเป‰เบฒเบ‡เบ•เบฑเป‰เบ‡เบ‚เบถเป‰เบ™เบˆเบฒเบเบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒเบซเบผเบฒเบเบ„เบฑเป‰เบ‡ (เบซเบผเบทเบซเบ™เบถเปˆเบ‡เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆ) เปเบฅเบฐเบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡เบกเบฑเบ™เบˆเบฐเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบ‚เบถเป‰เบ™เบเบฑเบšเบˆเปเบฒเบ™เบงเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบ–เบทเบเบ›เปˆเบฝเบ™เปเบ›เบ‡เปƒเบ™เบ—เบธเบฅเบฐเบเปเบฒเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰. เบกเบฑเบ™เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเบˆเบฐเบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบเบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบšเบฑเบ™เบ—เบถเบเปƒเบ™เบฅเปเบฒเบ”เบฑเบšเปเบšเบšเบชเบธเปˆเบก, เบกเบฑเบ™เบˆเบฐเบšเปเปˆเบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เบกเบฑเบ™เบ•เบฒเบกเบฅเปเบฒเบ”เบฑเบš, เบ”เบฑเปˆเบ‡เบ—เบตเปˆเป€เบ„เบตเบเป€เบ›เบฑเบ™เบกเบฒเบเปˆเบญเบ™. seqscan เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ—เบตเปˆเบกเบตเบเบฒเบ™เบเบฑเปˆเบ™เบ•เบญเบ‡เป‚เบ”เบ tx_id เปเบกเปˆเบ™เบฅเบฒเบ„เบฒเปเบžเบ‡เป€เบเบตเบ™เป„เบ›, เบ”เบฑเบ”เบชเบฐเบ™เบตเปเบกเปˆเบ™เบˆเปเบฒเป€เบ›เบฑเบ™, เปเบ•เปˆเบกเบฑเบ™เบเบฑเบ‡เบˆเบฐเบŠเป‰เบฒเบฅเบปเบ‡เบงเบดเบ—เบตเบเบฒเบ™เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบ overhead เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡เบกเบฑเบ™. เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›, เบ•เบฒเบกเบชเบฐเป€เบซเบกเบต, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบชเบเบชเบฐเบฅเบฐเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เปเบฒเบญเบดเบ”, เบเป‰เบญเบ™เบงเปˆเบฒเบกเบฑเบ™เบ‡เปˆเบฒเบเบเบงเปˆเบฒ. เบ—เปเบฒเบญเบดเบ”, เบกเบฑเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบ‚เบปเป‰เบฒเปƒเบˆเบงเปˆเบฒเบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒเบ—เบตเปˆเบเบฒเบงเบ™เบฒเบ™เบˆเบฐเป€เบ›เบฑเบ™เบšเบฑเบ™เบซเบฒเบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡. เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบเบฒเบ™เป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบ•เบปเป‰เบ™เบ•เปเบˆเบฒเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เป€เบเบปเปˆเบฒเป„เบ›เบซเบฒเปƒเบซเบกเปˆเบเปเปˆเป€เบเบตเบ”เบ‚เบทเป‰เบ™เปƒเบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒเบ—เบตเปˆเบเบฒเบงเบ™เบฒเบ™, เบ„เปเบฒเบ–เบฒเบกเบ—เบตเปˆเบ›เปˆเบฝเบ™เป€เบ›เบฑเบ™ "เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบžเบตเปˆเบกเบ—เบธเบฅเบฐเบเปเบฒเบ™เบตเป‰เบซเบผเบฒเบเบ›เบฒเบ™เปƒเบ”?" เป„เบฅเบเบฐเป€เบงเบฅเบฒเบ‚เบญเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒเบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”เบชเปˆเบงเบ™เปƒเบซเบเปˆเปเบกเปˆเบ™เบ‚เบถเป‰เบ™เบเบฑเบšเบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡. เป„เบฅเบเบฐเป€เบงเบฅเบฒเบ‚เบญเบ‡เปƒเบซเบกเปˆเปเบกเปˆเบ™เบ‚เบถเป‰เบ™เบเบฑเบšเบˆเปเบฒเบ™เบงเบ™เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ—เบตเปˆเบชเบฐเบชเบปเบกเบขเบนเปˆเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™, i.e. เบเปˆเบฝเบงโ€‹เบเบฑเบšโ€‹เบ„เบงเบฒเบกโ€‹เป€เบ‚เบฑเป‰เบกโ€‹เปเบ‚เบ‡โ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เป‚เบซเบผเบ”โ€‹เป„เบ”เป‰โ€‹. เบเบฒเบ™เปเบฅเปˆเบ™ pg_repack เป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เป„เบฅเบเบฐเป€เบงเบฅเบฒเบ‚เบญเบ‡เบเบฒเบ™เป‚เบซเบผเบ”เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบซเบ™เป‰เบญเบ, เปเบฅเบฐเบ›เบฐเบฅเบดเบกเบฒเบ™เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เปเบกเปˆเบ™เบซเบ™เป‰เบญเบเบฅเบปเบ‡เป€เบกเบทเปˆเบญเบ—เบฝเบšเบเบฑเบšเบ‚เบฐเบซเบ™เบฒเบ”เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบšเบ‚เบญเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡. เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบฅเบฐเป€เบฅเบตเบเป€เบงเบฅเบฒเบ‚เบญเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒเปƒเบซเบกเปˆ (เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฝเบšเบ—เบฝเบš, เป‚เบ”เบเบชเบฐเป€เบฅเปˆเบเปเบกเปˆเบ™ 1 เบŠเบปเปˆเบงเป‚เบกเบ‡ 2-3 เบ™เบฒเบ—เบต).

เบเบฒเบ™เบ—เบปเบ”เบฅเบญเบ‡เป„เบ”เป‰เบœเบปเบ™เปƒเบ™เบ—เบฒเบ‡เบšเบงเบ. เป€เบ›เบตเบ”เบ•เบปเบงเบเบฒเบ™เบœเบฐเบฅเบดเบ”เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™. เป€เบžเบทเปˆเบญเบ„เบงเบฒเบกเบŠเบฑเบ”เป€เบˆเบ™, เบ™เบตเป‰เปเบกเปˆเบ™เบฎเบนเบšเบ—เบตเปˆเบกเบตเบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡เบซเบ™เบถเปˆเบ‡เปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบซเบผเบฑเบ‡เบˆเบฒเบเปเบฅเปˆเบ™:

Postgres: bloat, pg_repack เปเบฅเบฐเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบ—เบตเปˆเป€เบฅเบทเปˆเบญเบ™เป€เบงเบฅเบฒ

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบžเบงเบเป€เบฎเบปเบฒเบกเบตเบ„เบงเบฒเบกเบžเปเปƒเบˆเบขเปˆเบฒเบ‡เบชเบปเบกเบšเบนเบ™เบเบฑเบšเบเบฒเบ™เปเบเป‰เป„เบ‚เบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเป„เบ”เป‰เบžเบฐเบเบฒเบเบฒเบกเบ›เบฐเบ•เบดเบšเบฑเบ”เบญเบฑเบ™เบ—เบตเบชเบญเบ‡, เปเบ•เปˆเบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบ„เบงเบฒเบกเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ‚เบญเบ‡เบเบฒเบ™เบชเบปเบ™เบ—เบฐเบ™เบฒเบเบฑเบšเบœเบนเป‰เบžเบฑเบ”เบ—เบฐเบ™เบฒเบเบฒเบ™เบ‚เบฐเบซเบเบฒเบ. เบเบฒเบ™เปเบเป‰เป„เบ‚เปƒเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เปเบ•เปˆเบซเบ™เป‰เบฒเป€เบชเบเบ”เบฒเบ, เบเบฑเบ‡เบšเปเปˆเบ—เบฑเบ™เบžเป‰เบญเบกเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบžเบดเบกเป€เบœเบตเบเปเบœเปˆ, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบžเบฝเบ‡เปเบ•เปˆเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ—เบตเปˆเบกเบตเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบเบฒเบ™เป€เบฅเบทเปˆเบญเบ™เบ—เบตเปˆเป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฑเบ, เปเบฅเบฐเบชเปเบฒเบฅเบฑเบš patch เป€เบ•เบฑเบกเบ—เบตเปˆเบกเบฑเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบชเปเบฒเบฅเบฑเบšเบ›เบฐเป€เบžเบ”เบญเบทเปˆเบ™เป†. เบžเบงเบเป€เบฎเบปเบฒเบซเบงเบฑเบ‡เบงเปˆเบฒเบˆเบฐเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰เป„เบ”เป‰เปƒเบ™เบญเบฐเบ™เบฒเบ„เบปเบ”.

เบšเบฒเบ‡เบ—เบตเป€เบˆเบปเป‰เบฒเบกเบตเบ„เปเบฒเบ–เบฒเบก, เป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบžเบงเบเป€เบฎเบปเบฒเบˆเบถเปˆเบ‡เบกเบตเบชเปˆเบงเบ™เบฎเปˆเบงเบกเปƒเบ™เป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰เบ”เป‰เบงเบเบเบฒเบ™เบ”เบฑเบ”เปเบ›เบ‡ pg_repack, เปเบฅเบฐเบšเปเปˆเป„เบ”เป‰เปƒเบŠเป‰เบ•เบปเบงเบ›เบฝเบšเบ—เบฝเบšเบ‚เบญเบ‡เบกเบฑเบ™? เปƒเบ™เบšเบฒเบ‡เบˆเบธเบ”เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบ„เบดเบ”เบเปˆเบฝเบงเบเบฑเบšเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰, เปเบ•เปˆเบ›เบฐเบชเบปเบšเบเบฒเบ™เปƒเบ™เบ—เบฒเบ‡เบšเบงเบเบ‚เบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบกเบฑเบ™เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰, เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เบตเปˆเบšเปเปˆเบกเบตเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”, เบเบฐเบ•เบธเป‰เบ™เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบžเบฐเบเบฒเบเบฒเบกเป€เบ‚เบปเป‰เบฒเปƒเบˆเบ„เบงเบฒเบกเบชเปเบฒเบ„เบฑเบ™เบ‚เบญเบ‡เบšเบฑเบ™เบซเบฒเปเบฅเบฐเปเบเป‰เป„เบ‚เบกเบฑเบ™. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบงเบดเบ—เบตเปเบเป‰เป„เบ‚เบญเบทเปˆเบ™เป†เบเบฑเบ‡เบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบงเบฅเบฒเปƒเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบš, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบˆเบถเปˆเบ‡เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบžเบฐเบเบฒเบเบฒเบกเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเปƒเบ™เบกเบฑเบ™เบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”, เปเบฅเบฐเบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเบฎเบนเป‰เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบก, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบฅเบตเปˆเบกเป€เบšเบดเปˆเบ‡ analogues. .

เบเบฒเบ™เบ„เบปเป‰เบ™เบžเบปเบš

เบชเบดเปˆเบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เปเบ™เบฐเบ™เปเบฒเป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบ›เบฐเบชเบปเบšเบเบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบญเบ‡:

  1. เบ•เบดเบ”โ€‹เบ•เบฒเบกโ€‹เบเบงเบ”โ€‹เบเบฒ bloat เบ‚เบญเบ‡โ€‹เบ—เปˆเบฒเบ™โ€‹. เบญเบตเบ‡เบ•เบฒเบกเบ‚เปเป‰เบกเบนเบ™เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบก, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเปƒเบˆเบงเปˆเบฒ autovacuum เบ–เบทเบเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป„เบ”เป‰เบ”เบตเบ›เบฒเบ™เปƒเบ”.
  2. เบ›เบฑเบš AUTOVACUUM เป€เบžเบทเปˆเบญเบฎเบฑเบเบชเบฒเบเบฒเบ™เบšเบงเบกเบขเบนเปˆเปƒเบ™เบฅเบฐเบ”เบฑเบšเบ—เบตเปˆเบเบญเบกเบฎเบฑเบšเป„เบ”เป‰.
  3. เบ–เป‰เบฒ bloat เบเบฑเบ‡เป€เบ•เบตเบšเปƒเบซเบเปˆเปเบฅเบฐเบ—เปˆเบฒเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบญเบปเบฒเบŠเบฐเบ™เบฐเบกเบฑเบ™เป„เบ”เป‰เป‚เบ”เบเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ™เบญเบเบเปˆเบญเบ‡, เบขเปˆเบฒเบขเป‰เบฒเบ™เบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰เบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเบžเบฒเบเบ™เบญเบ. เบชเบดเปˆเบ‡เบ—เบตเปˆ เบชเบณ เบ„เบฑเบ™เปเบกเปˆเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบ—เบธเบเบขเปˆเบฒเบ‡เบ—เบตเปˆเบ”เบต.
  4. เบขเปˆเบฒเบขเป‰เบฒเบ™เบ—เบตเปˆเบˆเบฐเบ”เบฑเบ”เปเบ›เบ‡เบงเบดเบ—เบตเปเบเป‰เป„เบ‚เบžเบฒเบเบ™เบญเบเป€เบžเบทเปˆเบญเปƒเบซเป‰เป€เบซเบกเบฒเบฐเบชเบปเบกเบเบฑเบšเบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒ - เบšเบฒเบ‡เบ„เบฑเป‰เบ‡เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเปเบฅเบฐเบ‡เปˆเบฒเบเบเบงเปˆเบฒเบเบฒเบ™เบ›เปˆเบฝเบ™เบฅเบฐเบซเบฑเบ”เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป€เบญเบ‡.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™