ΠΡΡΠ΅ΠΊΡ ΡΠ°Π·Π΄ΡΠ²Π°Π½ΠΈΡ ΡΠ°Π±Π»ΠΈΡ ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ² (bloat) ΡΠΈΡΠΎΠΊΠΎ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΠΈ ΠΏΡΠΈΡΡΡΡΡΠ²ΡΠ΅Ρ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π² Postgres. ΠΡΡΡ ΡΠΏΠΎΡΠΎΠ±Ρ Π±ΠΎΡΡΠ±Ρ Ρ Π½ΠΈΠΌ βΠΈΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈβ Π²ΡΠΎΠ΄Π΅ VACUUM FULL ΠΈΠ»ΠΈ CLUSTER, Π½ΠΎ ΠΎΠ½ΠΈ Π±Π»ΠΎΠΊΠΈΡΡΡΡ ΡΠ°Π±Π»ΠΈΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ ΠΈ ΠΏΠΎΡΡΠΎΠΌΡ Π½Π΅ Π²ΡΠ΅Π³Π΄Π° ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Ρ.
Π ΡΡΠ°ΡΡΠ΅ Π±ΡΠ΄Π΅Ρ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΎΡΠΈΠΈ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ bloat, ΠΊΠ°ΠΊ Ρ Π½ΠΈΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π±ΠΎΡΠΎΡΡΡΡ, ΠΎ deferred constraints ΠΈ ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°Ρ
, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ½ΠΈ ΠΏΡΠΈΠ²Π½ΠΎΡΡΡ Π² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ pg_repack.
ΠΡΠ° ΡΡΠ°ΡΡΡ Π½Π°ΠΏΠΈΡΠ°Π½Π° Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅
ΠΠΎΡΠ΅ΠΌΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ bloat
Π ΠΎΡΠ½ΠΎΠ²Π΅ Postgres Π»Π΅ΠΆΠΈΡ ΠΌΠ½ΠΎΠ³ΠΎΠ²Π΅ΡΡΠΈΠΎΠ½Π½Π°Ρ ΠΌΠΎΠ΄Π΅Π»Ρ (
ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ Π²ΡΠ΅ ΡΡΠΈ Π²Π΅ΡΡΠΈΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Ρ ΡΠ°Π½ΠΈΡΡ. Postgres ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ ΠΏΠ°ΠΌΡΡΡΡ ΠΏΠΎΡΡΡΠ°Π½ΠΈΡΠ½ΠΎ ΠΈ ΡΡΡΠ°Π½ΠΈΡΠ° β ΡΡΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΡΠΌ Π΄Π°Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΈΡΠ°ΡΡ Ρ Π΄ΠΈΡΠΊΠ° Π»ΠΈΠ±ΠΎ Π·Π°ΠΏΠΈΡΠ°ΡΡ. ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ½ΡΡΡ ΠΊΠ°ΠΊ ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ.
ΠΠΎΠΏΡΡΡΠΈΠΌ, Ρ Π½Π°Ρ Π΅ΡΡΡ ΡΠ°Π±Π»ΠΈΡΠ°, Π² ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π·Π°ΠΏΠΈΡΠ΅ΠΉ. Π ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»Π°, Π³Π΄Π΅ Ρ ΡΠ°Π½ΠΈΡΡΡ ΡΠ°Π±Π»ΠΈΡΠ°, ΠΏΠΎΡΠ²ΠΈΠ»ΠΈΡΡ Π½ΠΎΠ²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅. ΠΡΠΎ ΠΆΠΈΠ²ΡΠ΅ Π²Π΅ΡΡΠΈΠΈ ΡΡΡΠΎΠΊ, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΡΡΡΠΏΠ½Ρ Π΄ΡΡΠ³ΠΈΠΌ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΠΌ ΠΏΠΎΡΠ»Π΅ ΠΊΠΎΠΌΠΌΠΈΡΠ° (Π΄Π»Ρ ΠΏΡΠΎΡΡΠΎΡΡ Π±ΡΠ΄Π΅ΠΌ ΠΏΠΎΠ»Π°Π³Π°ΡΡ, ΡΡΠΎ ΡΡΠΎΠ²Π΅Π½Ρ ΠΈΠ·ΠΎΠ»ΡΡΠΈΠΈ Read Committed).
ΠΠ°ΡΠ΅ΠΌ ΠΌΡ ΠΎΠ±Π½ΠΎΠ²ΠΈΠ»ΠΈ ΠΎΠ΄Π½Ρ ΠΈΠ· Π·Π°ΠΏΠΈΡΠ΅ΠΉ ΠΈ ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ ΠΏΠΎΠΌΠ΅ΡΠΈΠ»ΠΈ ΡΡΠ°ΡΡΡ Π²Π΅ΡΡΠΈΡ ΠΊΠ°ΠΊ Π½Π΅Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΡ.
Π¨Π°Π³ Π·Π° ΡΠ°Π³ΠΎΠΌ, ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ ΠΈ ΡΠ΄Π°Π»ΡΡ Π²Π΅ΡΡΠΈΠΈ ΡΡΡΠΎΠΊ, ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ ΡΡΡΠ°Π½ΠΈΡΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° Π΄Π°Π½Π½ΡΡ
β ΡΡΠΎ βΠΌΡΡΠΎΡβ. ΠΡΠΈ Π΄Π°Π½Π½ΡΠ΅ Π½Π΅ Π²ΠΈΠ΄Π½Ρ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ.
Π Postgres ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌ
Π’Π°ΠΊ Π² Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π² ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΠ°Π±Π»ΠΈΡΠ° Π±ΡΠ΄Π΅Ρ ΡΠΎΡΡΠΎΡΡΡ ΠΈΠ· ΡΠ΅ΡΡΡΡΡ ΡΡΡΠ°Π½ΠΈΡ, Π½ΠΎ ΠΆΠΈΠ²ΡΡ Π΄Π°Π½Π½ΡΡ Π² Π½Π΅ΠΉ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅, ΠΏΡΠΈ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠΈ ΠΊ ΡΠ°Π±Π»ΠΈΡΠ΅ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ Π²ΡΡΠΈΡΡΠ²Π°ΡΡ Π³ΠΎΡΠ°Π·Π΄ΠΎ Π±ΠΎΠ»ΡΡΠ΅ Π΄Π°Π½Π½ΡΡ , ΡΠ΅ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ.
ΠΠ°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΡΠ΅ΠΉΡΠ°Ρ VACUUM ΡΠ΄Π°Π»ΠΈΡ Π²ΡΠ΅ Π½Π΅Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΠ΅ Π²Π΅ΡΡΠΈΠΈ ΡΡΡΠΎΠΊ, ΡΠΈΡΡΠ°ΡΠΈΡ Π½Π΅ ΡΠ»ΡΡΡΠΈΡΡΡ ΠΊΠ°ΡΠ΄ΠΈΠ½Π°Π»ΡΠ½ΠΎ. Π£ Π½Π°Ρ ΠΏΠΎΡΠ²ΠΈΡΡΡ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠ΅ ΠΌΠ΅ΡΡΠΎ Π² ΡΡΡΠ°Π½ΠΈΡΠ°Ρ
ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΡΠ΅Π»ΡΠ΅ ΡΡΡΠ°Π½ΠΈΡΡ Π΄Π»Ρ Π½ΠΎΠ²ΡΡ
ΡΡΡΠΎΠΊ, Π½ΠΎ ΠΌΡ ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ Π±ΡΠ΄Π΅ΠΌ Π²ΡΡΠΈΡΡΠ²Π°ΡΡ Π±ΠΎΠ»ΡΡΠ΅ Π΄Π°Π½Π½ΡΡ
, ΡΠ΅ΠΌ Π½ΡΠΆΠ½ΠΎ.
ΠΡΡΠ°ΡΠΈ, Π΅ΡΠ»ΠΈ Π±Ρ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΏΡΡΡΠ°Ρ ΡΡΡΠ°Π½ΠΈΡΠ° (Π²ΡΠΎΡΠ°Ρ Π² Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅) ΠΎΠΊΠ°Π·Π°Π»Π°ΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ ΡΠ°ΠΉΠ»Π°, ΡΠΎ VACUUM ΡΠΌΠΎΠ³ Π±Ρ Π΅Ρ ΠΎΠ±ΡΠ΅Π·Π°ΡΡ. ΠΠΎ ΡΠ΅ΠΉΡΠ°Ρ ΠΎΠ½Π° Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ ΠΏΠΎΡΠ΅ΡΠ΅Π΄ΠΈΠ½Π΅, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ΄Π΅Π»Π°ΡΡ Ρ Π½Π΅ΠΉ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΡΡΡ.
ΠΠΎΠ³Π΄Π° ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ°ΠΊΠΈΡ
ΠΏΡΡΡΡΡ
ΠΈΠ»ΠΈ ΡΠΈΠ»ΡΠ½ΠΎ ΡΠ°Π·ΡΡΠΆΠ΅Π½Π½ΡΡ
ΡΡΡΠ°Π½ΠΈΡ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π±ΠΎΠ»ΡΡΠΈΠΌ, ΡΡΠΎ ΠΈ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ bloat, ΡΡΠΎ Π½Π°ΡΠΈΠ½Π°Π΅Ρ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡΡΡ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ.
ΠΡΡ ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠ΅ Π²ΡΡΠ΅ β ΠΌΠ΅Ρ Π°Π½ΠΈΠΊΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡ bloat Π² ΡΠ°Π±Π»ΠΈΡΠ°Ρ . Π ΠΈΠ½Π΄Π΅ΠΊΡΠ°Ρ ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊ ΠΆΠ΅.
Π Π΅ΡΡΡ Π»ΠΈ Ρ ΠΌΠ΅Π½Ρ bloat?
ΠΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ², ΡΡΠΎΠ±Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, Π΅ΡΡΡ Π»ΠΈ Ρ Π²Π°Ρ bloat. ΠΠ΄Π΅Ρ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ β ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Π½ΡΡΡΠ΅Π½Π½Π΅ΠΉ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ Postgres, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡΡΡ ΠΏΡΠΈΠ±Π»ΠΈΠ·ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π΅ ΡΡΡΠΎΠΊ Π² ΡΠ°Π±Π»ΠΈΡΠ°Ρ
, ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π΅ βΠΆΠΈΠ²ΡΡ
β ΡΡΡΠΎΠΊ ΠΈ ΠΏΡ. Π ΠΈΠ½ΡΠ΅ΡΠ½Π΅ΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π²Π°ΡΠΈΠ°ΡΠΈΠΉ ΡΠΆΠ΅ Π³ΠΎΡΠΎΠ²ΡΡ
ΡΠΊΡΠΈΠΏΡΠΎΠ². ΠΡ Π·Π° ΠΎΡΠ½ΠΎΠ²Ρ Π²Π·ΡΠ»ΠΈ
ΠΡΡΠ³ΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± β ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅
ΠΠ΅Π±ΠΎΠ»ΡΡΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ bloat, Π΄ΠΎ 20%, ΠΌΡ ΡΡΠΈΡΠ°Π΅ΠΌ ΠΏΡΠΈΠ΅ΠΌΠ»Π΅ΠΌΡΠΌ. ΠΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΈΡΠ°ΡΡ ΠΊΠ°ΠΊ Π°Π½Π°Π»ΠΎΠ³ fillfactor Π΄Π»Ρ
Π‘ΠΏΠΎΡΠΎΠ±Ρ Π±ΠΎΡΡΠ±Ρ Ρ bloat
Π Postgres Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² Π±ΠΎΡΡΠ±Ρ Ρ bloat βΠΈΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈβ, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½ΠΈ Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ Π²ΡΠ΅Π³Π΄Π° ΠΈ Π½Π΅ Π²ΡΠ΅ΠΌ ΠΌΠΎΠ³ΡΡ ΠΏΠΎΠ΄ΠΎΠΉΡΠΈ.
ΠΠ°ΡΡΡΠΎΠΈΡΡ AUTOVACUUM, ΡΡΠΎΠ±Ρ bloat Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π». Π Π΅ΡΠ»ΠΈ ΡΠΎΡΠ½Π΅Π΅, ΡΡΠΎΠ±Ρ ΠΎΠ½ Π΄Π΅ΡΠΆΠ°Π»ΡΡ Π½Π° ΠΏΡΠΈΠ΅ΠΌΠ»Π΅ΠΌΠΎΠΌ Π΄Π»Ρ Π²Π°Ρ ΡΡΠΎΠ²Π½Π΅. ΠΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΎ ΡΡΠΎ βΠΊΠ°ΠΏΠΈΡΠ°Π½ΡΠΊΠΈΠΉβ ΡΠΎΠ²Π΅Ρ, Π½ΠΎ Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΡΡΠΈ ΡΡΠΎΠ³ΠΎ Π½Π΅ Π²ΡΠ΅Π³Π΄Π° Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΡΡΠΈΠ³Π½ΡΡΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Ρ Π²Π°Ρ ΠΈΠ΄ΡΡ Π°ΠΊΡΠΈΠ²Π½Π°Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Ρ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΡΡ Π΅ΠΌΡ Π΄Π°Π½Π½ΡΡ ΠΈΠ»ΠΈ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΊΠ°ΠΊΠ°Ρ-ΡΠΎ ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ Π΄Π°Π½Π½ΡΡ . ΠΠ°ΠΊ ΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅, Π²Π°Ρ ΠΏΡΠΎΡΠΈΠ»Ρ Π½Π°Π³ΡΡΠ·ΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°ΡΡΠΎ ΠΌΠ΅Π½ΡΡΡΡΡ ΠΈ, ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΠΎΠ½ Π±ΡΠ²Π°Π΅Ρ ΡΠ°Π·Π½ΡΠΌ Π΄Π»Ρ ΡΠ°Π·Π½ΡΡ ΡΠ°Π±Π»ΠΈΡ. ΠΠ½Π°ΡΠΈΡ, Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π½Π° ΠΎΠΏΠ΅ΡΠ΅ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠ΄ΡΡΡΠ°ΠΈΠ²Π°ΡΡ AUTOVACUUM ΠΏΠΎΠ΄ ΠΌΠ΅Π½ΡΡΡΠΈΠΉΡΡ ΠΏΡΠΎΡΠΈΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ. ΠΠΎ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ Π½Π΅ΠΏΡΠΎΡΡΠΎ.
ΠΡΡΠ³ΠΎΠΉ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΠ½Π½ΠΎΠΉ ΠΏΡΠΈΡΠΈΠ½ΠΎΠΉ ΡΠΎΠ³ΠΎ, ΡΡΠΎ AUTOVACUUM Π½Π΅ ΡΡΠΏΠ΅Π²Π°Π΅Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΡΠ°Π±Π»ΠΈΡΡ, ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π°Π»ΠΈΡΠΈΠ΅ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π΅ΠΌΡ Π²ΡΡΠΈΡΠ°ΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ·-Π·Π° ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΎΠ½ΠΈ Π΄ΠΎΡΡΡΠΏΠ½Ρ ΡΡΠΈΠΌ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΠΌ. Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡ Π·Π΄Π΅ΡΡ ΡΠ°ΠΊΠΆΠ΅ ΠΎΡΠ΅Π²ΠΈΠ΄Π½Π° β ΠΈΠ·Π±Π°Π²ΠΈΡΡΡΡ ΠΎΡ βΠ²ΠΈΡΡΡΠΈΡ β ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π²ΡΠ΅ΠΌΡ Π°ΠΊΡΠΈΠ²Π½ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ. ΠΠΎ Π΅ΡΠ»ΠΈ Π½Π°Π³ΡΡΠ·ΠΊΠ° Π½Π° Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ β ΡΡΠΎ Π³ΠΈΠ±ΡΠΈΠ΄ OLAP ΠΈ OLTP, ΡΠΎ Ρ Π²Π°Ρ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΊΠ°ΠΊ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΠ°ΡΡΡΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ ΠΈ ΠΊΠΎΡΠΎΡΠΊΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ², ΡΠ°ΠΊ ΠΈ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ β Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ ΠΎΡΡΠ΅ΡΠ°. Π ΡΠ°ΠΊΠΎΠΉ ΡΠΈΡΡΠ°ΡΠΈΠΈ ΡΡΠΎΠΈΡ Π·Π°Π΄ΡΠΌΠ°ΡΡΡΡ ΠΎ ΡΠ°Π·Π½Π΅ΡΠ΅Π½ΠΈΠΈ Π½Π°Π³ΡΡΠ·ΠΊΠΈ Π½Π° ΡΠ°Π·Π½ΡΠ΅ Π±Π°Π·Ρ, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΠΏΡΠΎΠ²Π΅ΡΡΠΈ Π±ΠΎΠ»Π΅Π΅ ΡΠΎΠ½ΠΊΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΡ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ .
ΠΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΈΠΌΠ΅Ρ β Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΠΏΡΠΎΡΠΈΠ»Ρ ΠΎΠ΄Π½ΠΎΡΠΎΠ΄Π½ΡΠΉ, Π½ΠΎ ΠΠ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ ΠΏΠΎΠ΄ ΠΎΡΠ΅Π½Ρ Π²ΡΡΠΎΠΊΠΎΠΉ Π½Π°Π³ΡΡΠ·ΠΊΠΎΠΉ, ΡΠΎ Π΄Π°ΠΆΠ΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ Π°Π³ΡΠ΅ΡΡΠΈΠ²Π½ΡΠΉ AUTOVACUUM ΠΌΠΎΠΆΠ΅Ρ Π½Π΅ ΡΠΏΡΠ°Π²Π»ΡΡΡΡΡ, ΠΈ bloat Π±ΡΠ΄Π΅Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡ. ΠΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ (Π²Π΅ΡΡΠΈΠΊΠ°Π»ΡΠ½ΠΎΠ΅ Π»ΠΈΠ±ΠΎ Π³ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»ΡΠ½ΠΎΠ΅) β Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅.
ΠΠ°ΠΊ ΠΆΠ΅ Π±ΡΡΡ Π² ΡΠΈΡΡΠ°ΡΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° AUTOVACUUM Π²Ρ Π½Π°ΡΡΡΠΎΠΈΠ»ΠΈ, Π½ΠΎ bloat ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ ΡΠ°ΡΡΠΈ.
ΠΠΎΠΌΠ°Π½Π΄Π° VACUUM FULL ΠΏΠ΅ΡΠ΅ΡΡΡΠ°ΠΈΠ²Π°Π΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠ°Π±Π»ΠΈΡ ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ² ΠΈ ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π² Π½ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅. ΠΠ»Ρ ΡΡΡΡΠ°Π½Π΅Π½ΠΈΡ bloat ΠΎΠ½Π° ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΈΠ΄Π΅Π°Π»ΡΠ½ΠΎ, Π½ΠΎ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π°Ρ Π²Π°ΡΡΠ²Π°Π΅ΡΡΡ ΡΠΊΡΠΊΠ»ΡΠ·ΠΈΠ²Π½Π°Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π½Π° ΡΠ°Π±Π»ΠΈΡΡ (AccessExclusiveLock), ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π·Π°ΠΏΡΠΎΡΡ ΠΊ ΡΡΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΠ΅, Π΄Π°ΠΆΠ΅ select-Ρ. ΠΡΠ»ΠΈ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡΡ ΡΠ΅Π±Π΅ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΡ Π²Π°ΡΠ΅Π³ΠΎ ΡΠ΅ΡΠ²ΠΈΡΠ° ΠΈΠ»ΠΈ Π΅Π³ΠΎ ΡΠ°ΡΡΠΈ Π½Π° ΠΊΠ°ΠΊΠΎΠ΅-ΡΠΎ Π²ΡΠ΅ΠΌΡ (ΠΎΡ Π΄Π΅ΡΡΡΠΊΠΎΠ² ΠΌΠΈΠ½ΡΡ Π΄ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΠ°ΡΠΎΠ² Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΠΠ ΠΈ Π²Π°ΡΠ΅Π³ΠΎ ΠΆΠ΅Π»Π΅Π·Π°), ΡΠΎ ΡΡΠΎΡ Π²Π°ΡΠΈΠ°Π½Ρ β Π»ΡΡΡΠΈΠΉ. ΠΡ, ΠΊ ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Π½Π΅ ΡΡΠΏΠ΅Π²Π°Π΅ΠΌ ΠΏΡΠΎΠ³Π½Π°ΡΡ VACUUM FULL Π·Π° Π²ΡΠ΅ΠΌΡ Π·Π°ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ maintenance, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ°ΠΊΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± Π½Π°ΠΌ Π½Π΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ.
ΠΠΎΠΌΠ°Π½Π΄Π° CLUSTER ΡΠ°ΠΊ ΠΆΠ΅ ΠΏΠ΅ΡΠ΅ΡΡΡΠ°ΠΈΠ²Π°Π΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠ°Π±Π»ΠΈΡ, ΠΊΠ°ΠΊ ΠΈ VACUUM FULL, ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΊΠ°Π·Π°ΡΡ ΠΈΠ½Π΄Π΅ΠΊΡ, ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ ΠΊΠΎΡΠΎΡΠΎΠΌΡ Π΄Π°Π½Π½ΡΠ΅ Π±ΡΠ΄ΡΡ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈ ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½Ρ Π½Π° Π΄ΠΈΡΠΊΠ΅ (Π½ΠΎ Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ Π΄Π»Ρ Π½ΠΎΠ²ΡΡ ΡΡΡΠΎΠΊ ΠΏΠΎΡΡΠ΄ΠΎΠΊ Π½Π΅ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅ΡΡΡ). Π ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΡ ΡΠΈΡΡΠ°ΡΠΈΡΡ ΡΡΠΎ Π½Π΅ΠΏΠ»ΠΎΡ Π°Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π΄Π»Ρ ΡΡΠ΄Π° Π·Π°ΠΏΡΠΎΡΠΎΠ² β Ρ ΡΡΠ΅Π½ΠΈΠ΅ΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ ΠΏΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΡ. ΠΠ΅Π΄ΠΎΡΡΠ°ΡΠΎΠΊ Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΡΠΎΡ ΠΆΠ΅, ΡΡΠΎ Ρ VACUUM FULL β ΠΎΠ½Π° Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΡΠ°Π±Π»ΠΈΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ.
ΠΠΎΠΌΠ°Π½Π΄Π° REINDEX ΠΏΠΎΡ
ΠΎΠΆΠ° Π½Π° Π΄Π²Π΅ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠ΅, Π½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅ΡΡΡΠΎΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΠΈΠ»ΠΈ Π²ΡΠ΅Ρ
ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ² ΡΠ°Π±Π»ΠΈΡΡ. ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΡΡΡ ΡΠ»Π°Π±Π΅Π΅: ShareLock Π½Π° ΡΠ°Π±Π»ΠΈΡΡ (ΠΌΠ΅ΡΠ°Π΅Ρ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΡΠΌ, Π½ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ select) ΠΈ AccessExclusiveLock Π½Π° ΠΏΠ΅ΡΠ΅ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΡΠΉ ΠΈΠ½Π΄Π΅ΠΊΡ (Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ Π·Π°ΠΏΡΠΎΡΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΡΠΎΠ³ΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠ°). ΠΠ΄Π½Π°ΠΊΠΎ Π² 12-ΠΉ Π²Π΅ΡΡΠΈΠΈ Postgres ΠΏΠΎΡΠ²ΠΈΠ»ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ
Π Π±ΠΎΠ»Π΅Π΅ ΡΠ°Π½Π½ΠΈΡ
Π²Π΅ΡΡΠΈΡΡ
Postgres ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±ΠΈΡΡΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°, ΡΡ
ΠΎΠΆΠ΅Π³ΠΎ Ρ REINDEX CONCURRENTLY, Ρ ΠΏΠΎΠΌΠΎΡΡΡ
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π΅ΡΠ»ΠΈ Π΄Π»Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ² Π΅ΡΡΡ ΡΠΏΠΎΡΠΎΠ±Ρ Π΄Π»Ρ ΡΡΡΡΠ°Π½Π΅Π½ΠΈΡ bloat βΠ½Π° Π³ΠΎΡΡΡΡΡβ, ΡΠΎ Π΄Π»Ρ ΡΠ°Π±Π»ΠΈΡ ΠΈΡ
Π½Π΅Ρ. Π’ΡΡ Π² Π΄Π΅Π»ΠΎ Π²ΡΡΡΠΏΠ°ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ Π²Π½Π΅ΡΠ½ΠΈΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ:
ΠΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ pg_repack
ΠΠΎΠΏΡΡΡΠΈΠΌ, Ρ Π½Π°Ρ Π΅ΡΡΡ Π²ΠΏΠΎΠ»Π½Π΅ ΡΠ΅Π±Π΅ ΠΎΠ±ΡΡΠ½Π°Ρ ΡΠ°Π±Π»ΠΈΡΠ° β Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠ°ΠΌΠΈ, ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡΠΌΠΈ ΠΈ, ΠΊ ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Ρ bloat. ΠΠ΅ΡΠ²ΡΠΌ ΡΠ°Π³ΠΎΠΌ pg_repack ΡΠΎΠ·Π΄Π°ΡΡ Π»ΠΎΠ³-ΡΠ°Π±Π»ΠΈΡΡ, ΡΡΠΎΠ±Ρ Ρ
ΡΠ°Π½ΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΎΠ±ΠΎ Π²ΡΠ΅Ρ
ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡΡ
Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ. Π’ΡΠΈΠ³Π³Π΅Ρ Π±ΡΠ΄Π΅Ρ ΡΠ΅ΠΏΠ»ΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π½Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ insert, update ΠΈ delete. ΠΠ°ΡΠ΅ΠΌ ΡΠΎΠ·Π΄Π°ΡΡΡΡ ΡΠ°Π±Π»ΠΈΡΠ°, Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½Π°Ρ ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎ ΡΡΡΡΠΊΡΡΡΠ΅, Π½ΠΎ Π±Π΅Π· ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ² ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ, ΡΡΠΎΠ±Ρ Π½Π΅ Π·Π°ΠΌΠ΅Π΄Π»ΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡ Π²ΡΡΠ°Π²ΠΊΠΈ Π΄Π°Π½Π½ΡΡ
.
ΠΠ°Π»Π΅Π΅ pg_repack ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΡ Π² Π½ΠΎΠ²ΡΡ ΡΠ°Π±Π»ΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· ΡΡΠ°ΡΠΎΠΉ, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠΈΠ»ΡΡΡΡΡ Π²ΡΠ΅ Π½Π΅Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΡΠΎΠΊΠΈ, Π° Π·Π°ΡΠ΅ΠΌ ΡΠΎΠ·Π΄Π°ΡΡ ΠΈΠ½Π΄Π΅ΠΊΡΡ Π΄Π»Ρ Π½ΠΎΠ²ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ. ΠΠ° Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π²ΡΠ΅Ρ ΡΡΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π² Π»ΠΎΠ³-ΡΠ°Π±Π»ΠΈΡΠ΅ Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°ΡΡΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ.
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ°Π³ β ΠΏΠ΅ΡΠ΅Π½Π΅ΡΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² Π½ΠΎΠ²ΡΡ ΡΠ°Π±Π»ΠΈΡΡ. ΠΠ΅ΡΠ΅Π½ΠΎΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ, ΠΈ ΠΊΠΎΠ³Π΄Π° Π² Π»ΠΎΠ³-ΡΠ°Π±Π»ΠΈΡΠ΅ ΠΎΡΡΠ°ΡΡΡΡ ΠΌΠ΅Π½Π΅Π΅ 20 Π·Π°ΠΏΠΈΡΠ΅ΠΉ, pg_repack Π·Π°Ρ Π²Π°ΡΡΠ²Π°Π΅Ρ ΡΡΡΠΎΠ³ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ, ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΈ ΠΏΠΎΠ΄ΠΌΠ΅Π½ΡΠ΅Ρ ΡΡΠ°ΡΡΡ ΡΠ°Π±Π»ΠΈΡΡ Π½Π° Π½ΠΎΠ²ΡΡ Π² ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ ΡΠ°Π±Π»ΠΈΡΠ°Ρ Postgres. ΠΡΠΎ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΈ ΠΎΡΠ΅Π½Ρ ΠΊΠΎΡΠΎΡΠΊΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΠΊΠΎΠ³Π΄Π° Π²Ρ Π½Π΅ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΡΠ°Π±Π»ΠΈΡΠ΅ΠΉ. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΡΡΠ°ΡΠ°Ρ ΡΠ°Π±Π»ΠΈΡΠ° ΠΈ ΡΠ°Π±Π»ΠΈΡΠ° Ρ Π»ΠΎΠ³Π°ΠΌΠΈ ΡΠ΄Π°Π»ΡΡΡΡΡ ΠΈ Π² ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅ΡΡΡ ΠΌΠ΅ΡΡΠΎ. ΠΡΠΎΡΠ΅ΡΡ Π·Π°Π²Π΅ΡΡΡΠ½.
Π ΡΠ΅ΠΎΡΠΈΠΈ Π²ΡΡ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΎΡΠ»ΠΈΡΠ½ΠΎ, ΡΡΠΎ ΠΆΠ΅ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅? ΠΡ ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π»ΠΈ pg_repack Π±Π΅Π· Π½Π°Π³ΡΡΠ·ΠΊΠΈ ΠΈ ΠΏΠΎΠ΄ Π½Π°Π³ΡΡΠ·ΠΊΠΎΠΉ, ΠΏΡΠΎΠ²Π΅ΡΠΈΠ»ΠΈ Π΅Π³ΠΎ ΡΠ°Π±ΠΎΡΡ Π² ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠ΅ΠΆΠ΄Π΅Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ (ΠΏΡΠΎΡΠ΅ Π³ΠΎΠ²ΠΎΡΡ, ΠΏΠΎ Ctrl+C). ΠΡΠ΅ ΡΠ΅ΡΡΡ Π±ΡΠ»ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΡΠΌΠΈ.
ΠΡ ΠΎΡΠΏΡΠ°Π²ΠΈΠ»ΠΈΡΡ Π½Π° ΠΏΡΠΎΠ΄ β ΠΈ ΡΡΡ Π²ΡΡ ΠΏΠΎΡΠ»ΠΎ Π½Π΅ ΡΠ°ΠΊ, ΠΊΠ°ΠΊ ΠΌΡ ΠΎΠΆΠΈΠ΄Π°Π»ΠΈ.
ΠΠ΅ΡΠ²ΡΠΉ Π±Π»ΠΈΠ½ Π½Π° ΠΏΡΠΎΠ΄Π΅
ΠΠ° ΠΏΠ΅ΡΠ²ΠΎΠΌ ΠΆΠ΅ ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅ ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ ΠΎΡΠΈΠ±ΠΊΡ ΠΎ Π½Π°ΡΡΡΠ΅Π½ΠΈΠΈ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ:
$ ./pg_repack -t tablename -o id
INFO: repacking table "tablename"
ERROR: query failed:
ERROR: duplicate key value violates unique constraint "index_16508"
DETAIL: Key (id, index)=(100500, 42) already exists.
ΠΡΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π»ΠΎ Π°Π²ΡΠΎΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π½Π°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ index_16508 β Π΅Π³ΠΎ ΡΠΎΠ·Π΄Π°Π» pg_repack. ΠΠΎ Π°ΡΡΠΈΠ±ΡΡΠ°ΠΌ, Π²Ρ
ΠΎΠ΄ΡΡΠΈΠΌ Π² Π΅Π³ΠΎ ΡΠΎΡΡΠ°Π², ΠΌΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ»ΠΈ βΠ½Π°ΡΠ΅β ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π΅ΠΌΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ. ΠΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΡΠΎ Π½Π΅ ΡΠΎΠ²ΡΠ΅ΠΌ ΠΎΠ±ΡΡΠ½ΠΎΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅, Π° ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ (
Deferred constraints: Π·Π°ΡΠ΅ΠΌ Π½ΡΠΆΠ½Ρ ΠΈ ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°ΡΡ
ΠΠ΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΎΡΠΈΠΈ ΠΎ deferred-ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡΡ
.
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΎΡΡΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ: Ρ Π½Π°Ρ Π΅ΡΡΡ ΡΠ°Π±Π»ΠΈΡΠ°-ΡΠΏΡΠ°Π²ΠΎΡΠ½ΠΈΠΊ Π°Π²ΡΠΎΠΌΠΎΠ±ΠΈΠ»Π΅ΠΉ Ρ Π΄Π²ΡΠΌΡ Π°ΡΡΠΈΠ±ΡΡΠ°ΠΌΠΈ β Π½Π°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈ ΠΏΠΎΡΡΠ΄ΠΊΠΎΠΌ Π°Π²ΡΠΎΠΌΠΎΠ±ΠΈΠ»Ρ Π² ΡΠΏΡΠ°Π²ΠΎΡΠ½ΠΈΠΊΠ΅.
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β. Π ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΡΡΠΎ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ βΠΎΠ±ΠΌΠ΅Π½ΠΎΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π΄Π²ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠ΅ΡΠ΅Π· ΡΡΠ΅ΡΡΡβ. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΠΊ ΡΡΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° β Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ update.
ΠΠ°ΡΠΈΠ°Π½Ρ Π²ΡΠΎΡΠΎΠΉ: ΠΏΠ΅ΡΠ΅ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°Π±Π»ΠΈΡΡ, ΡΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΡΠ΄ΠΊΠ° ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ Ρ ΠΏΠ»Π°Π²Π°ΡΡΠ΅ΠΉ ΡΠΎΡΠΊΠΎΠΉ Π²ΠΌΠ΅ΡΡΠΎ ΡΠ΅Π»ΡΡ ΡΠΈΡΠ΅Π». Π’ΠΎΠ³Π΄Π° ΠΏΡΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Ρ 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 ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΡΠΈ ΡΡΠΎΠ²Π½Ρ Π³ΡΠ°Π½ΡΠ»ΡΡΠ½ΠΎΡΡΠΈ ΠΈΡ
ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ: ΡΡΠΎΠ²Π΅Π½Ρ ΡΡΡΠΎΠΊΠΈ, ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΠΈ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ.
ΠΡΡΠΎΡΠ½ΠΈΠΊ:
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 ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠ°. ΠΠΎ Π² ΡΠ»ΡΡΠ°Π΅ Ρ ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π½ΡΠΌ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½Π΅ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΈΠ½Π΄Π΅ΠΊΡ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π½ΡΠΌ ΠΈ Π²ΡΠ΅Π³Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ Π² ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ sql-ΠΊΠΎΠΌΠ°Π½Π΄Ρ.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² βΠΎΡΠ»ΠΎΠΆΠ΅Π½Π½ΠΎΡΡΠΈβ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ: Π² ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΠ΅ ΠΎΠ½Π° ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π² ΠΌΠΎΠΌΠ΅Π½Ρ ΠΊΠΎΠΌΠΌΠΈΡΠ°, Π° Π² Π½ΠΎΠ²ΠΎΠΉ β Π² ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ sql-ΠΊΠΎΠΌΠ°Π½Π΄Ρ. ΠΠ½Π°ΡΠΈΡ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ»ΠΈΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ Π² ΠΎΠ±ΠΎΠΈΡ ΡΠ»ΡΡΠ°ΡΡ : Π»ΠΈΠ±ΠΎ Π²ΡΠ΅Π³Π΄Π° ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π½ΠΎ, Π»ΠΈΠ±ΠΎ Π²ΡΠ΅Π³Π΄Π° ΡΡΠ°Π·Ρ ΠΆΠ΅.
ΠΡΠ°ΠΊ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠ΄Π΅ΠΈ Ρ Π½Π°Ρ Π±ΡΠ»ΠΈ.
Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΈΠ½Π΄Π΅ΠΊΡ, Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠΉ deferred
ΠΠ΅ΡΠ²Π°Ρ ΠΈΠ΄Π΅Ρ β Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΎΠ±Π΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ immediate. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΠΎΠ΄ΠΈΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ false positive ΡΡΠ°Π±Π°ΡΡΠ²Π°Π½ΠΈΠΉ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ, Π½ΠΎ Π΅ΡΠ»ΠΈ ΠΈΡ Π±ΡΠ΄Π΅Ρ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ, ΡΠΎ ΡΡΠΎ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΡΡΠ°Π·ΠΈΡΡΡΡ Π½Π° ΡΠ°Π±ΠΎΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π΄Π»Ρ Π½ΠΈΡ ΡΠ°ΠΊΠΈΠ΅ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΡ β Π½ΠΎΡΠΌΠ°Π»ΡΠ½Π°Ρ ΡΠΈΡΡΠ°ΡΠΈΡ. ΠΠ½ΠΈ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠΎΠ³Π΄Π° Π΄Π²Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π½Π°ΡΠΈΠ½Π°ΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ, ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ Π²ΡΠΎΡΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π½Π΅ ΡΡΠΏΠ΅Π²Π°Π΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ ΡΠΆΠ΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ Π½Π° ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ²ΡΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ. Π ΡΠ°ΠΊΠΎΠΉ ΡΠΈΡΡΠ°ΡΠΈΠΈ ΡΠ΅ΡΠ²Π΅Ρ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Π²ΡΠΎΡΠΎΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΎΡΠΊΠ°Π·ΠΎΠΌ, Π° Π΅Π³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΎΡΠΊΠ°ΡΡΠ²Π°Π΅Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΈ Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ Π²ΠΈΠ΄ΠΆΠ΅Ρ. Π§ΡΡΡ ΠΏΠΎΠ·ΠΆΠ΅, ΠΊΠΎΠ³Π΄Π° ΠΏΠ΅ΡΠ²ΡΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π·Π°Π²Π΅ΡΡΠΈΡ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅, Π²ΡΠΎΡΠΎΠΉ ΠΏΠΎΠ»ΡΡΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΡΡΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½, ΠΈ ΡΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ²ΡΠΎΡΠΈΡΡ ΡΠ²ΠΎΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅.
Π§ΡΠΎΠ±Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π±ΡΠ»ΠΈ Π²ΡΠ΅Π³Π΄Π° Π² Π½Π΅ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅, ΠΌΡ ΡΠΎΠ·Π΄Π°Π»ΠΈ Π½ΠΎΠ²ΡΠΉ ΠΈΠ½Π΄Π΅ΠΊΡ, Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠΉ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠΌΡ ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π½ΠΎΠΌΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ:
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 ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π½ΠΈΠΌΠΈ. ΠΡ Π²ΡΠ±ΡΠ°Π»ΠΈ Π²ΡΠΎΡΠΎΠΉ.
ΠΠ°ΠΌΠ΅Π½ΠΈΡΡ ΠΈΠ½Π΄Π΅ΠΊΡΡ Π² Π½ΠΎΠ²ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΠ΅ Π½Π° ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΈΠ· ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ
Π¦Π΅Π»Ρ Π΄ΠΎΡΠ°Π±ΠΎΡΠΊΠΈ Π±ΡΠ»Π° ΠΎΡΠ΅Π²ΠΈΠ΄Π½Π° β Π΅ΡΠ»ΠΈ ΠΈΡΡ ΠΎΠ΄Π½Π°Ρ ΡΠ°Π±Π»ΠΈΡΠ° ΠΈΠΌΠ΅Π΅Ρ ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅, ΡΠΎ Π΄Π»Ρ Π½ΠΎΠ²ΠΎΠΉ Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠ°ΠΊΠΎΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅, Π° Π½Π΅ ΠΈΠ½Π΄Π΅ΠΊΡ.
Π§ΡΠΎΠ±Ρ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ Π½Π°ΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ, ΠΌΡ Π½Π°ΠΏΠΈΡΠ°Π»ΠΈ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠ΅ΡΡ:
- ΡΠ°Π±Π»ΠΈΡΠ° Ρ ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π½ΡΠΌ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΈ ΠΎΠ΄Π½ΠΎΠΉ Π·Π°ΠΏΠΈΡΡΡ;
- Π²ΡΡΠ°Π²Π»ΡΠ΅ΠΌ Π² ΡΠΈΠΊΠ»Π΅ Π΄Π°Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΡΡΡ Ρ ΠΈΠΌΠ΅ΡΡΠ΅ΠΉΡΡ Π·Π°ΠΏΠΈΡΡΡ;
- Π΄Π΅Π»Π°Π΅ΠΌ update β Π΄Π°Π½Π½ΡΠ΅ ΡΠΆΠ΅ Π½Π΅ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΡΡΡ;
- ΠΊΠΎΠΌΠΌΠΈΡΠΈΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ.
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 Π²ΡΠ΅Π³Π΄Π° ΠΏΠ°Π΄Π°Π»Π° Π½Π° ΠΏΠ΅ΡΠ²ΠΎΠΌ 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 Π·Π°ΠΏΠΈΡΠ΅ΠΉ, ΡΡΠΎ ΠΎΠ±ΡΡΡΠ½ΡΠ΅Ρ, ΠΏΠΎΡΠ΅ΠΌΡ Π½Π°ΡΠΈ ΡΠ΅ΡΡΡ ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΠ»ΠΈ ΡΡΠΏΠ΅ΡΠ½ΠΎ β ΠΎΠ½ΠΈ Π½Π΅ ΠΏΠΎΠΊΡΡΠ²Π°Π»ΠΈ ΡΠ»ΡΡΠ°Ρ βΡΡΡΠΊΠ° Π±Π°ΡΡΠ΅ΠΉβ. ΠΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ Π΄Π²Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ β insert ΠΈ update, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠΎΠ²Π½ΠΎ 500 ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ ΠΏΠΎ Π΄Π²Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π²ΡΠ΅Π³Π΄Π° ΠΏΠΎΠΌΠ΅ΡΠ°Π»ΠΈΡΡ Π² Π±Π°ΡΡ ΠΈ ΠΌΡ Π½Π΅ ΠΈΡΠΏΡΡΡΠ²Π°Π»ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌ. ΠΠΎΡΠ»Π΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ Π²ΡΠΎΡΠΎΠ³ΠΎ update Π½Π°ΡΠ° ΠΏΡΠ°Π²ΠΊΠ° ΠΏΠ΅ΡΠ΅ΡΡΠ°Π»Π° ΡΠ°Π±ΠΎΡΠ°ΡΡ:
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 ΡΠ°Π±ΠΎΡΠ°Π» ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΠΊ). ΠΠΎ Π΅ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° β ΠΌΡ ΡΠΎΠ·Π΄Π°ΡΠΌ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ, Π° ΡΡΠΎ, ΠΊΠ°ΠΊ Π±ΡΠ»ΠΎ ΡΠ°Π½Π΅Π΅ ΡΠΊΠ°Π·Π°Π½ΠΎ, β ΡΠ³ΡΠΎΠ·Π° Π΄Π»Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ bloat.
ΠΡΠΎΡΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ β Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΠΎΠ΅, Π½ΠΎ, Π½Π°Π²Π΅ΡΠ½ΠΎΠ΅, Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ΅: ΡΠΎΠ·Π΄Π°ΡΡ Π² Π»ΠΎΠ³-ΡΠ°Π±Π»ΠΈΡΠ΅ ΡΡΠΎΠ»Π±Π΅Ρ Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠΌ ΡΠΎΠΉ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ Π΄ΠΎΠ±Π°Π²ΠΈΠ»Π° Π΄Π°Π½Π½ΡΠ΅ Π² ΡΠ°Π±Π»ΠΈΡΡ. Π’ΠΎΠ³Π΄Π° ΠΏΡΠΈ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ Π΄Π°Π½Π½ΡΡ ΠΌΡ ΡΠΌΠΎΠΆΠ΅ΠΌ Π³ΡΡΠΏΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡ ΠΏΠΎ ΡΡΠΎΠΌΡ Π°ΡΡΠΈΠ±ΡΡΡ ΠΈ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°ΡΡ, ΡΡΠΎ ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π±ΡΠ΄ΡΡ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΡΡΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ. ΠΠ°ΡΡ Π±ΡΠ΄Π΅Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°ΡΡΡΡ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ (ΠΈΠ»ΠΈ ΠΎΠ΄Π½ΠΎΠΉ Π±ΠΎΠ»ΡΡΠΎΠΉ) ΠΈ Π΅Π³ΠΎ ΡΠ°Π·ΠΌΠ΅Ρ Π±ΡΠ΄Π΅Ρ Π²Π°ΡΡΠΈΡΠΎΠ²Π°ΡΡΡΡ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Π°Π½Π½ΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈ Π² ΡΡΠΈΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΡ . ΠΠ°ΠΆΠ½ΠΎ ΠΎΡΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π΄Π°Π½Π½ΡΠ΅ ΡΠ°Π·Π½ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ ΠΏΠΎΠΏΠ°Π΄Π°ΡΡ Π² Π»ΠΎΠ³-ΡΠ°Π±Π»ΠΈΡΡ Π² ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅, ΡΠΎ ΡΠΆΠ΅ Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΡΡΡ ΡΠΈΡΠ°ΡΡ Π΅Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΠΊΠ°ΠΊ ΡΡΠΎ Π±ΡΠ»ΠΎ ΡΠ°Π½ΡΡΠ΅. seqscan ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π·Π°ΠΏΡΠΎΡΠ΅ Ρ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΠ΅ΠΉ ΠΏΠΎ tx_id β ΡΡΠΎ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π΄ΠΎΡΠΎΠ³ΠΎ, Π½ΡΠΆΠ΅Π½ ΠΈΠ½Π΄Π΅ΠΊΡ, Π½ΠΎ ΠΈ ΠΎΠ½ Π·Π°ΠΌΠ΅Π΄Π»ΠΈΡ ΡΠ°Π±ΠΎΡΡ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΈΠ·-Π·Π° Π½Π°ΠΊΠ»Π°Π΄Π½ΡΡ ΡΠ°ΡΡ ΠΎΠ΄ΠΎΠ² Π½Π° Π΅Π³ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅. Π ΠΎΠ±ΡΠ΅ΠΌ, ΠΊΠ°ΠΊ Π²ΡΠ΅Π³Π΄Π° Π½ΡΠΆΠ½ΠΎ ΡΠ΅ΠΌ-ΡΠΎ ΠΆΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ.
ΠΡΠ°ΠΊ, ΠΌΡ ΡΠ΅ΡΠΈΠ»ΠΈ Π½Π°ΡΠ°ΡΡ Ρ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Π²Π°ΡΠΈΠ°Π½ΡΠ°, ΠΊΠ°ΠΊ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ. ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π±ΡΠ»ΠΎ ΠΏΠΎΠ½ΡΡΡ Π±ΡΠ΄Π΅Ρ Π»ΠΈ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ ΡΠ΅Π°Π»ΡΠ½ΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅Π½ΠΎΡ Π΄Π°Π½Π½ΡΡ ΠΈΠ· ΡΡΠ°ΡΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ Π² Π½ΠΎΠ²ΡΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΠ°ΠΊΠΆΠ΅ Π² ΠΎΠ΄Π½ΠΎΠΉ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ, ΡΠΎ Π²ΠΎΠΏΡΠΎΡ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π»ΡΡ Π² βΠ½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΡ ΡΠ²Π΅Π»ΠΈΡΠΈΠΌ ΡΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ?β ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π·Π°Π²ΠΈΡΠΈΡ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΠΎΡ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΡΠ°Π±Π»ΠΈΡΡ. ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π½ΠΎΠ²ΠΎΠΉ β ΠΎΡ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π½Π°ΠΊΠΎΠΏΠΈΡΡΡ Π² ΡΠ°Π±Π»ΠΈΡΠ΅ Π·Π° Π²ΡΠ΅ΠΌΡ ΠΏΠ΅ΡΠ΅Π»ΠΈΠ²ΠΊΠΈ Π΄Π°Π½Π½ΡΡ , Ρ.Π΅. ΠΎΡ ΠΈΠ½ΡΠ΅Π½ΡΠΈΠ²Π½ΠΎΡΡΠΈ Π½Π°Π³ΡΡΠ·ΠΊΠΈ. ΠΡΠΎΠ³ΠΎΠ½ pg_repack ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΠ» Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ Π½Π°Π³ΡΡΠ·ΠΊΠΈ Π½Π° ΡΠ΅ΡΠ²ΠΈΡ, ΠΈ ΠΎΠ±ΡΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π±ΡΠ» Π½Π΅ΡΠΎΠΏΠΎΡΡΠ°Π²ΠΈΠΌΠΎ ΠΌΠ°Π» ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΌ ΠΎΠ±ΡΠ΅ΠΌΠΎΠΌ ΡΠ°Π±Π»ΠΈΡΡ. ΠΡ ΡΠ΅ΡΠΈΠ»ΠΈ, ΡΡΠΎ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠ΅Π½Π΅Π±ΡΠ΅ΡΡ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ Π½ΠΎΠ²ΠΎΠΉ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ (Π΄Π»Ρ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ ΡΡΡΠ΅Π΄Π½Π΅Π½Π½ΠΎ ΡΡΠΎ 1Ρ ΠΈ 2-3 ΠΌΠΈΠ½ΡΡΡ).
ΠΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΡ Π±ΡΠ»ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½Ρ. ΠΠ°ΠΏΡΡΠΊ Π½Π° ΠΏΡΠΎΠ΄Π΅ ΡΠΎΠΆΠ΅. ΠΠ»Ρ Π½Π°Π³Π»ΡΠ΄Π½ΠΎΡΡΠΈ β ΠΊΠ°ΡΡΠΈΠ½ΠΊΠ° Ρ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π±Π°Π· ΠΏΠΎΡΠ»Π΅ ΠΏΡΠΎΠ³ΠΎΠ½Π°:
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π°Ρ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΡΡΡΡΠΎΠΈΠ»ΠΎ, ΡΠΎ ΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π²ΡΠΎΡΠΎΠ΅ ΠΌΡ Π½Π΅ ΡΡΠ°Π»ΠΈ, Π½ΠΎ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π΅Π³ΠΎ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΡ Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌΠΈ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ. ΠΠ°ΡΠΈ ΡΠ΅ΠΊΡΡΠ°Ρ Π΄ΠΎΡΠ°Π±ΠΎΡΠΊΠ°, ΠΊ ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, ΠΏΠΎΠΊΠ° Π΅ΡΠ΅ Π½Π΅ Π³ΠΎΡΠΎΠ²Π° ΠΊ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ ΡΠ΅ΡΠΈΠ»ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΡΠΎΠ»ΡΠΊΠΎ Ρ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΌΠΈ ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π½ΡΠΌΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡΠΌΠΈ, Π° Π΄Π»Ρ ΠΏΠΎΠ»Π½ΠΎΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°ΡΡΠ° Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΠΈ Π΄ΡΡΠ³ΠΈΡ
ΡΠΈΠΏΠΎΠ². ΠΠ°Π΄Π΅Π΅ΠΌΡΡ, ΡΡΠΎ ΡΠ΄Π°ΡΡΡΡ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ.
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ Π²Π°Ρ Π²ΠΎΠ·Π½ΠΈΠΊ Π²ΠΎΠΏΡΠΎΡ, Π·Π°ΡΠ΅ΠΌ ΠΌΡ Π²ΠΎΠΎΠ±ΡΠ΅ Π²Π²ΡΠ·Π°Π»ΠΈΡΡ Π² ΡΡΡ ΠΈΡΡΠΎΡΠΈΡ Ρ Π΄ΠΎΡΠ°Π±ΠΎΡΠΊΠΎΠΉ pg_repack, Π° Π½Π΅ ΡΡΠ°Π»ΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈ? Π ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΌΡ ΡΠΎΠΆΠ΅ Π΄ΡΠΌΠ°Π»ΠΈ ΠΎΠ± ΡΡΠΎΠΌ, Π½ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΎΠΏΡΡ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ°Π½Π΅Π΅, Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°Ρ Π±Π΅Π· ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π½ΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ, ΠΌΠΎΡΠΈΠ²ΠΈΡΠΎΠ²Π°Π» Π½Π° ΡΠΎ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ Π² ΡΡΡΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΈ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ Π΅Ρ. Π ΡΠΎΠΌΡ ΠΆΠ΅ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π΄ΡΡΠ³ΠΈΡ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ ΡΠ°ΠΊ ΠΆΠ΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π²ΡΠ΅ΠΌΡ Π½Π° ΠΏΡΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΡΠΎΠ², ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ ΡΠ΅ΡΠΈΠ»ΠΈ, ΡΡΠΎ ΡΠΏΠ΅ΡΠ²Π° ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π² Π½Π΅ΠΌ, ΠΈ Π΅ΡΠ»ΠΈ ΠΏΠΎΠΉΠΌΠ΅ΠΌ, ΡΡΠΎ Π½Π΅ ΡΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ Π·Π° ΡΠ°Π·ΡΠΌΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ, ΡΠΎ ΡΠΎΠ³Π΄Π° Π½Π°ΡΠ½Π΅ΠΌ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈ.
ΠΡΠ²ΠΎΠ΄Ρ
Π§ΡΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°ΡΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠΏΡΡΠ°:
- ΠΠΎΠ½ΠΈΡΠΎΡΡΡΠ΅ Π²Π°Ρ bloat. ΠΠ° ΠΎΡΠ½ΠΎΠ²Π΅ Π΄Π°Π½Π½ΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° Π²Ρ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ½ΡΡΡ, Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ Ρ ΠΎΡΠΎΡΠΎ Π½Π°ΡΡΡΠΎΠ΅Π½ autovacuum.
- ΠΠ°ΡΡΡΠ°ΠΈΠ²Π°ΠΉΡΠ΅ AUTOVACUUM, ΡΡΠΎΠ±Ρ Π΄Π΅ΡΠΆΠ°ΡΡ bloat Π½Π° Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΎΠΌ ΡΡΠΎΠ²Π½Π΅.
- ΠΡΠ»ΠΈ Π²ΡΡ ΠΆΠ΅ bloat ΡΠ°ΡΡΠ΅Ρ ΠΈ Π²Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΅Π³ΠΎ ΠΏΠΎΠ±ΠΎΡΠΎΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ΅Π΄ΡΡΠ² βΠΈΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈβ, Π½Π΅ Π±ΠΎΠΉΡΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²Π½Π΅ΡΠ½ΠΈΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ. ΠΠ»Π°Π²Π½ΠΎΠ΅ β Π²ΡΠ΅ Ρ ΠΎΡΠΎΡΠΎ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ.
- ΠΠ΅ Π±ΠΎΠΉΡΠ΅ΡΡ Π΄ΠΎΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Π²Π½Π΅ΡΠ½ΠΈΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ΄ ΡΠ²ΠΎΠΈ Π½ΡΠΆΠ΄Ρ β ΠΈΠ½ΠΎΠ³Π΄Π° ΡΡΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½Π΅Π΅ ΠΈ Π΄Π°ΠΆΠ΅ ΠΏΡΠΎΡΠ΅, ΡΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π²Π°ΡΠ΅Π³ΠΎ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com