ΠΡΠ΅ΠΊΡΡΡ ΠΎΡ ΡΠ°Π·Π΄ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ°Π±Π»ΠΈΡΠΈΡΠ΅ ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ΅ (bloat) Π΅ ΡΠΈΡΠΎΠΊΠΎ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΠΈ ΠΏΡΠΈΡΡΡΡΠ²Π° Π½Π΅ ΡΠ°ΠΌΠΎ Π² Postgres. ΠΠΌΠ° Π½Π°ΡΠΈΠ½ΠΈ Π΄Π° ΡΠ΅ ΡΠΏΡΠ°Π²ΠΈΡΠ΅ Ρ Π½Π΅Π³ΠΎ βΠΈΠ·Π²ΡΠ½ ΠΊΡΡΠΈΡΡΠ°β, ΠΊΠ°ΡΠΎ VACUUM FULL ΠΈΠ»ΠΈ CLUSTER, Π½ΠΎ ΡΠ΅ Π·Π°ΠΊΠ»ΡΡΠ²Π°Ρ ΠΌΠ°ΡΠΈΡΠ΅ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ°Π±ΠΎΡΠ° ΠΈ ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ Π½Π΅ Π²ΠΈΠ½Π°Π³ΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ.
Π‘ΡΠ°ΡΠΈΡΡΠ° ΡΠ΅ ΠΈΠΌΠ° Π½ΡΠΊΠ°ΠΊΠ²Π° ΡΠ΅ΠΎΡΠΈΡ Π·Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊ Π²ΡΠ·Π½ΠΈΠΊΠ²Π° ΡΠ°Π·Π΄ΡΠ²Π°Π½Π΅ΡΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ΅ ΡΠΏΡΠ°Π²ΠΈΡΠ΅ Ρ Π½Π΅Π³ΠΎ, Π·Π° ΠΎΡΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π½ΠΎΡΡΡ ΠΏΡΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΠ΅ΡΠΎ pg_repack.
Π’Π°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π°Π²Π° Π½Π°
ΠΠ°ΡΠΎ ΠΈΠΌΠ° ΠΏΠΎΠ΄ΡΠ²Π°Π½Π΅
Postgres Π΅ Π±Π°Π·ΠΈΡΠ°Π½ Π½Π° ΠΌΠΎΠ΄Π΅Π» Ρ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π²Π΅ΡΡΠΈΠΈ (
ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ Π²ΡΠΈΡΠΊΠΈ ΡΠ΅Π·ΠΈ Π²Π΅ΡΡΠΈΠΈ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΏΠ°Π·ΡΡ. Postgres ΡΠ°Π±ΠΎΡΠΈ Ρ ΠΏΠ°ΠΌΠ΅ΡΡΠ° ΡΡΡΠ°Π½ΠΈΡΠ° ΠΏΠΎ ΡΡΡΠ°Π½ΠΈΡΠ°, Π° ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ° Π΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΎΡΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΏΡΠΎΡΠ΅ΡΠ΅Π½ΠΈ ΠΎΡ Π΄ΠΈΡΠΊΠ° ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΠ°Π½ΠΈ. ΠΠ΅ΠΊΠ° Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΌΠ°Π»ΡΠΊ ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ ΠΊΠ°ΠΊ ΡΠ΅ ΡΠ»ΡΡΠ²Π° ΡΠΎΠ²Π°.
ΠΠ° ΠΊΠ°ΠΆΠ΅ΠΌ, ΡΠ΅ ΠΈΠΌΠ°ΠΌΠ΅ ΡΠ°Π±Π»ΠΈΡΠ°, ΠΊΡΠΌ ΠΊΠΎΡΡΠΎ ΡΠΌΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π·Π°ΠΏΠΈΡΠ°. ΠΡΡΠ²Π°ΡΠ° ΡΡΡΠ°Π½ΠΈΡΠ° Π½Π° ΡΠ°ΠΉΠ»Π°, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π° ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ°, ΠΈΠΌΠ° Π½ΠΎΠ²ΠΈ Π΄Π°Π½Π½ΠΈ. Π’ΠΎΠ²Π° ΡΠ° ΠΆΠΈΠ²ΠΈ Π²Π΅ΡΡΠΈΠΈ Π½Π° ΡΠ΅Π΄ΠΎΠ²Π΅, ΠΊΠΎΠΈΡΠΎ ΡΠ° Π΄ΠΎΡΡΡΠΏΠ½ΠΈ Π·Π° Π΄ΡΡΠ³ΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΡΠ»Π΅Π΄ Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½ΡΠ° (Π·Π° ΠΏΡΠΎΡΡΠΎΡΠ° ΡΠ΅ ΠΏΡΠΈΠ΅ΠΌΠ΅ΠΌ, ΡΠ΅ Π½ΠΈΠ²ΠΎΡΠΎ Π½Π° ΠΈΠ·ΠΎΠ»Π°ΡΠΈΡ Π΅ Read Committed).
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Ρ
ΠΌΠ΅ Π΅Π΄ΠΈΠ½ ΠΎΡ Π·Π°ΠΏΠΈΡΠΈΡΠ΅ ΠΈ ΠΏΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ ΠΌΠ°ΡΠΊΠΈΡΠ°Ρ
ΠΌΠ΅ ΡΡΠ°ΡΠ°ΡΠ° Π²Π΅ΡΡΠΈΡ ΠΊΠ°ΡΠΎ Π½Π΅Π°ΠΊΡΡΠ°Π»Π½Π°.
Π‘ΡΡΠΏΠΊΠ° ΠΏΠΎ ΡΡΡΠΏΠΊΠ°, Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°ΠΉΠΊΠΈ ΠΈ ΠΈΠ·ΡΡΠΈΠ²Π°ΠΉΠΊΠΈ Π²Π΅ΡΡΠΈΠΈ Π½Π° ΡΠ΅Π΄ΠΎΠ²Π΅, ΠΏΠΎΠ»ΡΡΠΈΡ
ΠΌΠ΅ ΡΡΡΠ°Π½ΠΈΡΠ°, Π² ΠΊΠΎΡΡΠΎ ΠΎΠΊΠΎΠ»ΠΎ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°ΡΠ° ΠΎΡ Π΄Π°Π½Π½ΠΈΡΠ΅ ΡΠ° βΠ±ΠΎΠΊΠ»ΡΠΊβ. Π’Π΅Π·ΠΈ Π΄Π°Π½Π½ΠΈ Π½Π΅ ΡΠ΅ Π²ΠΈΠΆΠ΄Π°Ρ ΠΎΡ Π½ΠΈΡΠΎ Π΅Π΄Π½Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ.
Postgres ΠΈΠΌΠ° ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΡΠΌ
Π’Π°ΠΊΠ° ΡΠ΅ Π² Π½Π°ΡΠΈΡ ΠΏΡΠΈΠΌΠ΅Ρ Π² Π΄Π°Π΄Π΅Π½ ΠΌΠΎΠΌΠ΅Π½Ρ ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΡΠ΅ ΡΠ΅ ΡΡΡΡΠΎΠΈ ΠΎΡ ΡΠ΅ΡΠΈΡΠΈ ΡΡΡΠ°Π½ΠΈΡΠΈ, Π½ΠΎ Π² Π½Π΅Ρ ΡΠ΅ ΠΈΠΌΠ° ΡΠ°ΠΌΠΎ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°ΡΠ° ΠΎΡ ΠΆΠΈΠ²ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ. Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ²Π° ΠΏΡΠΈ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΠ΅ΠΌ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ²Π΅ΡΠ΅ Π΄Π°Π½Π½ΠΈ ΠΎΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΠΎ.
ΠΠΎΡΠΈ Π°ΠΊΠΎ VACUUM ΡΠ΅Π³Π° ΠΏΡΠ΅ΠΌΠ°Ρ
Π½Π΅ Π²ΡΠΈΡΠΊΠΈ Π½Π΅ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΡΡΠΈ Π²Π΅ΡΡΠΈΠΈ Π½Π° ΡΠ΅Π΄ΠΎΠ²Π΅, ΡΠΈΡΡΠ°ΡΠΈΡΡΠ° Π½ΡΠΌΠ° Π΄Π° ΡΠ΅ ΠΏΠΎΠ΄ΠΎΠ±ΡΠΈ Π΄ΡΠ°ΠΌΠ°ΡΠΈΡΠ½ΠΎ. Π©Π΅ ΠΈΠΌΠ°ΠΌΠ΅ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎ ΠΌΡΡΡΠΎ Π² ΡΡΡΠ°Π½ΠΈΡΠΈ ΠΈΠ»ΠΈ Π΄ΠΎΡΠΈ ΡΠ΅Π»ΠΈ ΡΡΡΠ°Π½ΠΈΡΠΈ Π·Π° Π½ΠΎΠ²ΠΈ ΡΠ΅Π΄ΠΎΠ²Π΅, Π½ΠΎ ΠΏΠ°ΠΊ ΡΠ΅ ΡΠ΅ΡΠ΅ΠΌ ΠΏΠΎΠ²Π΅ΡΠ΅ Π΄Π°Π½Π½ΠΈ, ΠΎΡΠΊΠΎΠ»ΠΊΠΎΡΠΎ ΡΠ° Π½ΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈ.
ΠΠ΅ΠΆΠ΄Ρ Π΄ΡΡΠ³ΠΎΡΠΎ, Π°ΠΊΠΎ Π½Π°ΠΏΡΠ»Π½ΠΎ ΠΏΡΠ°Π·Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ° (Π²ΡΠΎΡΠ°ΡΠ° Π² Π½Π°ΡΠΈΡ ΠΏΡΠΈΠΌΠ΅Ρ) Π΅ Π² ΠΊΡΠ°Ρ Π½Π° ΡΠ°ΠΉΠ»Π°, ΡΠΎΠ³Π°Π²Π° VACUUM ΠΌΠΎΠΆΠ΅ Π΄Π° Ρ ΠΎΡΡΠ΅ΠΆΠ΅. ΠΠΎ ΡΠ΅Π³Π° ΡΡ Π΅ ΠΏΠΎ ΡΡΠ΅Π΄Π°ΡΠ°, ΡΠ°ΠΊΠ° ΡΠ΅ Π½ΠΈΡΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ Ρ Π½Π΅Ρ.
ΠΠΎΠ³Π°ΡΠΎ Π±ΡΠΎΡΡ Π½Π° ΡΠ°ΠΊΠΈΠ²Π° ΠΏΡΠ°Π·Π½ΠΈ ΠΈΠ»ΠΈ ΡΠΈΠ»Π½ΠΎ ΡΠ΅Π΄ΠΊΠΈ ΡΡΡΠ°Π½ΠΈΡΠΈ ΡΡΠ°Π½Π΅ Π³ΠΎΠ»ΡΠΌ, ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ Π½Π°ΡΠΈΡΠ° ΡΠ°Π·Π΄ΡΠ²Π°Π½Π΅, ΡΠΎΠ²Π° Π·Π°ΠΏΠΎΡΠ²Π° Π΄Π° Π²Π»ΠΈΡΠ΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ°.
ΠΡΠΈΡΠΊΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΎ ΠΏΠΎ-Π³ΠΎΡΠ΅ Π΅ ΠΌΠ΅Ρ Π°Π½ΠΈΠΊΠ°ΡΠ° Π½Π° ΠΏΠΎΡΠ²Π°ΡΠ° Π½Π° ΡΠ°Π·Π΄ΡΠ²Π°Π½Π΅ Π² ΡΠ°Π±Π»ΠΈΡΠΈΡΠ΅. Π ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ΅ ΡΠΎΠ²Π° ΡΠ΅ ΡΠ»ΡΡΠ²Π° ΠΏΠΎΡΡΠΈ ΠΏΠΎ ΡΡΡΠΈΡ Π½Π°ΡΠΈΠ½.
ΠΠΌΠ°ΠΌ Π»ΠΈ ΠΏΠΎΠ΄ΡΠ²Π°Π½Π΅?
ΠΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π½Π°ΡΠΈΠ½Π° Π΄Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΠ΅ Π΄Π°Π»ΠΈ ΠΈΠΌΠ°ΡΠ΅ ΠΏΠΎΠ΄ΡΠ²Π°Π½Π΅. ΠΠ΄Π΅ΡΡΠ° Π½Π° ΠΏΡΡΠ²ΠΈΡ Π΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π²ΡΡΡΠ΅ΡΠ½Π° ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ° Π½Π° Postgres, ΠΊΠΎΡΡΠΎ ΡΡΠ΄ΡΡΠΆΠ° ΠΏΡΠΈΠ±Π»ΠΈΠ·ΠΈΡΠ΅Π»Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° Π±ΡΠΎΡ Π½Π° ΡΠ΅Π΄ΠΎΠ²Π΅ΡΠ΅ Π² ΡΠ°Π±Π»ΠΈΡΠΈΡΠ΅, Π±ΡΠΎΡ Π½Π° βΠΆΠΈΠ²ΠΈΡΠ΅β ΡΠ΅Π΄ΠΎΠ²Π΅ ΠΈ Ρ.Π½. Π ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ Π²Π°ΡΠΈΠ°Π½ΡΠΈ Π½Π° Π³ΠΎΡΠΎΠ²ΠΈ ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅. ΠΠ·Π΅Ρ
ΠΌΠ΅ Π·Π° ΠΎΡΠ½ΠΎΠ²Π°
ΠΡΡΠ³ Π½Π°ΡΠΈΠ½ Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΠ΅ΡΠΎ
ΠΠ°Π»ΠΊΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠΎΠ΄ΡΠ²Π°Π½Π΅, Π΄ΠΎ 20%, Π΅ ΠΏΡΠΈΠ΅ΠΌΠ»ΠΈΠ²ΠΎ. ΠΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π° ΠΊΠ°ΡΠΎ Π°Π½Π°Π»ΠΎΠ³ Π½Π° ΡΠ°ΠΊΡΠΎΡΠ° Π½Π° Π·Π°ΠΏΡΠ»Π²Π°Π½Π΅ Π·Π°
ΠΠ°ΡΠΈΠ½ΠΈ Π·Π° ΡΠΏΡΠ°Π²ΡΠ½Π΅ Ρ ΠΏΠΎΠ΄ΡΠ²Π°Π½Π΅ΡΠΎ
ΠΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π³ΠΎΡΠΎΠ²ΠΈ Π½Π°ΡΠΈΠ½Π° Π·Π° ΡΠΏΡΠ°Π²ΡΠ½Π΅ Ρ ΠΏΠΎΠ΄ΡΠ²Π°Π½Π΅ΡΠΎ Π² Postgres, Π½ΠΎ ΡΠ΅ Π΄Π°Π»Π΅Ρ Π½Π΅ ΡΠ° Π²ΠΈΠ½Π°Π³ΠΈ ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π΅ ΠΎΡΠ³ΠΎΠ²Π°ΡΡΡ Π½Π° Π²ΡΠΈΡΠΊΠΈ.
ΠΠ°ΡΡΡΠΎΠΉΡΠ΅ AUTOVACUUM, Π·Π° Π΄Π° Π½Π΅ ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ ΠΏΠΎΠ΄ΡΠ²Π°Π½Π΅. Π ΠΏΠΎ-ΡΠΎΡΠ½ΠΎ Π΄Π° Π³ΠΎ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°ΡΠ΅ Π½Π° ΠΏΡΠΈΠ΅ΠΌΠ»ΠΈΠ²ΠΎ Π·Π° Π²Π°Ρ Π½ΠΈΠ²ΠΎ. Π’ΠΎΠ²Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΊΠ°ΡΠΎ "ΠΊΠ°ΠΏΠΈΡΠ°Π½ΡΠΊΠΈ" ΡΡΠ²Π΅Ρ, Π½ΠΎ Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»Π½ΠΎΡΡ Π½Π΅ Π²ΠΈΠ½Π°Π³ΠΈ Π΅ Π»Π΅ΡΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΏΠΎΡΡΠΈΠ³Π½Π΅. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠΌΠ°ΡΠ΅ Π°ΠΊΡΠΈΠ²Π½ΠΎ ΡΠ°Π·Π²ΠΈΡΠΈΠ΅ Ρ ΡΠ΅Π΄ΠΎΠ²Π½Π° ΠΏΡΠΎΠΌΡΠ½Π° Π² ΡΡ Π΅ΠΌΠ°ΡΠ° Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΈΠ»ΠΈ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° Π½ΡΠΊΠ°ΠΊΡΠ² Π²ΠΈΠ΄ ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ Π½Π° Π΄Π°Π½Π½ΠΈ. Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ²Π° Π²Π°ΡΠΈΡΡ ΠΏΡΠΎΡΠΈΠ» Π½Π° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Ρ ΡΠ΅ΡΡΠΎ ΠΈ Π΄Π° Π΅ ΡΠ°Π·Π»ΠΈΡΠ΅Π½ Π·Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈΡΠ΅ ΠΌΠ°ΡΠΈ. Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ ΡΡΡΠ±Π²Π° ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ Π΄Π° ΡΡΠ΅ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-Π½Π°ΠΏΡΠ΅Π΄ ΠΎΡ ΠΊΡΠΈΠ²Π°ΡΠ° ΠΈ Π΄Π° ΡΠ΅Π³ΡΠ»ΠΈΡΠ°ΡΠ΅ AUTOVACUUM ΠΊΡΠΌ ΠΏΡΠΎΠΌΠ΅Π½ΡΡΠΈΡ ΡΠ΅ ΠΏΡΠΎΡΠΈΠ» Π½Π° Π²ΡΡΠΊΠ° ΠΌΠ°ΡΠ°. ΠΠΎ Π΅ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΠ΅ ΡΠΎΠ²Π° Π½Π΅ Π΅ Π»Π΅ΡΠ½ΠΎ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ.
ΠΡΡΠ³Π° ΡΠ΅ΡΡΠΎ ΡΡΠ΅ΡΠ°Π½Π° ΠΏΡΠΈΡΠΈΠ½Π°, ΠΏΠΎΡΠ°Π΄ΠΈ ΠΊΠΎΡΡΠΎ AUTOVACUUM Π½Π΅ ΡΡΠΏΡΠ²Π° Π΄Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π° ΡΠ°Π±Π»ΠΈΡΠΈ, Π΅ Π½Π°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° Π΄ΡΠ»Π³ΠΎΡΡΠ°ΠΉΠ½ΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΌΡ ΠΏΡΠ΅ΡΠ°Ρ Π΄Π° ΠΈΠ·ΡΠΈΡΡΠΈ Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΏΠΎΡΠ°Π΄ΠΈ ΡΠ°ΠΊΡΠ°, ΡΠ΅ ΡΠ΅ ΡΠ° Π΄ΠΎΡΡΡΠΏΠ½ΠΈ Π·Π° ΡΠ΅Π·ΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ. ΠΡΠ΅ΠΏΠΎΡΡΠΊΠ°ΡΠ° ΡΡΠΊ ΡΡΡΠΎ Π΅ ΠΎΡΠ΅Π²ΠΈΠ΄Π½Π° - ΠΎΡΡΡΠ²Π΅ΡΠ΅ ΡΠ΅ ΠΎΡ "Π²ΠΈΡΡΡΠΈΡΠ΅" ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ°ΠΉΡΠ΅ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π½Π° Π°ΠΊΡΠΈΠ²Π½ΠΈΡΠ΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ. ΠΠΎ Π°ΠΊΠΎ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π²Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΅ Ρ ΠΈΠ±ΡΠΈΠ΄ Π½Π° OLAP ΠΈ OLTP, ΡΠΎΠ³Π°Π²Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π΄Π° ΠΈΠΌΠ°ΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΡΠΈ Π°ΠΊΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈ ΠΊΡΠ°ΡΠΊΠΈ Π·Π°ΡΠ²ΠΊΠΈ, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π΄ΡΠ»Π³ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, ΠΊΠ°ΡΠΎ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΎΡΡΠ΅Ρ. Π ΡΠ°ΠΊΠ°Π²Π° ΡΠΈΡΡΠ°ΡΠΈΡ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΠΌΠΈΡΠ»ΠΈΡΠ΅ Π·Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π΅ Π½Π° ΡΠΎΠ²Π°ΡΠ° Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΎΡΠ½ΠΎΠ²ΠΈ, ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π΄Π° Π½Π°ΡΡΡΠΎΠΈΡΠ΅ ΡΠΈΠ½ΠΎ Π²ΡΡΠΊΠ° ΠΎΡ ΡΡΡ .
ΠΡΡΠ³ ΠΏΡΠΈΠΌΠ΅Ρ - Π΄ΠΎΡΠΈ Π°ΠΊΠΎ ΠΏΡΠΎΡΠΈΠ»ΡΡ Π΅ Ρ ΠΎΠΌΠΎΠ³Π΅Π½Π΅Π½, Π½ΠΎ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ Π΅ ΠΏΠΎΠ΄ ΠΌΠ½ΠΎΠ³ΠΎ Π³ΠΎΠ»ΡΠΌΠΎ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅, ΡΠΎΠ³Π°Π²Π° Π΄ΠΎΡΠΈ ΠΈ Π½Π°ΠΉ-Π°Π³ΡΠ΅ΡΠΈΠ²Π½ΠΈΡΡ AUTOVACUUM ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π΅ ΡΡΠΏΠ΅Π΅ Π΄Π° ΡΠ΅ ΡΠΏΡΠ°Π²ΠΈ ΠΈ ΡΠ΅ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈ ΡΠ°Π·Π΄ΡΠ²Π°Π½Π΅. ΠΠ°ΡΠ°Π±ΠΈΡΠ°Π½Π΅ΡΠΎ (Π²Π΅ΡΡΠΈΠΊΠ°Π»Π½ΠΎ ΠΈΠ»ΠΈ Ρ ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»Π½ΠΎ) Π΅ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΎΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅.
ΠΠ°ΠΊ Π΄Π° Π±ΡΠ΄Π΅ΡΠ΅ Π² ΡΠΈΡΡΠ°ΡΠΈΡ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π»ΠΈ AUTOVACUUM, Π½ΠΎ ΠΏΠΎΠ΄ΡΠ²Π°Π½Π΅ΡΠΎ ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ°Π²Π° Π΄Π° ΡΠ°ΡΡΠ΅.
ΠΡΠ±ΠΎΡ ΠΠΠΠ£Π£Π ΠΠͺΠΠΠ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π° ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠ°Π±Π»ΠΈΡΠΈ ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ ΠΈ ΠΎΡΡΠ°Π²Ρ ΡΠ°ΠΌΠΎ Π°ΠΊΡΡΠ°Π»Π½ΠΈ Π΄Π°Π½Π½ΠΈ Π² ΡΡΡ . ΠΠ° Π΄Π° Π΅Π»ΠΈΠΌΠΈΠ½ΠΈΡΠ° ΡΠ°Π·Π΄ΡΠ²Π°Π½Π΅ΡΠΎ, ΡΠΎΠΉ ΡΠ°Π±ΠΎΡΠΈ ΠΏΠ΅ΡΡΠ΅ΠΊΡΠ½ΠΎ, Π½ΠΎ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ ΠΌΡ ΡΠ΅ ΡΠ»Π°Π²Ρ ΠΈΠ·ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π·Π°ΠΊΠ»ΡΡΠ²Π°Π½Π΅ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° (AccessExclusiveLock), ΠΊΠΎΠ΅ΡΠΎ Π½ΡΠΌΠ° Π΄Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π·Π°ΡΠ²ΠΊΠΈ ΠΊΡΠΌ ΡΠ°Π·ΠΈ ΡΠ°Π±Π»ΠΈΡΠ°, Π΄ΠΎΡΠΈ ΡΠ΅Π»Π΅ΠΊΡΠΈΡΠ°. ΠΠΊΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡΠ΅ Π΄Π° ΡΠΏΡΠ΅ΡΠ΅ ΡΡΠ»ΡΠ³Π°ΡΠ° ΡΠΈ ΠΈΠ»ΠΈ ΡΠ°ΡΡ ΠΎΡ Π½Π΅Ρ Π·Π° ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅ (ΠΎΡ Π΄Π΅ΡΠ΅ΡΠΊΠΈ ΠΌΠΈΠ½ΡΡΠΈ Π΄ΠΎ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ°ΡΠ° Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π½Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ ΠΈ Π²Π°ΡΠΈΡ Ρ Π°ΡΠ΄ΡΠ΅Ρ), ΡΠΎΠ³Π°Π²Π° ΡΠ°Π·ΠΈ ΠΎΠΏΡΠΈΡ Π΅ Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠ°ΡΠ°. ΠΠΈΠ΅, Π·Π° ΡΡΠΆΠ°Π»Π΅Π½ΠΈΠ΅, Π½ΡΠΌΠ°ΠΌΠ΅ Π²ΡΠ΅ΠΌΠ΅ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ VACUUM FULL ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΏΠ»Π°Π½ΠΈΡΠ°Π½Π°ΡΠ° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°, ΡΠ°ΠΊΠ° ΡΠ΅ ΡΠΎΠ·ΠΈ ΠΌΠ΅ΡΠΎΠ΄ Π½Π΅ Π½ΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠΆΠ΄Π°.
ΠΡΠ±ΠΎΡ CLUSTER Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π° ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠ°Π±Π»ΠΈΡΠΈΡΠ΅ ΠΏΠΎ ΡΡΡΠΈΡ Π½Π°ΡΠΈΠ½ ΠΊΠ°ΡΠΎ VACUUM FULL, ΠΊΠ°ΡΠΎ ΡΡΡΠ΅Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΏΠΎΡΠΎΡΠΈΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡ, ΡΠΏΠΎΡΠ΅Π΄ ΠΊΠΎΠΉΡΠΎ Π΄Π°Π½Π½ΠΈΡΠ΅ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎΠ΄ΡΠ΅Π΄Π΅Π½ΠΈ Π½Π° Π΄ΠΈΡΠΊΠ° (Π½ΠΎ ΡΠ΅Π΄ΡΡ Π½Π΅ Π΅ Π³Π°ΡΠ°Π½ΡΠΈΡΠ°Π½ Π·Π° Π½ΠΎΠ²ΠΈ ΡΠ΅Π΄ΠΎΠ²Π΅ Π² Π±ΡΠ΄Π΅ΡΠ΅). Π ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΡΠΈΡΡΠ°ΡΠΈΠΈ ΡΠΎΠ²Π° Π΅ Π΄ΠΎΠ±ΡΠ° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π·Π° ΡΠ΅Π΄ΠΈΡΠ° Π·Π°ΡΠ²ΠΊΠΈ - Ρ ΡΠ΅ΡΠ΅Π½Π΅ Π½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π·Π°ΠΏΠΈΡΠ° Π² ΠΈΠ½Π΄Π΅ΠΊΡΠ°. ΠΠ΅Π΄ΠΎΡΡΠ°ΡΡΠΊΡΡ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Π΅ ΡΡΡΠΈΡΡ ΠΊΠ°ΡΠΎ ΡΠΎΠ·ΠΈ Π½Π° VACUUM FULL - Π·Π°ΠΊΠ»ΡΡΠ²Π° ΠΌΠ°ΡΠ°ΡΠ° ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ°Π±ΠΎΡΠ°.
ΠΡΠ±ΠΎΡ REINDEX ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΈΡΠ΅ Π΄Π²Π°, Π½ΠΎ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π° ΠΎΡΠ½ΠΎΠ²ΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ΅Π½ ΠΈΠ½Π΄Π΅ΠΊΡ ΠΈΠ»ΠΈ Π²ΡΠΈΡΠΊΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ Π² ΡΠ°Π±Π»ΠΈΡΠ°. ΠΠ°ΠΊΠ»ΡΡΠ²Π°Π½ΠΈΡΡΠ° ΡΠ° ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-ΡΠ»Π°Π±ΠΈ: ShareLock Π½Π° ΡΠ°Π±Π»ΠΈΡΠ° (ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΡΠ²Π° ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ, Π½ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΡΠ΅Π»Π΅ΠΊΡΠΈΠΈ) ΠΈ AccessExclusiveLock Π½Π° ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Ρ ΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡ (Π±Π»ΠΎΠΊΠΈΡΠ° Π·Π°ΡΠ²ΠΊΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠΈ ΡΠΎΠ·ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡ). ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, Postgres 12 Π²ΡΠ²Π΅Π΄Π΅ ΠΎΠΏΡΠΈΡΡΠ°
Π ΠΏΠΎ-ΡΠ°Π½Π½ΠΈΡΠ΅ Π²Π΅ΡΡΠΈΠΈ Π½Π° Postgres ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΠΎΡΡΠΈΠ³Π½Π΅ΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ, ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π° REINDEX ΠΠΠΠΠΠ ΠΠΠΠΠΠ Ρ
ΠΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½, Π°ΠΊΠΎ ΠΈΠΌΠ° Π½Π°ΡΠΈΠ½ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ΅ Π΄Π° Π΅Π»ΠΈΠΌΠΈΠ½ΠΈΡΠ°Ρ Π³ΠΎΡΠ΅ΡΠΎΡΠΎ ΠΏΠΎΠ΄ΡΠ²Π°Π½Π΅, ΡΠΎΠ³Π°Π²Π° Π½ΡΠΌΠ° ΡΠ°ΠΊΠΈΠ²Π° Π·Π° ΡΠ°Π±Π»ΠΈΡΠΈΡΠ΅. Π’ΡΠΊ Π²Π»ΠΈΠ·Π°Ρ Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π²ΡΠ½ΡΠ½ΠΈΡΠ΅ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ:
ΠΠ°ΠΊ ΡΠ°Π±ΠΎΡΠΈ pg_repack
ΠΠ° ΠΊΠ°ΠΆΠ΅ΠΌ, ΡΠ΅ ΠΈΠΌΠ°ΠΌΠ΅ ΡΡΠ²ΡΠ΅ΠΌ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½Π° ΡΠ°Π±Π»ΠΈΡΠ° - Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ, ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΈ, Π·Π° ΡΡΠΆΠ°Π»Π΅Π½ΠΈΠ΅, Ρ ΡΠ°Π·Π΄ΡΠ²Π°Π½Π΅. ΠΠ°ΡΠΎ ΠΏΡΡΠ²Π° ΡΡΡΠΏΠΊΠ° pg_repack ΡΡΠ·Π΄Π°Π²Π° ΠΆΡΡΠ½Π°Π»Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°, Π·Π° Π΄Π° ΡΠ»Π΅Π΄ΠΈ Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ, Π΄ΠΎΠΊΠ°ΡΠΎ ΡΠ°Π±ΠΎΡΠΈ. Π’ΡΠΈΠ³Π΅ΡΡΡ ΡΠ΅ ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈΡΠ° ΡΠ΅Π·ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ ΠΏΡΠΈ Π²ΡΡΠΊΠΎ Π²ΠΌΡΠΊΠ²Π°Π½Π΅, Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ ΠΈ ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΡΡΠ·Π΄Π°Π²Π° ΡΠ°Π±Π»ΠΈΡΠ°, ΠΊΠΎΡΡΠΎ Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π½Π° Π½Π° ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π° ΠΏΠΎ ΡΡΡΡΠΊΡΡΡΠ°, Π½ΠΎ Π±Π΅Π· ΠΈΠ½Π΄Π΅ΠΊΡΠΈ ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ, Π·Π° Π΄Π° Π½Π΅ ΡΠ΅ Π·Π°Π±Π°Π²Ρ ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° Π²ΠΌΡΠΊΠ²Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ.
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° pg_repack ΠΏΡΠ΅Ρ Π²ΡΡΠ»Ρ Π΄Π°Π½Π½ΠΈ ΠΎΡ ΡΡΠ°ΡΠ°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ° ΠΊΡΠΌ Π½ΠΎΠ²Π°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ°, ΠΊΠ°ΡΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΡΠΈΠ»ΡΡΠΈΡΠ° Π²ΡΠΈΡΠΊΠΈ Π½Π΅ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈ ΡΠ΅Π΄ΠΎΠ²Π΅ ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΡΡΠ·Π΄Π°Π²Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈ Π·Π° Π½ΠΎΠ²Π°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ°. ΠΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΡΠ΅Π·ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ ΡΠ΅ Π½Π°ΡΡΡΠΏΠ²Π°Ρ Π² ΠΆΡΡΠ½Π°Π»Π½Π°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ°.
Π‘Π»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΡΡΡΠΏΠΊΠ° Π΅ Π΄Π° ΠΏΡΠ΅Ρ Π²ΡΡΠ»ΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π² Π½ΠΎΠ²Π°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ°. ΠΠΈΠ³ΡΠ°ΡΠΈΡΡΠ° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° Π² Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ ΠΈ ΠΊΠΎΠ³Π°ΡΠΎ Π² ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° Π½Π° ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡ ΡΠ°ΠΉΠ» ΠΎΡΡΠ°Π½Π°Ρ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ ΠΎΡ 20 Π·Π°ΠΏΠΈΡΠ°, pg_repack ΠΏΡΠΈΠ΄ΠΎΠ±ΠΈΠ²Π° ΡΠΈΠ»Π½ΠΎ Π·Π°ΠΊΠ»ΡΡΠ²Π°Π½Π΅, ΠΌΠΈΠ³ΡΠΈΡΠ° Π½Π°ΠΉ-Π½ΠΎΠ²ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ ΠΈ Π·Π°ΠΌΠ΅Π½Ρ ΡΡΠ°ΡΠ°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ° Ρ Π½ΠΎΠ²Π°ΡΠ° Π² ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡΠ΅ ΡΠ°Π±Π»ΠΈΡΠΈ Π½Π° Postgres. Π’ΠΎΠ²Π° Π΅ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΈΡΡ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΡΠ°ΡΡΠΊ ΠΌΠΎΠΌΠ΅Π½Ρ, ΠΊΠΎΠ³Π°ΡΠΎ Π½ΡΠΌΠ° Π΄Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ°Π±ΠΎΡΠΈΡΠ΅ Ρ ΠΌΠ°ΡΠ°ΡΠ°. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΡΠ°ΡΠ°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ° ΠΈ ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° Ρ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΡΠ΅ ΠΈΠ·ΡΡΠΈΠ²Π°Ρ ΠΈ ΡΠ΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π° ΠΌΡΡΡΠΎ Π²ΡΠ² ΡΠ°ΠΉΠ»ΠΎΠ²Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ°. ΠΡΠΎΡΠ΅ΡΡΡ Π΅ Π·Π°Π²ΡΡΡΠ΅Π½.
ΠΠ° ΡΠ΅ΠΎΡΠΈΡ Π²ΡΠΈΡΠΊΠΎ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΡΡΠ°Ρ ΠΎΡΠ½ΠΎ, Π½ΠΎ ΠΊΠ°ΠΊΠ²ΠΎ Π΄Π° ΠΊΠ°ΠΆΠ΅ΠΌ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ°? Π’Π΅ΡΡΠ²Π°Ρ ΠΌΠ΅ pg_repack Π±Π΅Π· Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ ΠΈ ΠΏΠΎΠ΄ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΈΡ ΠΌΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΠ° ΠΌΡ Π² ΡΠ»ΡΡΠ°ΠΉ Π½Π° ΠΏΡΠ΅ΠΆΠ΄Π΅Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΡΠΏΠΈΡΠ°Π½Π΅ (Ρ Π΄ΡΡΠ³ΠΈ Π΄ΡΠΌΠΈ, ΡΡΠ΅Π· Ctrl+C). ΠΡΠΈΡΠΊΠΈ ΡΠ΅ΡΡΠΎΠ²Π΅ Π±ΡΡ Π° ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»Π½ΠΈ.
ΠΡΠΈΠ΄ΠΎΡ ΠΌΠ΅ Π΄ΠΎ prod - ΠΈ ΡΠΎΠ³Π°Π²Π° Π²ΡΠΈΡΠΊΠΎ ΡΠ΅ ΠΎΠ±ΡΡΠΊΠ°, ΠΊΠ°ΠΊΡΠΎ ΠΎΡΠ°ΠΊΠ²Π°Ρ ΠΌΠ΅.
ΠΡΡΠ²Π° ΠΏΠ°Π»Π°ΡΠΈΠ½ΠΊΠ° Π² ΠΏΡΠΎΠ΄Π°ΠΆΠ±Π°
Π ΠΏΡΡΠ²ΠΈΡ ΠΊΠ»ΡΡΡΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡ ΠΌΠ΅ Π³ΡΠ΅ΡΠΊΠ° Π·Π° Π½Π°ΡΡΡΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠ½ΠΈΠΊΠ°Π»Π½ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅:
$ ./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. ΠΠΎ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΡΠ΅ Π² ΡΡΡΡΠ°Π²Π° ΠΌΡ Π°ΡΡΠΈΠ±ΡΡΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡ
ΠΌΠ΅ βΠ½Π°ΡΠ΅ΡΠΎβ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅ΡΠΎ ΠΌΡ ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²Π°. ΠΡΠΎΠ±Π»Π΅ΠΌΡΡ ΡΠ΅ ΠΎΠΊΠ°Π·Π°, ΡΠ΅ ΡΠΎΠ²Π° Π½Π΅ Π΅ ΡΡΠ²ΡΠ΅ΠΌ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅, Π° Π·Π°Π±Π°Π²Π΅Π½ΠΎ (
ΠΡΠ»ΠΎΠΆΠ΅Π½ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ: Π·Π°ΡΠΎ ΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ ΠΈ ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΡΡ
ΠΠ°Π»ΠΊΠΎ ΡΠ΅ΠΎΡΠΈΡ Π·Π° ΠΎΡΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ.
ΠΠΎΠΌΠΈΡΠ»Π΅ΡΠ΅ Π·Π° ΠΏΡΠΎΡΡ ΠΏΡΠΈΠΌΠ΅Ρ: ΠΈΠΌΠ°ΠΌΠ΅ ΡΠ°Π±Π»ΠΈΡΠ° Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π» Π·Π° Π°Π²ΡΠΎΠΌΠΎΠ±ΠΈΠ»ΠΈ Ρ Π΄Π²Π° Π°ΡΡΠΈΠ±ΡΡΠ° - ΠΈΠΌΠ΅ΡΠΎ ΠΈ ΡΠ΅Π΄Π° Π½Π° Π°Π²ΡΠΎΠΌΠΎΠ±ΠΈΠ»Π° Π² ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ.
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, ΠΈΠΌΠ° ΡΡΠΈ Π½ΠΈΠ²Π° Π½Π° Π΄Π΅ΡΠ°ΠΉΠ»Π½ΠΎΡΡ Π½Π° ΡΡΡ
Π½ΠΎΡΠΎ Π²Π°Π»ΠΈΠ΄ΠΈΡΠ°Π½Π΅: ΡΠ΅Π΄, ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ ΠΈ ΠΈΠ·ΡΠ°Π·.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ:
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 ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°. Π’Π°ΠΊΠ° ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠΌΠ΅ ΡΠΈΠ³ΡΡΠ½ΠΈ, ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈΡΠ΅ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π°Ρ Π΅Π΄Π½Π°ΠΊΠ²ΠΎ ΠΈ Π² Π΄Π²Π°ΡΠ° ΡΠ»ΡΡΠ°Ρ: ΠΈΠ»ΠΈ Π²ΠΈΠ½Π°Π³ΠΈ ΡΡΡ Π·Π°ΠΊΡΡΠ½Π΅Π½ΠΈΠ΅, ΠΈΠ»ΠΈ Π²ΠΈΠ½Π°Π³ΠΈ Π½Π΅Π·Π°Π±Π°Π²Π½ΠΎ.
Π ΡΠ°ΠΊΠ°, ΠΊΠ°ΠΊΠ²ΠΈ ΠΈΠ΄Π΅ΠΈ ΠΈΠΌΠ°Ρ ΠΌΠ΅.
Π‘ΡΠ·Π΄Π°ΠΉΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡ, ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π° ΠΎΡΠ»ΠΎΠΆΠ΅Π½
ΠΡΡΠ²Π°ΡΠ° ΠΈΠ΄Π΅Ρ Π΅ Π΄Π° ΠΈΠ·Π²ΡΡΡΠΈΡΠ΅ ΠΈ Π΄Π²Π΅ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π² Π½Π΅Π·Π°Π±Π°Π²Π΅Π½ ΡΠ΅ΠΆΠΈΠΌ. Π’ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ°Π»ΡΠΈΠ²ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»Π½ΠΈ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ ΠΎΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ΡΠΎ, Π½ΠΎ Π°ΠΊΠΎ ΠΈΠΌΠ° ΠΌΠ°Π»ΠΊΠΎ ΠΎΡ ΡΡΡ , ΡΠΎΠ²Π° Π½Π΅ ΡΡΡΠ±Π²Π° Π΄Π° Π·Π°ΡΡΠ³Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ°ΠΊΠΈΠ²Π° ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΈ ΡΠ° Π½ΠΎΡΠΌΠ°Π»Π½Π° ΡΠΈΡΡΠ°ΡΠΈΡ Π·Π° ΡΡΡ . Π’Π΅ Π²ΡΠ·Π½ΠΈΠΊΠ²Π°Ρ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠΎΠ³Π°ΡΠΎ Π΄Π²Π°ΠΌΠ° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ Π·Π°ΠΏΠΎΡΠ½Π°Ρ Π΄Π° ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠ°Ρ Π΅Π΄ΠΈΠ½ ΠΈ ΡΡΡ ΡΠΈΠ΄ΠΆΠ΅Ρ Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΡΡ Π½Π° Π²ΡΠΎΡΠΈΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π» Π½ΡΠΌΠ° Π²ΡΠ΅ΠΌΠ΅ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΡΠ΅ ΡΠΈΠ΄ΠΆΠ΅ΡΡΡ Π²Π΅ΡΠ΅ Π΅ Π±Π»ΠΎΠΊΠΈΡΠ°Π½ Π·Π° ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠ°Π½Π΅ ΠΎΡ ΠΏΡΡΠ²ΠΈΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π». Π ΡΠ°ΠΊΠ°Π²Π° ΡΠΈΡΡΠ°ΡΠΈΡ ΡΡΡΠ²ΡΡΡΡ ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π½Π° Π²ΡΠΎΡΠΈΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π» Ρ ΠΎΡΠΊΠ°Π·, Π° ΠΊΠ»ΠΈΠ΅Π½ΡΡΡ ΠΌΡ Π²ΡΡΡΠ° ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ ΠΈ Π·Π°ΠΊΠ»ΡΡΠ²Π° Π΄ΠΆΠ°Π΄ΠΆΠ°ΡΠ°. ΠΠ°Π»ΠΊΠΎ ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ, ΠΊΠΎΠ³Π°ΡΠΎ ΠΏΡΡΠ²ΠΈΡΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π» Π·Π°Π²ΡΡΡΠΈ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠ°Π½Π΅ΡΠΎ, Π²ΡΠΎΡΠΈΡΡ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΡΠ΅ Π΄ΠΆΠ°Π΄ΠΆΠ°ΡΠ° Π²Π΅ΡΠ΅ Π½Π΅ Π΅ Π±Π»ΠΎΠΊΠΈΡΠ°Π½Π° ΠΈ ΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΠΎΠ²ΡΠΎΡΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ΡΠΎ ΡΠΈ.
ΠΠ° Π΄Π° Π³Π°ΡΠ°Π½ΡΠΈΡΠ°ΠΌΠ΅, ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈΡΠ΅ Π²ΠΈΠ½Π°Π³ΠΈ ΡΠ° Π² Π½Π΅ΠΎΡΠ»ΠΎΠΆΠ΅Π½ ΡΠ΅ΠΆΠΈΠΌ, Π½ΠΈΠ΅ ΡΡΠ·Π΄Π°Π΄ΠΎΡ ΠΌΠ΅ Π½ΠΎΠ² ΠΈΠ½Π΄Π΅ΠΊΡ, ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π° ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΎΡΠΎ ΠΎΡΠ»ΠΎΠΆΠ΅Π½ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅:
CREATE UNIQUE INDEX CONCURRENTLY uk_tablename__immediate ON tablename (id, index);
-- run pg_repack
DROP INDEX CONCURRENTLY uk_tablename__immediate;
Π ΡΠ΅ΡΡΠΎΠ²Π°ΡΠ° ΡΡΠ΅Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΡ ΠΌΠ΅ ΡΠ°ΠΌΠΎ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΎΡΠ°ΠΊΠ²Π°Π½ΠΈ Π³ΡΠ΅ΡΠΊΠΈ. Π£ΡΠΏΠ΅Ρ ! Π‘ΡΠ°ΡΡΠΈΡΠ°Ρ ΠΌΠ΅ pg_repack ΠΎΡΠ½ΠΎΠ²ΠΎ Π½Π° prod ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡ ΠΌΠ΅ 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 Π²ΠΈΠ½Π°Π³ΠΈ ΡΠ΅ ΡΡΠΈΠ²Π° ΠΏΡΠΈ ΠΏΡΡΠ²ΠΎΡΠΎ Π²ΠΌΡΠΊΠ²Π°Π½Π΅, ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠ°Π½Π°ΡΠ° Π²Π΅ΡΡΠΈΡ ΡΠ°Π±ΠΎΡΠΈ Π±Π΅Π· Π³ΡΠ΅ΡΠΊΠΈ. Π‘ΡΡΠ°Ρ ΠΎΡΠ΅Π½.
ΠΡΠΈΠ²Π°ΠΌΠ΅ Π½Π° prod ΠΈ ΠΎΡΠ½ΠΎΠ²ΠΎ ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ Π³ΡΠ΅ΡΠΊΠ° Π² ΡΡΡΠ°ΡΠ° ΡΠ°Π·Π° Π½Π° ΠΊΠΎΠΏΠΈΡΠ°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ ΠΆΡΡΠ½Π°Π»Π½Π°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ° Π² Π½ΠΎΠ²Π°:
$ ./pg_repack -t tablename -o id
INFO: repacking table "tablename"
ERROR: query failed:
ERROR: duplicate key value violates unique constraint "index_16508"
DETAIL: Key (id, index)=(100500, 42) already exists.
ΠΠ»Π°ΡΠΈΡΠ΅ΡΠΊΠ° ΡΠΈΡΡΠ°ΡΠΈΡ: Π²ΡΠΈΡΠΊΠΎ ΡΠ°Π±ΠΎΡΠΈ Π½Π° ΡΠ΅ΡΡΠΎΠ²ΠΈ ΡΡΠ΅Π΄ΠΈ, Π½ΠΎ Π½Π΅ ΠΈ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½ΠΈ?!
APPLY_COUNT ΠΈ ΡΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π΄Π²Π΅ ΠΏΠ°ΡΡΠΈΠ΄ΠΈ
ΠΠ°ΠΏΠΎΡΠ½Π°Ρ ΠΌΠ΅ Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΠΊΠΎΠ΄Π° Π±ΡΠΊΠ²Π°Π»Π½ΠΎ ΡΠ΅Π΄ ΠΏΠΎ ΡΠ΅Π΄ ΠΈ ΠΎΡΠΊΡΠΈΡ ΠΌΠ΅ Π²Π°ΠΆΠ½Π° ΡΠΎΡΠΊΠ°: Π΄Π°Π½Π½ΠΈΡΠ΅ ΡΠ΅ ΠΏΡΠ΅Ρ Π²ΡΡΠ»ΡΡ ΠΎΡ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΎΠ½Π½Π°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ° ΠΊΡΠΌ Π½ΠΎΠ²Π°ΡΠ° Π½Π° ΠΏΠ°ΡΡΠΈΠ΄ΠΈ, ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ°ΡΠ° APPLY_COUNT ΠΏΠΎΡΠΎΡΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π½Π° ΠΏΠ°ΡΡΠΈΠ΄Π°ΡΠ°:
for (;;)
{
num = apply_log(connection, table, APPLY_COUNT);
if (num > MIN_TUPLES_BEFORE_SWITCH)
continue; /* there might be still some tuples, repeat. */
...
}
ΠΡΠΎΠ±Π»Π΅ΠΌΡΡ Π΅, ΡΠ΅ Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΎΡ ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½Π°ΡΠ° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ, Π² ΠΊΠΎΡΡΠΎ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»Π½ΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π½Π°ΡΡΡΠ°Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ΡΠΎ, ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΎΠΊΠ°ΠΆΠ°Ρ Π½Π° ΠΊΡΡΡΡΠΎΠ²ΠΈΡΠ΅ΡΠΎ Π½Π° Π΄Π²Π΅ ΠΏΠ°ΡΡΠΈΠ΄ΠΈ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΏΡΠ΅Ρ Π²ΡΡΠ»ΡΠ½Π΅ΡΠΎ - ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°ΡΠ° ΠΎΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ ΡΠ΅ Π±ΡΠ΄Π°Ρ Π°Π½Π³Π°ΠΆΠΈΡΠ°Π½ΠΈ Π² ΠΏΡΡΠ²Π°ΡΠ° ΠΏΠ°ΡΡΠΈΠ΄Π°, Π° Π΄ΡΡΠ³Π°ΡΠ° ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° Π²ΡΠ² Π²ΡΠΎΡΠΈΡ. Π Π΅ΡΠΎ ΠΊΠ°ΠΊΡΠ² ΠΊΡΡΠΌΠ΅Ρ: Π°ΠΊΠΎ ΠΎΡΠ±ΠΎΡΠΈΡΠ΅ Π² ΠΏΡΡΠ²Π°ΡΠ° ΠΏΠ°ΡΡΠΈΠ΄Π° Π½Π΅ Π½Π°ΡΡΡΠ°Ρ Π½ΠΈΡΠΎ, ΡΠΎΠ³Π°Π²Π° Π²ΡΠΈΡΠΊΠΎ Π΅ Π½Π°ΡΠ΅Π΄, Π½ΠΎ Π°ΠΊΠΎ Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΡΡ, Π²ΡΠ·Π½ΠΈΠΊΠ²Π° Π³ΡΠ΅ΡΠΊΠ°.
APPLY_COUNT ΡΠ΅ ΡΠ°Π²Π½ΡΠ²Π° Π½Π° 1000 Π·Π°ΠΏΠΈΡΠ°, ΠΊΠΎΠ΅ΡΠΎ ΠΎΠ±ΡΡΠ½ΡΠ²Π° Π·Π°ΡΠΎ Π½Π°ΡΠΈΡΠ΅ ΡΠ΅ΡΡΠΎΠ²Π΅ Π±ΡΡ Π° ΡΡΠΏΠ΅ΡΠ½ΠΈ - ΡΠ΅ Π½Π΅ ΠΏΠΎΠΊΡΠΈΡ Π° ΡΠ»ΡΡΠ°Ρ Π½Π° βΠΏΠ°ΠΊΠ΅ΡΠ½ΠΎ ΡΠ²ΡΡΠ·Π²Π°Π½Π΅β. ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΌΠ΅ Π΄Π²Π΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ - Π²ΠΌΡΠΊΠ²Π°Π½Π΅ ΠΈ Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅, ΡΠ°ΠΊΠ° ΡΠ΅ ΡΠΎΡΠ½ΠΎ 500 ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π½Π° Π΄Π²Π΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π²ΠΈΠ½Π°Π³ΠΈ Π±ΡΡ Π° ΠΏΠΎΡΡΠ°Π²Π΅Π½ΠΈ Π² ΠΏΠ°ΠΊΠ΅Ρ ΠΈ Π½Π΅ ΡΠΌΠ΅ ΠΈΠΌΠ°Π»ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ. Π‘Π»Π΅Π΄ Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° Π²ΡΠΎΡΠ°ΡΠ° Π°ΠΊΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π°ΡΠ°ΡΠ° ΡΠ΅Π΄Π°ΠΊΡΠΈΡ ΡΠΏΡΡ Π΄Π° ΡΠ°Π±ΠΎΡΠΈ:
FOR i IN 1..10000 LOOP
BEGIN
INSERT INTO test_table VALUES (1) RETURNING id INTO v_id;
UPDATE test_table set val = i where id = v_id;
UPDATE test_table set val = i where id = v_id; -- one more update
COMMIT;
END;
END LOOP;
Π ΡΠ°ΠΊΠ°, ΡΠ»Π΅Π΄Π²Π°ΡΠ°ΡΠ° Π·Π°Π΄Π°ΡΠ° Π΅ Π΄Π° ΡΠ΅ ΡΠ²Π΅ΡΠΈΡΠ΅, ΡΠ΅ Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΎΡ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½Π°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ°, ΠΊΠΎΡΡΠΎ Π΅ Π±ΠΈΠ»Π° ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½Π° Π² Π΅Π΄Π½Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ, ΠΏΠΎΠΏΠ°Π΄Π°Ρ Π² Π½ΠΎΠ²Π°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ° ΡΡΡΠΎ Π² ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° Π΅Π΄Π½Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ.
ΠΡΡ Π²ΡΡΠ»ΡΠ½Π΅ Π½Π° Π³ΡΡΠΏΠΈΡΠ°Π½Π΅ΡΠΎ
Π ΠΎΡΠ½ΠΎΠ²ΠΎ ΠΈΠΌΠ°Ρ ΠΌΠ΅ Π΄Π²Π΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ. ΠΡΡΠ²ΠΎ: Π½Π΅ΠΊΠ° ΡΠ΅ ΠΎΡΠΊΠ°ΠΆΠ΅ΠΌ Π½Π°ΠΏΡΠ»Π½ΠΎ ΠΎΡ ΡΠ°Π·Π΄Π΅Π»ΡΠ½Π΅ΡΠΎ Π½Π° ΠΏΠ°ΡΡΠΈΠ΄ΠΈ ΠΈ Π΄Π° ΠΏΡΠ΅Π²ΡΡΠ½Π΅ΠΌ ΠΏΡΠ΅Ρ Π²ΡΡΠ»ΡΠ½Π΅ΡΠΎ Π½Π° Π΄Π°Π½Π½ΠΈ Π² Π΅Π΄Π½Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ. Π ΠΏΠΎΠ»Π·Π° Π½Π° ΡΠΎΠ²Π° ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π±Π΅ΡΠ΅ Π½Π΅Π³ΠΎΠ²Π°ΡΠ° ΠΏΡΠΎΡΡΠΎΡΠ° - Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² ΠΊΠΎΠ΄Π° ΡΠ° ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΈ (ΠΌΠ΅ΠΆΠ΄Ρ Π΄ΡΡΠ³ΠΎΡΠΎ, Π² ΠΏΠΎ-ΡΡΠ°ΡΠΈΡΠ΅ Π²Π΅ΡΡΠΈΠΈ ΡΠΎΠ³Π°Π²Π° pg_reorg ΡΠ°Π±ΠΎΡΠ΅ΡΠ΅ ΠΏΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½). ΠΠΎ ΠΈΠΌΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌ - Π½ΠΈΠ΅ ΡΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ Π΄ΡΠ»Π³ΠΎΡΡΠΎΡΠ½Π° ΡΠ΄Π΅Π»ΠΊΠ° ΠΈ ΡΠΎΠ²Π°, ΠΊΠ°ΠΊΡΠΎ ΡΠΏΠΎΠΌΠ΅Π½Π°Ρ ΠΌΠ΅ ΠΏΠΎ-ΡΠ°Π½ΠΎ, Π΅ Π·Π°ΠΏΠ»Π°Ρ Π° Π·Π° ΠΏΠΎΡΠ²Π°ΡΠ° Π½Π° Π½ΠΎΠ²ΠΎ ΡΠ°Π·Π΄ΡΠ²Π°Π½Π΅.
ΠΡΠΎΡΠΎΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΅ ΠΏΠΎ-ΡΠ»ΠΎΠΆΠ½ΠΎ, Π½ΠΎ Π²Π΅ΡΠΎΡΡΠ½ΠΎ ΠΏΠΎ-ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ: ΡΡΠ·Π΄Π°ΠΉΡΠ΅ ΠΊΠΎΠ»ΠΎΠ½Π° Π² ΠΆΡΡΠ½Π°Π»Π½Π°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ° Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° Π½Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΡΠ°, ΠΊΠΎΡΡΠΎ Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠ»Π° Π΄Π°Π½Π½ΠΈ ΠΊΡΠΌ ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ°. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π°, ΠΊΠΎΠ³Π°ΡΠΎ ΠΊΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π°Π½Π½ΠΈ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π³ΠΈ Π³ΡΡΠΏΠΈΡΠ°ΠΌΠ΅ ΠΏΠΎ ΡΠΎΠ·ΠΈ Π°ΡΡΠΈΠ±ΡΡ ΠΈ Π΄Π° Π³Π°ΡΠ°Π½ΡΠΈΡΠ°ΠΌΠ΅, ΡΠ΅ ΡΠ²ΡΡΠ·Π°Π½ΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ ΡΠ΅ ΠΏΡΠ΅Ρ Π²ΡΡΠ»ΡΡ Π·Π°Π΅Π΄Π½ΠΎ. ΠΠ°ΠΊΠ΅ΡΡΡ ΡΠ΅ Π±ΡΠ΄Π΅ ΡΠΎΡΠΌΠΈΡΠ°Π½ ΠΎΡ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ (ΠΈΠ»ΠΈ Π΅Π΄Π½Π° Π³ΠΎΠ»ΡΠΌΠ°) ΠΈ ΡΠ°Π·ΠΌΠ΅ΡΡΡ ΠΌΡ ΡΠ΅ Π²Π°ΡΠΈΡΠ° Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ ΡΠΎΠ²Π° ΠΊΠΎΠ»ΠΊΠΎ Π΄Π°Π½Π½ΠΈ ΡΠ° Π±ΠΈΠ»ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ΠΈ Π² ΡΠ΅Π·ΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ. ΠΠ°ΠΆΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ ΠΎΡΠ±Π΅Π»Π΅ΠΆΠΈ, ΡΠ΅ ΡΡΠΉ ΠΊΠ°ΡΠΎ Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΎΡ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π²Π»ΠΈΠ·Π°Ρ Π² ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΎΠ½Π½Π°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ° Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ ΡΠ΅Π΄, Π²Π΅ΡΠ΅ Π½ΡΠΌΠ° Π΄Π° Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΡΠ΅ΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ, ΠΊΠ°ΠΊΡΠΎ Π±Π΅ΡΠ΅ ΠΏΡΠ΅Π΄ΠΈ. seqscan Π·Π° Π²ΡΡΠΊΠ° Π·Π°ΡΠ²ΠΊΠ°, ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π° ΠΎΡ tx_id, Π΅ ΡΠ²ΡΡΠ΄Π΅ ΡΠΊΡΠΏΠΎ, ΠΈΠΌΠ°ΡΠ΅ Π½ΡΠΆΠ΄Π° ΠΎΡ ΠΈΠ½Π΄Π΅ΠΊΡ, Π½ΠΎ ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠ΅ Π·Π°Π±Π°Π²ΠΈ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΏΠΎΡΠ°Π΄ΠΈ ΠΈΠ·Π»ΠΈΡΠ½ΠΈΡΠ΅ ΡΠ°Π·Ρ ΠΎΠ΄ΠΈ Π·Π° Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ΡΠΎ ΠΌΡ. ΠΠ°ΡΠΎ ΡΡΠ»ΠΎ, ΠΊΠ°ΠΊΡΠΎ Π²ΠΈΠ½Π°Π³ΠΈ, ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΠΆΠ΅ΡΡΠ²Π°ΡΠ΅ Π½Π΅ΡΠΎ.
Π ΡΠ°ΠΊΠ°, ΡΠ΅ΡΠΈΡ ΠΌΠ΅ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ Ρ ΠΏΡΡΠ²ΠΈΡ Π²Π°ΡΠΈΠ°Π½Ρ, ΠΊΠ°ΡΠΎ ΠΏΠΎ-ΠΏΡΠΎΡΡ. ΠΡΡΠ²ΠΎ, Π±Π΅ΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΠ΅ ΡΠ°Π·Π±Π΅ΡΠ΅ Π΄Π°Π»ΠΈ Π΅Π΄Π½Π° Π΄ΡΠ»Π³Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π±ΠΈ Π±ΠΈΠ»Π° ΠΈΡΡΠΈΠ½ΡΠΊΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌ. Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΡΠΎ ΠΏΡΠ΅Ρ Π²ΡΡΠ»ΡΠ½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ ΡΡΠ°ΡΠ°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ° ΠΊΡΠΌ Π½ΠΎΠ²Π°ΡΠ° ΡΡΡΠΎ ΡΠ΅ ΡΠ»ΡΡΠ²Π° Π² Π΅Π΄Π½Π° Π΄ΡΠ»Π³Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ, Π²ΡΠΏΡΠΎΡΡΡ ΡΠ΅ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠΈΡΠ° Π² βΠΊΠΎΠ»ΠΊΠΎ ΡΠ΅ ΡΠ²Π΅Π»ΠΈΡΠΈΠΌ ΡΠ°Π·ΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ?β ΠΡΠΎΠ΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° ΠΏΡΡΠ²Π°ΡΠ° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π·Π°Π²ΠΈΡΠΈ Π³Π»Π°Π²Π½ΠΎ ΠΎΡ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π½Π° ΠΌΠ°ΡΠ°ΡΠ°. ΠΡΠΎΠ΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° Π½ΠΎΠ²ΠΈΡ Π·Π°Π²ΠΈΡΠΈ ΠΎΡ ΡΠΎΠ²Π° ΠΊΠΎΠ»ΠΊΠΎ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ ΡΠ΅ ΡΠ΅ Π½Π°ΡΡΡΠΏΠ°Ρ Π² ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΡΠ°Π½ΡΡΠ΅ΡΠ° Π½Π° Π΄Π°Π½Π½ΠΈ, Ρ.Π΅. Π²ΡΡΡ Ρ ΠΈΠ½ΡΠ΅Π½Π·ΠΈΠ²Π½ΠΎΡΡΡΠ° Π½Π° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ. ΠΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° pg_repack ΡΠ΅ ΡΠ»ΡΡΠΈ Π² ΠΌΠΎΠΌΠ΅Π½Ρ Π½Π° ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΎ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ° ΠΈ ΡΠ°Π·ΠΌΠ΅ΡΡΡ Π½Π° ΠΏΡΠΎΠΌΡΠ½Π°ΡΠ° Π±Π΅ΡΠ΅ Π½Π΅ΡΡΠ°Π²Π½ΠΈΠΌΠΎ ΠΌΠ°Π»ΡΠΊ Π² ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Ρ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΈΡ ΡΠ°Π·ΠΌΠ΅Ρ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ°. Π Π΅ΡΠΈΡ ΠΌΠ΅, ΡΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠ΅Π½Π΅Π±ΡΠ΅Π³Π½Π΅ΠΌ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π½Π° Π½ΠΎΠ²Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ (Π·Π° ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ ΡΡΠ΅Π΄Π½ΠΎΡΠΎ Π΅ 1 ΡΠ°Ρ ΠΈ 2-3 ΠΌΠΈΠ½ΡΡΠΈ).
ΠΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΠ΅ Π±ΡΡ Π° ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»Π½ΠΈ. ΠΡΡΠ½Π΅ΡΠ΅ ΠΈ Π² ΠΏΡΠΎΠ΄Π°ΠΆΠ±Π°. ΠΠ° ΠΏΠΎ-Π³ΠΎΠ»ΡΠΌΠ° ΡΡΠ½ΠΎΡΠ°, Π΅ΡΠΎ ΡΠ½ΠΈΠΌΠΊΠ° Ρ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π½Π° Π΅Π΄Π½Π° ΠΎΡ Π±Π°Π·ΠΈΡΠ΅ ΡΠ»Π΅Π΄ ΠΏΡΠΎΠ±Π΅Π³Π°:
Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΡΠΎΠ²Π° ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½ΠΈ ΠΏΠΎΠ΄Ρ
ΠΎΠΆΠ΄Π° Π½Π°ΠΏΡΠ»Π½ΠΎ, Π½Π΅ ΡΠ΅ ΠΎΠΏΠΈΡΠ°Ρ
ΠΌΠ΅ Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠΈΠΌ Π²ΡΠΎΡΠΎΡΠΎ, Π½ΠΎ ΠΎΠ±ΠΌΠΈΡΠ»ΡΠΌΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π΄Π° Π³ΠΎ ΠΎΠ±ΡΡΠ΄ΠΈΠΌ Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π½Π° ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΠ΅ΡΠΎ. Π’Π΅ΠΊΡΡΠ°ΡΠ° Π½ΠΈ ΡΠ΅Π²ΠΈΠ·ΠΈΡ, Π·Π° ΡΡΠΆΠ°Π»Π΅Π½ΠΈΠ΅, Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π΅ Π΅ Π³ΠΎΡΠΎΠ²Π° Π·Π° ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½Π΅, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ΅ΡΠΈΡ
ΠΌΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠ°ΠΌΠΎ Ρ ΡΠ½ΠΈΠΊΠ°Π»Π½ΠΈ Π·Π°Π±Π°Π²Π΅Π½ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ, Π° Π·Π° ΠΏΡΠ»Π½ΠΎΠΏΡΠ°Π²Π΅Π½ ΠΏΠ°Ρ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° Π΄ΡΡΠ³ΠΈ ΡΠΈΠΏΠΎΠ²Π΅. ΠΠ°Π΄ΡΠ²Π°ΠΌΠ΅ ΡΠ΅ Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠ°Π²ΠΈΠΌ ΡΠΎΠ²Π° Π² Π±ΡΠ΄Π΅ΡΠ΅.
ΠΠΎΠΆΠ΅ Π±ΠΈ ΠΈΠΌΠ°ΡΠ΅ Π²ΡΠΏΡΠΎΡ, Π·Π°ΡΠΎ Π΄ΠΎΡΠΈ ΡΠ΅ Π²ΠΊΠ»ΡΡΠΈΡ ΠΌΠ΅ Π² ΡΠ°Π·ΠΈ ΠΈΡΡΠΎΡΠΈΡ Ρ ΡΡΡΠ²ΡΡΡΠ΅Π½ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° pg_repack ΠΈ Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΌΠ΅ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π½Π΅Π³ΠΎΠ²ΠΈΡΠ΅ Π°Π½Π°Π»ΠΎΠ·ΠΈ? Π Π½ΡΠΊΠ°ΠΊΡΠ² ΠΌΠΎΠΌΠ΅Π½Ρ ΠΈ Π½ΠΈΠ΅ ΡΠ΅ Π·Π°ΠΌΠΈΡΠ»ΠΈΡ ΠΌΠ΅ Π·Π° ΡΠΎΠ²Π°, Π½ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»Π½ΠΈΡΡ ΠΎΠΏΠΈΡ ΠΎΡ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ ΠΌΡ ΠΏΠΎ-ΡΠ°Π½ΠΎ, Π½Π° ΠΌΠ°ΡΠΈ Π±Π΅Π· ΠΎΡΠ»ΠΎΠΆΠ΅Π½ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ, Π½ΠΈ ΠΌΠΎΡΠΈΠ²ΠΈΡΠ° Π΄Π° ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ ΡΡΡΠ½ΠΎΡΡΡΠ° Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΈ Π΄Π° Π³ΠΎ ΠΏΠΎΠΏΡΠ°Π²ΠΈΠΌ. Π Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° Π΄ΡΡΠ³ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΡΠΎ ΠΈΠ·ΠΈΡΠΊΠ²Π° Π²ΡΠ΅ΠΌΠ΅ Π·Π° ΠΏΡΠΎΠ²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° ΡΠ΅ΡΡΠΎΠ²Π΅, ΡΠ°ΠΊΠ° ΡΠ΅ ΡΠ΅ΡΠΈΡ ΠΌΠ΅, ΡΠ΅ ΠΏΡΡΠ²ΠΎ ΡΠ΅ ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° ΠΊΠΎΡΠΈΠ³ΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π² Π½Π΅Π³ΠΎ ΠΈ Π°ΠΊΠΎ ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ, ΡΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ Π² ΡΠ°Π·ΡΠΌΠ΅Π½ ΡΡΠΎΠΊ, ΡΠΎΠ³Π°Π²Π° ΡΠ΅ Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ Π΄Π° ΠΎΠ±ΠΌΠΈΡΠ»ΡΠΌΠ΅ Π°Π½Π°Π»ΠΎΠ·ΠΈ.
ΠΠ°Π½Π½ΠΈ
ΠΠ°ΠΊΠ²ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ°ΠΌΠ΅ Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° Π½Π°ΡΠΈΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½ ΠΎΠΏΠΈΡ:
- Π‘Π»Π΅Π΄Π΅ΡΠ΅ ΠΏΠΎΠ΄ΡΠ²Π°Π½Π΅ΡΠΎ ΡΠΈ. ΠΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΎΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° ΡΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅ ΠΊΠΎΠ»ΠΊΠΎ Π΄ΠΎΠ±ΡΠ΅ Π΅ Π½Π°ΡΡΡΠΎΠ΅Π½ Π°Π²ΡΠΎΠ²Π°ΠΊΡΡΠΌΡΡ.
- ΠΠ°Π΄Π°ΠΉΡΠ΅ AUTOVACUUM, Π·Π° Π΄Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°ΡΠ΅ ΠΏΠΎΠ΄ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΈΠ΅ΠΌΠ»ΠΈΠ²ΠΎ Π½ΠΈΠ²ΠΎ.
- ΠΠΊΠΎ ΠΏΠΎΠ΄ΡΠ²Π°Π½Π΅ΡΠΎ Π²ΡΠ΅ ΠΎΡΠ΅ ΡΠ°ΡΡΠ΅ ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ΅ ΡΠΏΡΠ°Π²ΠΈΡΠ΅ Ρ Π½Π΅Π³ΠΎ Ρ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ ΠΈΠ·Π²ΡΠ½ ΠΊΡΡΠΈΡΡΠ°, Π½Π΅ ΡΠ΅ ΡΡΡΠ°Ρ ΡΠ²Π°ΠΉΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Π²ΡΠ½ΡΠ½ΠΈ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ. ΠΡΠ½ΠΎΠ²Π½ΠΎΡΠΎ Π½Π΅ΡΠΎ Π΅ Π΄Π° ΡΠ΅ΡΡΠ²Π°ΡΠ΅ Π²ΡΠΈΡΠΊΠΎ Π΄ΠΎΠ±ΡΠ΅.
- ΠΠ΅ ΡΠ΅ ΡΡΡΠ°Ρ ΡΠ²Π°ΠΉΡΠ΅ Π΄Π° ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠ°ΡΠ΅ Π²ΡΠ½ΡΠ½ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ, Π·Π° Π΄Π° ΠΎΡΠ³ΠΎΠ²Π°ΡΡΡ Π½Π° Π²Π°ΡΠΈΡΠ΅ Π½ΡΠΆΠ΄ΠΈ - ΠΏΠΎΠ½ΡΠΊΠΎΠ³Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎ-Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΠΈ Π΄ΠΎΡΠΈ ΠΏΠΎ-Π»Π΅ΡΠ½ΠΎ ΠΎΡ ΠΏΡΠΎΠΌΡΠ½Π°ΡΠ° Π½Π° Π²Π°ΡΠΈΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½ ΠΊΠΎΠ΄.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com