Postgres: Ρ€Π°Π·Π΄ΡƒΠ²Π°Π½Π΅, pg_repack ΠΈ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΈ ограничСния

Postgres: Ρ€Π°Π·Π΄ΡƒΠ²Π°Π½Π΅, pg_repack ΠΈ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΈ ограничСния

Π•Ρ„Π΅ΠΊΡ‚ΡŠΡ‚ Π½Π° Π½Π°Π΄ΡƒΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ ΠΈ индСкси (bloat) Π΅ ΡˆΠΈΡ€ΠΎΠΊΠΎ извСстСн ΠΈ ΠΏΡ€ΠΈΡΡŠΡΡ‚Π²Π° Π½Π΅ само Π² Postgres. Π‘ΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‚ Π½Π°Ρ‡ΠΈΠ½ΠΈ Π·Π° справянС с Π½Π΅Π³ΠΎ "ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠ°Ρ‚Π°", ΠΊΠ°Ρ‚ΠΎ VACUUM FULL ΠΈΠ»ΠΈ CLUSTER, Π½ΠΎ Ρ‚Π΅ Π±Π»ΠΎΠΊΠΈΡ€Π°Ρ‚ Ρ‚Π°Π±Π»ΠΈΡ†ΠΈΡ‚Π΅ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° ΠΈ слСдоватСлно Π½Π΅ Π²ΠΈΠ½Π°Π³ΠΈ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ.

Π’ статията Ρ‰Π΅ ΠΈΠΌΠ° ΠΌΠ°Π»ΠΊΠΎ тСория Π·Π° Ρ‚ΠΎΠ²Π° ΠΊΠ°ΠΊ възниква bloat, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° сС Π±ΠΎΡ€ΠΈΠΌ с Π½Π΅Π³ΠΎ, Π·Π° ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΈΡ‚Π΅ ограничСния ΠΈ Π·Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈΡ‚Π΅, ΠΊΠΎΠΈΡ‚ΠΎ Ρ‚Π΅ внасят Π² ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΠ΅Ρ‚ΠΎ pg_repack.

Π’Π°Π·ΠΈ статия Π΅ написана Π½Π° Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΌΠΎΠ΅Ρ‚ΠΎ прСдставянС Π½Π° PgConf.Russia 2020.

Π’ΡŠΠ·ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄ΠΈ Π²ΠΈΠ΄Π΅ΠΎ

Π—Π°Ρ‰ΠΎ възниква bloat

Π’ основата Π½Π° Postgres Π»Π΅ΠΆΠΈ многовСрсионната ΠΌΠΎΠ΄Π΅Π» (MVCC). Π‘ΡŠΡ‰Π½ΠΎΡΡ‚Ρ‚Π° ΠΌΡƒ Π΅, Ρ‡Π΅ всСки Ρ€Π΅Π΄ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° няколко вСрсии, ΠΊΠ°Ρ‚ΠΎ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈΡ‚Π΅ Π²ΠΈΠΆΠ΄Π°Ρ‚ Π½Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΎΡ‚ Π΅Π΄Π½Π° ΠΎΡ‚ Ρ‚Π΅Π·ΠΈ вСрсии, Π½ΠΎ Π½Π΅ Π΅ Π·Π°Π΄ΡŠΠ»ΠΆΠΈΡ‚Π΅Π»Π½ΠΎ Π΄Π° бъдС Π΅Π΄Π½Π° ΠΈ ΡΡŠΡ‰Π°. Π’ΠΎΠ²Π° позволява Π½Π° няколко Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π΄Π° работят Π΅Π΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ практичСски Π΄Π° Π½Π΅ ΠΎΠΊΠ°Π·Π²Π°Ρ‚ влияниС Π΅Π΄Π½Π° Π½Π° Π΄Ρ€ΡƒΠ³Π°.

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ Π΅, Ρ‡Π΅ всички Ρ‚Π΅Π·ΠΈ вСрсии трябва Π΄Π° сС ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Ρ‚. Postgres Ρ€Π°Π±ΠΎΡ‚ΠΈ с ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π° странично ΠΈ страницата Π΅ минималният ΠΎΠ±Π΅ΠΌ Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΉΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Π½ ΠΎΡ‚ диска ΠΈΠ»ΠΈ записан. НСка Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ малък ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π° Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ ΠΊΠ°ΠΊ става Ρ‚ΠΎΠ²Π°.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Π΅ ΠΈΠΌΠ°ΠΌΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Π°, Π² която Π΄ΠΎΠ±Π°Π²ΠΈΡ…ΠΌΠ΅ няколко записа. На ΠΏΡŠΡ€Π²Π°Ρ‚Π° страница Π½Π° Ρ„Π°ΠΉΠ»Π°, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ Π΅ ΡΡŠΡ…Ρ€Π°Π½Π΅Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π°, сС появиха Π½ΠΎΠ²ΠΈ Π΄Π°Π½Π½ΠΈ. Π’ΠΎΠ²Π° са ΠΆΠΈΠ²ΠΈΡ‚Π΅ вСрсии Π½Π° Ρ€Π΅Π΄ΠΎΠ²Π΅Ρ‚Π΅, ΠΊΠΎΠΈΡ‚ΠΎ са Π΄ΠΎΡΡ‚ΡŠΠΏΠ½ΠΈ Π·Π° Π΄Ρ€ΡƒΠ³ΠΈΡ‚Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ слСд ΠΊΠΎΠΌΠΈΡ‚ (Π·Π° опростСност, Π΄Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ΅ΠΌ, Ρ‡Π΅ Π½ΠΈΠ²ΠΎΡ‚ΠΎ Π½Π° изолация Π΅ Read Committed).

Postgres: Ρ€Π°Π·Π΄ΡƒΠ²Π°Π½Π΅, pg_repack ΠΈ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΈ ограничСния

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°Ρ…ΠΌΠ΅ Π΅Π΄Π½Π° ΠΎΡ‚ записитС ΠΈ ΠΏΠΎ Ρ‚ΠΎΠ·ΠΈ Π½Π°Ρ‡ΠΈΠ½ ΠΌΠ°Ρ€ΠΊΠΈΡ€Π°Ρ…ΠΌΠ΅ старата вСрсия ΠΊΠ°Ρ‚ΠΎ Π½Π΅Π°ΠΊΡ‚ΡƒΠ°Π»Π½Π°.

Postgres: Ρ€Π°Π·Π΄ΡƒΠ²Π°Π½Π΅, pg_repack ΠΈ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΈ ограничСния

Π‘Ρ‚ΡŠΠΏΠΊΠ° ΠΏΠΎ ΡΡ‚ΡŠΠΏΠΊΠ°, Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°ΠΉΠΊΠΈ ΠΈ ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°ΠΉΠΊΠΈ вСрсии Π½Π° Ρ€Π΅Π΄ΠΎΠ²Π΅, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ…ΠΌΠ΅ страница, Π² която ΠΎΠΊΠΎΠ»ΠΎ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ са "Π±ΠΎΠΊΠ»ΡƒΠΊ". Π’Π΅Π·ΠΈ Π΄Π°Π½Π½ΠΈ Π½Π΅ са Π²ΠΈΠ΄ΠΈΠΌΠΈ Π·Π° Π½ΠΈΡ‚ΠΎ Π΅Π΄Π½Π° транзакция.

Postgres: Ρ€Π°Π·Π΄ΡƒΠ²Π°Π½Π΅, pg_repack ΠΈ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΈ ограничСния

Π’ Postgres ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ VACUUM, ΠΊΠΎΠΉΡ‚ΠΎ почиства Π½Π΅Π°ΠΊΡ‚ΡƒΠ°Π»Π½ΠΈΡ‚Π΅ вСрсии ΠΈ освобоТдава място Π·Π° Π½ΠΎΠ²ΠΈ Π΄Π°Π½Π½ΠΈ. Но Π°ΠΊΠΎ Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½ Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ агрСсивно ΠΈΠ»ΠΈ Π΅ Π·Π°Π΅Ρ‚ с Ρ€Π°Π±ΠΎΡ‚Π° Π² Π΄Ρ€ΡƒΠ³ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ, "Π±ΠΎΠΊΠ»ΡƒΠΊΡŠΡ‚" остава, ΠΈ Π½ΠΈΠ΅ смС ΠΏΡ€ΠΈΠ½ΡƒΠ΄Π΅Π½ΠΈ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ страници Π·Π° Π½ΠΎΠ²ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ.

Π’Π°ΠΊΠ° Π² нашия ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² Π΅Π΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° Ρ‰Π΅ сС ΡΡŠΡΡ‚ΠΎΠΈ ΠΎΡ‚ Ρ‡Π΅Ρ‚ΠΈΡ€ΠΈ страници, Π½ΠΎ ΠΆΠΈΠ²ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ Π² нСя Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ само ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°Ρ‚Π°. Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π°, ΠΏΡ€ΠΈ Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π°, Ρ‰Π΅ ΠΈΠ·Ρ‡ΠΈΡ‚Π°ΠΌΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π΄Π°Π½Π½ΠΈ, ΠΎΡ‚ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ.

Postgres: Ρ€Π°Π·Π΄ΡƒΠ²Π°Π½Π΅, pg_repack ΠΈ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΈ ограничСния

Π”ΠΎΡ€ΠΈ Π°ΠΊΠΎ VACUUM Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° ΠΏΡ€Π΅ΠΌΠ°Ρ…Π½Π΅ всички Π½Π΅Π°ΠΊΡ‚ΡƒΠ°Π»Π½ΠΈ вСрсии Π½Π° Ρ€Π΅Π΄ΠΎΠ²Π΅Ρ‚Π΅, ситуацията няма Π΄Π° сС ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΠΈ драстично. Π©Π΅ ΠΈΠΌΠ°ΠΌΠ΅ свободно пространство Π½Π° страницитС ΠΈΠ»ΠΈ Π΄ΠΎΡ€ΠΈ Ρ†Π΅Π»ΠΈ страници Π·Π° Π½ΠΎΠ²ΠΈ Ρ€Π΅Π΄ΠΎΠ²Π΅, Π½ΠΎ всС ΠΏΠ°ΠΊ Ρ‰Π΅ ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°ΠΌΠ΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ, ΠΎΡ‚ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ.
ΠœΠ΅ΠΆΠ΄Ρƒ Π΄Ρ€ΡƒΠ³ΠΎΡ‚ΠΎ, Π°ΠΊΠΎ напълно ΠΏΡ€Π°Π·Π½Π°Ρ‚Π° страница (Π²Ρ‚ΠΎΡ€Π°Ρ‚Π° Π² нашия ΠΏΡ€ΠΈΠΌΠ΅Ρ€) Π΅ накрая Π½Π° Ρ„Π°ΠΉΠ»Π°, VACUUM Π±ΠΈ могъл Π΄Π° я ΠΎΡ‚Ρ€Π΅ΠΆΠ°. Но Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° тя сС Π½Π°ΠΌΠΈΡ€Π° Π² срСдата, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ Π½ΠΈΡ‰ΠΎ с нСя.

Postgres: Ρ€Π°Π·Π΄ΡƒΠ²Π°Π½Π΅, pg_repack ΠΈ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΈ ограничСния

ΠšΠΎΠ³Π°Ρ‚ΠΎ броят Π½Π° ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ ΠΏΡ€Π°Π·Π½ΠΈ ΠΈΠ»ΠΈ силно Ρ€Π°Π·Ρ€Π΅Π΄Π΅Π½ΠΈ страници станС голям, ΠΊΠΎΠ΅Ρ‚ΠΎ сС Π½Π°Ρ€ΠΈΡ‡Π° bloat, Ρ‚ΠΎΠ²Π° Π·Π°ΠΏΠΎΡ‡Π²Π° Π΄Π° влияС Π½Π° производитСлността.

Всичко описано ΠΏΠΎ-Π³ΠΎΡ€Π΅ Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠΊΠ°Ρ‚Π° Π½Π° възникванС Π½Π° bloat Π² Ρ‚Π°Π±Π»ΠΈΡ†ΠΈΡ‚Π΅. Π’ индСкситС Ρ‚ΠΎΠ²Π° сС случва ΠΏΠΎ ΡΡŠΡ‰ΠΈΡ Π½Π°Ρ‡ΠΈΠ½.

Имам ли bloat?

Има няколко Π½Π°Ρ‡ΠΈΠ½Π° Π΄Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ Π΄Π°Π»ΠΈ ΠΈΠΌΠ°Ρ‚Π΅ bloat. Π˜Π΄Π΅ΡΡ‚Π° Π½Π° ΠΏΡŠΡ€Π²ΠΈΡ Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ Π²ΡŠΡ‚Ρ€Π΅ΡˆΠ½Π°Ρ‚Π° статистика Π½Π° Postgres, която ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»Π½Π° информация Π·Π° броя Π½Π° Ρ€Π΅Π΄ΠΎΠ²Π΅Ρ‚Π΅ Π² Ρ‚Π°Π±Π»ΠΈΡ†ΠΈΡ‚Π΅, броя Π½Π° β€œΠΆΠΈΠ²ΠΈΡ‚Π΅β€ Ρ€Π΅Π΄ΠΎΠ²Π΅ ΠΈ Π΄Ρ€. Π’ ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π²Π°Ρ€ΠΈΠ°Ρ†ΠΈΠΈ Π½Π° Π³ΠΎΡ‚ΠΎΠ²ΠΈ скриптовС. НиС Π²Π·Π΅Ρ…ΠΌΠ΅ Π·Π° основа скрипт ΠΎΡ‚ PostgreSQL Experts, ΠΊΠΎΠΉΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΎΡ†Π΅Π½ΠΈ bloat Π² Ρ‚Π°Π±Π»ΠΈΡ†ΠΈΡ‚Π΅ Π·Π°Π΅Π΄Π½ΠΎ с toast ΠΈ bloat btree индСкситС. Π‘ΠΏΠΎΡ€Π΅Π΄ нашия ΠΎΠΏΠΈΡ‚, Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° Π³Ρ€Π΅ΡˆΠΊΠ° Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ 10-20%.

Π”Ρ€ΡƒΠ³ Π½Π°Ρ‡ΠΈΠ½ Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ pgstattuple, ΠΊΠΎΠ΅Ρ‚ΠΎ позволява Π΄Π° сС Π²ΠΈΠ΄ΠΈ Π²ΡŠΡ‚Ρ€Π΅ Π² страницитС ΠΈ Π΄Π° сС ΠΏΠΎΠ»ΡƒΡ‡ΠΈ ΠΊΠ°ΠΊΡ‚ΠΎ ΠΎΡ†Π΅Π½ΡŠΡ‡Π½ΠΎ, Ρ‚Π°ΠΊΠ° ΠΈ Ρ‚ΠΎΡ‡Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π° bloat. Но Π² Ρ‚ΠΎΠ·ΠΈ случай Ρ‰Π΅ трябва Π΄Π° сканиратС цялата Ρ‚Π°Π±Π»ΠΈΡ†Π°.

Ниско Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π° bloat, Π΄ΠΎ 20%, считамС Π·Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ»ΠΈΠ²ΠΎ. МоТС Π΄Π° сС счита Π·Π° Π°Π½Π°Π»ΠΎΠ³ Π½Π° fillfactor Π·Π° Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ ΠΈ индСкси. ΠŸΡ€ΠΈ 50% ΠΈ ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π°Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ с производитСлността.

ΠœΠ΅Ρ‚ΠΎΠ΄ΠΈ Π·Π° Π±ΠΎΡ€Π±Π° с bloat

Π’ Postgres ΠΈΠΌΠ° няколко ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π·Π° Π±ΠΎΡ€Π±Π° с bloat "извън кутията", Π½ΠΎ Ρ‚Π΅ Π½Π΅ Π²ΠΈΠ½Π°Π³ΠΈ са ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈΠΌΠΈ Π·Π° всички.

НастройтС AUTOVACUUM, Π·Π° Π΄Π° ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚Π΅ появата Π½Π° bloat. И Π·Π° Π΄Π° бъдС ΠΏΠΎ-Ρ‚ΠΎΡ‡Π½ΠΎ, Π·Π° Π΄Π° сС ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° Π½Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ»ΠΈΠ²ΠΎ Π·Π° вас Π½ΠΈΠ²ΠΎ. ИзглСТда, Ρ‡Π΅ Ρ‚ΠΎΠ²Π° Π΅ β€žΠΊΠ°ΠΏΠΈΡ‚Π°Π½ΠΎΠ²β€œ ΡΡŠΠ²Π΅Ρ‚, Π½ΠΎ Π² дСйствитСлност Π½Π΅ Π²ΠΈΠ½Π°Π³ΠΈ Π΅ лСсно Π΄Π° сС постигнС. НапримСр, Π°ΠΊΠΎ Π°ΠΊΡ‚ΠΈΠ²Π½Π°Ρ‚Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π²ΠΊΠ»ΡŽΡ‡Π²Π° Ρ€Π΅Π΄ΠΎΠ²Π½ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² схСмата Π½Π° Π΄Π°Π½Π½ΠΈΡ‚Π΅ ΠΈΠ»ΠΈ сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° миграция Π½Π° Π΄Π°Π½Π½ΠΈ. Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π° ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŠΡ‚ Π½Π° Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅ ΠΌΠΎΠΆΠ΅ чСсто Π΄Π° сС промСня ΠΈ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ Ρ‚ΠΎΠΉ Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π΅Π½ Π·Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎ, трябва Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈΡ‚Π΅ ΠΌΠ°Π»ΠΊΠΎ Π½Π°ΠΏΡ€Π΅Π΄ ΠΈ Π΄Π° настроитС AUTOVACUUM спорСд промСнящия сС ΠΏΡ€ΠΎΡ„ΠΈΠ» Π½Π° всяка Ρ‚Π°Π±Π»ΠΈΡ†Π°. Но ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ Π΅, Ρ‡Π΅ Π½Π΅ Π΅ лСсно Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ Ρ‚ΠΎΠ²Π°.

Π”Ρ€ΡƒΠ³ разпространСн ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, ΠΏΠΎΡ€Π°Π΄ΠΈ ΠΊΠΎΠΉΡ‚ΠΎ AUTOVACUUM Π½Π΅ успява Π΄Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†ΠΈΡ‚Π΅, Π΅ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅Ρ‚ΠΎ Π½Π° дълги Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π΅ ΠΌΡƒ позволяват Π΄Π° изчисти Π΄Π°Π½Π½ΠΈ, Π·Π°Ρ‰ΠΎΡ‚ΠΎ Ρ‚Π΅ са Π΄ΠΎΡΡ‚ΡŠΠΏΠ½ΠΈ Π·Π° Ρ‚Π΅Π·ΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ. ΠŸΡ€Π΅ΠΏΠΎΡ€ΡŠΠΊΠ°Ρ‚Π° Ρ‚ΡƒΠΊ ΡΡŠΡ‰ΠΎ Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Π° – ΠΈΠ·Π±Π°Π²Π΅Ρ‚Π΅ сС ΠΎΡ‚ β€žΠ²ΠΈΡΡΡ‰ΠΈβ€œ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€Π°ΠΉΡ‚Π΅ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π½Π° Π°ΠΊΡ‚ΠΈΠ²Π½ΠΈΡ‚Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ. Но Π°ΠΊΠΎ Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π²Π°ΡˆΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΅ Ρ…ΠΈΠ±Ρ€ΠΈΠ΄ ΠΌΠ΅ΠΆΠ΄Ρƒ OLAP ΠΈ OLTP, Ρ‚ΠΎ Π²ΠΈΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ°Ρ‚Π΅ ΠΊΠ°ΠΊΡ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ чСсти Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ ΠΊΡ€Π°Ρ‚ΠΊΠΈ заявки, Ρ‚Π°ΠΊΠ° ΠΈ дълги ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ – Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΎΡ‚Ρ‡Π΅Ρ‚. Π’ Ρ‚Π°ΠΊΠ°Π²Π° ситуация, си струва Π΄Π° помислитС Π·Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π±Π°Π·ΠΈ, ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‰Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ ΠΏΠΎ-Ρ„ΠΈΠ½Π½Π° настройка Π½Π° всяка ΠΎΡ‚ тях.

ΠžΡ‰Π΅ Π΅Π΄ΠΈΠ½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ – Π΄ΠΎΡ€ΠΈ Π°ΠΊΠΎ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŠΡ‚ Π΅ Ρ…ΠΎΠΌΠΎΠ³Π΅Π½Π΅Π½, Π½ΠΎ Π‘Π” Π΅ ΠΏΠΎΠ΄ ΠΌΠ½ΠΎΠ³ΠΎ високо Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅, Π΄ΠΎΡ€ΠΈ максимално агрСсивСн AUTOVACUUM ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π΅ сС справи ΠΈ bloat Π΄Π° сС появи. ΠœΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€Π°Π½Π΅ (Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»Π½ΠΎ ΠΈΠ»ΠΈ Ρ…ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»Π½ΠΎ) – СдинствСното Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅.

Какво Π΄Π° ΠΏΡ€Π°Π²ΠΈΠΌ Π² ситуация, ΠΊΠΎΠ³Π°Ρ‚ΠΎ стС настроили AUTOVACUUM, Π½ΠΎ bloat ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠ°Π²Π° Π΄Π° нараства?

Π•ΠΊΠΈΠΏ VACUUM FULL прСструктурира ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†ΠΈΡ‚Π΅ ΠΈ индСкси ΠΈ оставя само Π°ΠΊΡ‚ΡƒΠ°Π»Π½ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ Π² тях. Π—Π° ΠΏΡ€Π΅ΠΌΠ°Ρ…Π²Π°Π½Π΅ Π½Π° bloat Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΈΠ΄Π΅Π°Π»Π½ΠΎ, Π½ΠΎ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Π½Π΅ΠΉΠ½ΠΎΡ‚ΠΎ изпълнСниС сС ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π° Сксклузивна Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° (AccessExclusiveLock), която Π½Π΅ позволява ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° заявки към Ρ‚Π°Π·ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Π°, Π΄ΠΎΡ€ΠΈ ΠΈ select-ΠΎΠ²Π΅. Ако ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° си ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚Π΅ Π΄Π° спрСтС вашия сСрвис ΠΈΠ»ΠΈ Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° част Π·Π° извСстно Π²Ρ€Π΅ΠΌΠ΅ (ΠΎΡ‚ дСсСтки ΠΌΠΈΠ½ΡƒΡ‚ΠΈ Π΄ΠΎ няколко часа Π² зависимост ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° Π‘Π” ΠΈ Π²Π°ΡˆΠ΅Ρ‚ΠΎ ΠΎΠ±ΠΎΡ€ΡƒΠ΄Π²Π°Π½Π΅), Ρ‚ΠΎ Ρ‚ΠΎΠ·ΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π΅ Π½Π°ΠΉ-Π΄ΠΎΠ±ΡŠΡ€. Π—Π° съТалСниС, нямамС Π²Ρ€Π΅ΠΌΠ΅ Π΄Π° изпълним VACUUM FULL Π² Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° Π·Π°ΠΏΠ»Π°Π½ΡƒΠ²Π°Π½ΠΎΡ‚ΠΎ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Π½Π΅, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Ρ‚ΠΎΠ·ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π΅ Π΅ подходящ Π·Π° нас.

Π•ΠΊΠΈΠΏ CLUSTER прСмСства ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†ΠΈΡ‚Π΅, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° VACUUM FULL, Π½ΠΎ позволява Π΄Π° посочитС индСкс, ΠΏΠΎ ΠΊΠΎΠΉΡ‚ΠΎ Π΄Π°Π½Π½ΠΈΡ‚Π΅ Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ физичСски Π½Π°Ρ€Π΅Π΄Π΅Π½ΠΈ Π½Π° диска (Π½ΠΎ Π² Π±ΡŠΠ΄Π΅Ρ‰Π΅ Ρ€Π΅Π΄ΡŠΡ‚ Π½Π΅ Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€Π°Π½ Π·Π° Π½ΠΎΠ²ΠΈΡ‚Π΅ Ρ€Π΅Π΄ΠΎΠ²Π΅). Π’ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ ситуации Ρ‚ΠΎΠ²Π° Π΅ Π΄ΠΎΠ±Ρ€Π° оптимизация Π·Π° Ρ€Π΅Π΄ΠΈΡ†Π° заявки – с Ρ‡Π΅Ρ‚Π΅Π½Π΅ Π½Π° няколко записа ΠΏΠΎ индСкс. ΠΠ΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΠΊΡŠΡ‚ Π½Π° Ρ‚Π°Π·ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π΅ ΡΡŠΡ‰ΠΈΡΡ‚ ΠΊΠ°Ρ‚ΠΎ ΠΏΡ€ΠΈ VACUUM FULL – тя Π±Π»ΠΎΠΊΠΈΡ€Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°.

Π•ΠΊΠΈΠΏ REINDEX Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π½Π° Π½Π° Π΄Π²Π΅Ρ‚Π΅ ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈ, Π½ΠΎ ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° рСконструкция Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π΅Π½ индСкс ΠΈΠ»ΠΈ Π½Π° всички индСкси Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π°. Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈΡ‚Π΅ са ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-слаби: ShareLock Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° (влияС Π½Π° ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈΡ‚Π΅, Π½ΠΎ позволява изпълнСниС Π½Π° select) ΠΈ AccessExclusiveLock Π½Π° рСконструирания индСкс (Π±Π»ΠΎΠΊΠΈΡ€Π° заявки, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‰ΠΈ Ρ‚ΠΎΠ·ΠΈ индСкс). Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π°, Π² 12-Ρ‚Π° вСрсия Π½Π° Postgres Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ CONCURRENTLY, ΠΊΠΎΠΉΡ‚ΠΎ позволява рСконструкция Π½Π° индСкса Π±Π΅Π· Π±Π»ΠΎΠΊΠΈΡ€Π°Π½Π΅ Π½Π° ΠΏΠ°Ρ€Π°Π»Π΅Π»Π½ΠΎΡ‚ΠΎ добавянС, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅ Π½Π° записи.

Π’ ΠΏΠΎ-Ρ€Π°Π½Π½ΠΈ вСрсии Π½Π° Postgres ΠΌΠΎΠΆΠ΅ Π΄Π° сС постигнС Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚, ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π° REINDEX CONCURRENTLY, с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° CREATE INDEX CONCURRENTLY. Π’ΠΎΠΉ позволява Π΄Π° сС създадС индСкс Π±Π΅Π· строга Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° (ShareUpdateExclusiveLock, която Π½Π΅ ΠΏΡ€Π΅Ρ‡ΠΈ Π½Π° ΠΏΠ°Ρ€Π°Π»Π΅Π»Π½ΠΈΡ‚Π΅ заявки), слСд ΠΊΠΎΠ΅Ρ‚ΠΎ Π΄Π° сС Π·Π°ΠΌΠ΅Π½ΠΈ старият индСкс с новия ΠΈ Π΄Π° сС ΠΈΠ·Ρ‚Ρ€ΠΈΠ΅ старият индСкс. Π’ΠΎΠ²Π° позволява Π΄Π° сС отстрани bloat Π½Π° индСкситС, Π±Π΅Π· Π΄Π° сС ΠΏΡ€Π΅Ρ‡ΠΈ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½Π° Π²Π°ΡˆΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π’Π°ΠΆΠ½ΠΎ Π΅ Π΄Π° сС ΠΈΠΌΠ° ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄, Ρ‡Π΅ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° рСконструкция Π½Π° индСкситС Ρ‰Π΅ ΠΈΠΌΠ° Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½Π° натоварСност Π½Π° дисковата подсистСма.

Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎ, Π°ΠΊΠΎ Π·Π° индСкситС ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‚ Π½Π°Ρ‡ΠΈΠ½ΠΈ Π·Π° отстраняванС Π½Π° bloat β€œΠ² двиТСниС”, Ρ‚ΠΎ Π·Π° Ρ‚Π°Π±Π»ΠΈΡ†ΠΈΡ‚Π΅ Ρ‚Π°ΠΊΠΈΠ²Π° Π½Π΅ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‚. Π’ΡƒΠΊ Π²Π»ΠΈΠ·Π°Ρ‚ Π² дСйствиС Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ външни Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΡ: pg_repack (ΠΏΡ€Π΅Π΄ΠΈ pg_reorg), pgcompact, pgcompacttable ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ. Π’ Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° Ρ‚Π°Π·ΠΈ статия, Π°Π· няма Π΄Π° Π³ΠΈ сравнявам ΠΈ Ρ‰Π΅ Ρ€Π°Π·ΠΊΠ°ΠΆΠ° само Π·Π° pg_repack, ΠΊΠΎΠ΅Ρ‚ΠΎ слСд извСстно Π΄ΠΎΡ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΏΡ€ΠΈ нас.

Как Ρ€Π°Π±ΠΎΡ‚ΠΈ pg_repack

Postgres: Ρ€Π°Π·Π΄ΡƒΠ²Π°Π½Π΅, 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: Ρ€Π΅ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈΡ€Π°Π½Π΅ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° "tablename"
ERROR: заявката Π½Π΅ успя: 
    ERROR: Π΄ΡƒΠ±Π»ΠΈΡ€Π°Π½Π° стойност Π½Π° ΠΊΠ»ΡŽΡ‡ Π½Π°Ρ€ΡƒΡˆΠ°Π²Π° ΡƒΠ½ΠΈΠΊΠ°Π»Π½ΠΎΡ‚ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ "index_16508"
DETAIL: ΠšΠ»ΡŽΡ‡ΡŠΡ‚ (id, index)=(100500, 42) Π²Π΅Ρ‡Π΅ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°.

Π’ΠΎΠ²Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ имашС Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½ΠΎ Π½Π°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ index_16508 – създадСно Π΅ ΠΎΡ‚ pg_repack. По Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΈΡ‚Π΅, Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈ Π² Π½Π΅Π³ΠΎ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ…ΠΌΠ΅ β€œΠ½Π°ΡˆΠ΅Ρ‚ΠΎβ€ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΌΡƒ отговаря. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡŠΡ‚ сС ΠΎΠΊΠ°Π·Π°, Ρ‡Π΅ Ρ‚ΠΎΠ²Π° Π½Π΅ Π΅ съвсСм ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅, Π° ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΎ (deferred constraint), Ρ‚.Π΅. ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°Ρ‚Π° ΠΌΡƒ сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° ΠΏΠΎ-късно ΠΎΡ‚ sql ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ Π²ΠΎΠ΄ΠΈ Π΄ΠΎ Π½Π΅ΠΎΡ‡Π°ΠΊΠ²Π°Π½ΠΈ послСдици.

ΠžΡ‚Π»ΠΎΠΆΠ΅Π½ΠΈ ограничСния: Π·Π°Ρ‰ΠΎ са Π½ΡƒΠΆΠ½ΠΈ ΠΈ ΠΊΠ°ΠΊ работят

Малко тСория Π·Π° ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΈΡ‚Π΅ ограничСния.
НСка Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ прост ΠΏΡ€ΠΈΠΌΠ΅Ρ€: ΠΈΠΌΠ°ΠΌΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Π°-справочник Π½Π° Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΠΈ с Π΄Π²Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° – Π½Π°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Ρ€Π΅Π΄ Π½Π° Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»Π° Π² справочника.
Postgres: Ρ€Π°Π·Π΄ΡƒΠ²Π°Π½Π΅, 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] Π“Π Π•Π¨ΠšΠ: Π΄ΡƒΠ±Π»ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π° стойност Π½Π°Ρ€ΡƒΡˆΠ°Π²Π° ΡƒΠ½ΠΈΠΊΠ°Π»Π½Π°Ρ‚Π° ограничСност β€œuk_cars”
Π”Π΅Ρ‚Π°ΠΉΠ»ΠΈ: ΠšΠ»ΡŽΡ‡ΡŠΡ‚ (ord)=(2) Π²Π΅Ρ‡Π΅ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°.

Как Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ Π½Π΅Ρ‰Π°Ρ‚Π° ΠΏΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π΅Π½ Π½Π°Ρ‡ΠΈΠ½? ΠŸΡŠΡ€Π²ΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚: Π΄ΠΎΠ±Π°Π²Π΅Ρ‚Π΅ Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½Π° замяна Π½Π° стойността Π½Π° Ρ€Π΅Π΄Π°, която със сигурност Π½Π΅ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π° Π² Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ β€œ-1”. Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Ρ‚ΠΎΠ²Π° сС Π½Π°Ρ€ΠΈΡ‡Π° β€œΡ€Π°Π·ΠΌΡΠ½Π° Π½Π° стойноститС Π½Π° Π΄Π²Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Ρ‡Ρ€Π΅Π· трСта”. ЕдинствСният Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΠΊ Π½Π° Ρ‚ΠΎΠ·ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π΅ Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΎΡ‚ΠΎ обновяванС.

Π’Ρ‚ΠΎΡ€ΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚: прСосмислСтС Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π°, Π·Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ ΠΏΠ»Π°Π²Π°Ρ‰Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π·Π° Ρ‚ΠΈΠΏ Π΄Π°Π½Π½ΠΈ Π·Π° стойността Π½Π° Ρ€Π΅Π΄Π° вмСсто Ρ†Π΅Π»ΠΈ числа. Π’ΠΎΠ³Π°Π²Π° ΠΏΡ€ΠΈ обновяванС Π½Π° стойността ΠΎΡ‚ 1, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π° 2,5, ΠΏΡŠΡ€Π²ΠΈΡΡ‚ запис Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ Ρ‰Π΅ β€œΠ²Π»Π΅Π·Π΅β€ ΠΌΠ΅ΠΆΠ΄Ρƒ втория ΠΈ трСтия. Π’ΠΎΠ²Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ, Π½ΠΎ ΠΈΠΌΠ° Π΄Π²Π΅ ограничСния. ΠŸΡŠΡ€Π²ΠΎ, Π½Π΅ Π΅ подходящо, Π°ΠΊΠΎ стойността сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° някъдС Π² интСрфСйса. Π’Ρ‚ΠΎΡ€ΠΎ, Π² зависимост ΠΎΡ‚ точността Π½Π° Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½ΠΈ, Ρ‰Π΅ ΠΈΠΌΠ°Ρ‚Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ Π±Ρ€ΠΎΠΉ възмоТни вставки, ΠΏΡ€Π΅Π΄ΠΈ Π΄Π° сС Π½Π°Π»ΠΎΠΆΠΈ ΠΏΡ€Π΅ΠΊΠ°Π»ΠΊΡƒΠ»ΠΈΡ€Π°Π½Π΅ Π½Π° стойноститС Π½Π° всички записи.

Π’Ρ€Π΅Ρ‚ΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚: Π½Π°ΠΏΡ€Π°Π²Π΅Ρ‚Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΎ, Π·Π° Π΄Π° сС провСрява само Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π½Π° ΠΊΠΎΠΌΠΈΡ‚Π°:

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

Въй ΠΊΠ°Ρ‚ΠΎ Π»ΠΎΠ³ΠΈΠΊΠ°Ρ‚Π° Π½Π° Π½Π°ΡˆΠ΅Ρ‚ΠΎ ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½ΠΎ Π·Π°ΠΏΠΈΡ‚Π²Π°Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€Π°, Ρ‡Π΅ Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π½Π° ΠΊΠΎΠΌΠΈΡ‚Π° всички стойности са ΡƒΠ½ΠΈΠΊΠ°Π»Π½ΠΈ, Ρ‚ΠΎ Ρ‚ΠΎ Ρ‰Π΅ сС изпълни ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ.

РазглСданият ΠΏΠΎ-Π³ΠΎΡ€Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ€Π°Π·Π±ΠΈΡ€Π° сС, Π΅ ΠΌΠ½ΠΎΠ³ΠΎ синтСтичСн, Π½ΠΎ Ρ€Π°Π·ΠΊΡ€ΠΈΠ²Π° идСята. Π’ Π½Π°ΡˆΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΈ ограничСния Π·Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° Π»ΠΎΠ³ΠΈΠΊΠ°Ρ‚Π°, която отговаря Π·Π° Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΈ, ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅ работят Π΅Π΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ с ΠΎΠ±Ρ‰ΠΈ ΠΎΠ±Π΅ΠΊΡ‚ΠΈ-Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΈ Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°. Π˜Π·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ‚Π°ΠΊΠΈΠ²Π° ограничСния Π½ΠΈ позволява Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ прилоТния ΠΊΠΎΠ΄ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-прост.

ΠžΠ±Ρ‰ΠΎ Π²Π·Π΅Ρ‚ΠΎ, Π² зависимост ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° Π½Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π² Postgres, ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‚ Ρ‚Ρ€ΠΈ Π½ΠΈΠ²Π° Π½Π° грануларност Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈΡ‚Π΅: Π½Π° Π½ΠΈΠ²ΠΎ Ρ€Π΅Π΄, транзакция ΠΈ ΠΈΠ·Ρ€Π°Π·.
Postgres: Ρ€Π°Π·Π΄ΡƒΠ²Π°Π½Π΅, pg_repack ΠΈ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΈ ограничСния
Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: begriffs

CHECK ΠΈ NOT NULL Π²ΠΈΠ½Π°Π³ΠΈ сС провСряват Π½Π° Π½ΠΈΠ²ΠΎ Ρ€Π΅Π΄; Π·Π° останалитС ограничСния, ΠΊΠ°ΠΊΠ²Π°Ρ‚ΠΎ Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π°, ΠΈΠΌΠ° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΈ. ΠŸΠΎΠ²Π΅Ρ‡Π΅ информация ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Π½Π° Ρ‚ΡƒΠΊ..

Накратко ΠΊΠ°Π·Π°Π½ΠΎ, ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΈΡ‚Π΅ ограничСния Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ ситуации прСдоставят ΠΏΠΎ-ясСн ΠΊΠΎΠ΄ Π·Π° Ρ‡Π΅Ρ‚Π΅Π½Π΅ ΠΈ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ. ΠžΠ±Π°Ρ‡Π΅ Π·Π° Ρ‚ΠΎΠ²Π° сС ΠΏΠ»Π°Ρ‰Π° с услоТняванС Π½Π° процСса Π½Π° дСбъгванС, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΡŠΡ‚ Π½Π° възникванС Π½Π° Π³Ρ€Π΅ΡˆΠΊΠ°Ρ‚Π° ΠΈ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΡŠΡ‚, Π² ΠΊΠΎΠΉΡ‚ΠΎ Π²ΠΈΠ΅ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚Π΅ Π·Π° нСя, са ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ΠΈ във Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ. ΠžΡ‰Π΅ Π΅Π΄ΠΈΠ½ възмоТСн ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π΅, Ρ‡Π΅ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‡ΡŠΡ‚ Π½Π΅ Π²ΠΈΠ½Π°Π³ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡŠΡΡ‚Π°Π²ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»Π΅Π½ ΠΏΠ»Π°Π½, Π°ΠΊΠΎ Π² заявката участва ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅.

Π”ΠΎΠ²ΡŠΡ€ΡˆΠ²Π°Π½Π΅ Π½Π° pg_repack

Π Π°Π·Π³Π»Π΅Π΄Π°Ρ…ΠΌΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ прСдставляват ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΈΡ‚Π΅ ограничСния, Π½ΠΎ ΠΊΠ°ΠΊ Ρ‚Π΅ са ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ с нашия ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ? НСка си ΠΏΡ€ΠΈΠΏΠΎΠΌΠ½ΠΈΠΌ Π³Ρ€Π΅ΡˆΠΊΠ°Ρ‚Π°, която ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ…ΠΌΠ΅ ΠΏΠΎ-Ρ€Π°Π½ΠΎ:

$ ./pg_repack -t tablename -o id
INFO: Ρ€Π΅ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈΡ€Π°Π½Π΅ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° "tablename"
ERROR: заявката Π½Π΅ успя: 
    ERROR: Π΄ΡƒΠ±Π»ΠΈΡ€Π°Π½Π° стойност Π½Π° ΠΊΠ»ΡŽΡ‡ Π½Π°Ρ€ΡƒΡˆΠ°Π²Π° ΡƒΠ½ΠΈΠΊΠ°Π»Π½ΠΎΡ‚ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ "index_16508"
DETAIL: ΠšΠ»ΡŽΡ‡ΡŠΡ‚ (id, index)=(100500, 42) Π²Π΅Ρ‡Π΅ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°.

Вя възниква Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π½Π° ΠΊΠΎΠΏΠΈΡ€Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ Π»ΠΎΠ³-Ρ‚Π°Π±Π»ΠΈΡ†Π° Π² Π½ΠΎΠ²Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°. ИзглСТда странно, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Π΄Π°Π½Π½ΠΈΡ‚Π΅ Π² Π»ΠΎΠ³-Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° сС ΠΊΠΎΠΌΠΈΡ‚ΠΈΡ€Π°Ρ‚ Π·Π°Π΅Π΄Π½ΠΎ с Π΄Π°Π½Π½ΠΈΡ‚Π΅ ΠΎΡ‚ ΠΈΠ·Ρ…ΠΎΠ΄Π½Π°Ρ‚Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°. Ако Ρ‚Π΅ отговарят Π½Π° ограничСнията Π½Π° ΠΈΠ·Ρ…ΠΎΠ΄Π½Π°Ρ‚Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ³Π°Π²Π° ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π½Π°Ρ€ΡƒΡˆΠ°Ρ‚ ΡΡŠΡ‰ΠΈΡ‚Π΅ ограничСния Π² Π½ΠΎΠ²Π°Ρ‚Π°?

ΠšΠ°ΠΊΡ‚ΠΎ сС ΠΎΠΊΠ°Π·Π°, ΠΊΠΎΡ€Π΅Π½ΡŠΡ‚ Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° сС ΠΊΡ€ΠΈΠ΅ Π² ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½Π°Ρ‚Π° ΡΡ‚ΡŠΠΏΠΊΠ° Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° с pg_repack, Π½Π° която сС ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚ само индСкситС, Π½ΠΎ Π½Π΅ ΠΈ ограничСнията: Π² старата Ρ‚Π°Π±Π»ΠΈΡ†Π° имашС ΡƒΠ½ΠΈΠΊΠ°Π»Π½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅, Π° Π² Π½ΠΎΠ²Π°Ρ‚Π° вмСсто Π½Π΅Π³ΠΎ сС създадС ΡƒΠ½ΠΈΠΊΠ°Π»Π΅Π½ индСкс.

Postgres: Ρ€Π°Π·Π΄ΡƒΠ²Π°Π½Π΅, pg_repack ΠΈ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΈ ограничСния

Π’ΡƒΠΊ Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° сС ΠΎΡ‚Π±Π΅Π»Π΅ΠΆΠΈ, Ρ‡Π΅ Π°ΠΊΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ, Π° Π½Π΅ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΎ, Ρ‚ΠΎ ΡΡŠΠ·Π΄Π°Π΄Π΅Π½ΠΈΡΡ‚ вмСсто Π½Π΅Π³ΠΎ ΡƒΠ½ΠΈΠΊΠ°Π»Π΅Π½ индСкс Π΅ равносилСн Π½Π° Ρ‚ΠΎΠ²Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ ΡƒΠ½ΠΈΠΊΠ°Π»Π½ΠΈΡ‚Π΅ ограничСния Π² Postgres сС Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚ Ρ‡Ρ€Π΅Π· създаванС Π½Π° ΡƒΠ½ΠΈΠΊΠ°Π»Π΅Π½ индСкс. Но Π² случая с ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΎΡ‚ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π΅ Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎ, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΡŠΡ‚ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ ΠΈ Π²ΠΈΠ½Π°Π³ΠΈ сС провСрява Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π½Π° изпълнСниС Π½Π° sql-ΠΊΠΎΠΌΠ°Π½Π΄Π°.

Π’Π°ΠΊΠ° Ρ‡Π΅, ΡΡŠΡ‰Π½ΠΎΡΡ‚Ρ‚Π° Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° сС ΡΡŠΡΡ‚ΠΎΠΈ Π² β€œΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΎΡΡ‚Ρ‚Π°β€ Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°Ρ‚Π°: Π² ΠΈΠ·Ρ…ΠΎΠ΄Π½Π°Ρ‚Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° тя сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π½Π° ΠΊΠΎΠΌΠΈΡ‚Π°, Π° Π² Π½ΠΎΠ²Π°Ρ‚Π° – Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π½Π° изпълнСниС Π½Π° sql-ΠΊΠΎΠΌΠ°Π½Π΄Π°. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎ, трябва Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ Ρ‚Π°ΠΊΠ°, Ρ‡Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈΡ‚Π΅ Π΄Π° сС ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚ Π΅Π΄Π½Π°ΠΊΠ²ΠΎ Π² Π΄Π²Π°Ρ‚Π° случая: ΠΈΠ»ΠΈ Π²ΠΈΠ½Π°Π³ΠΈ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΎ, ΠΈΠ»ΠΈ Π²ΠΈΠ½Π°Π³ΠΈ Π²Π΅Π΄Π½Π°Π³Π°.

И Ρ‚Π°ΠΊΠ°, ΠΊΠ°ΠΊΠ²ΠΈ ΠΈΠ΄Π΅ΠΈ ΠΈΠΌΠ°Ρ…ΠΌΠ΅.

БъздаванС Π½Π° индСкс, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ Π½Π° deferred

ΠŸΡŠΡ€Π²Π°Ρ‚Π° идСя Π΅ Π΄Π° сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Ρ‚ ΠΈ Π΄Π²Π΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π² Ρ€Π΅ΠΆΠΈΠΌ Π½Π° нСзабавност. Π’ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡ€Π΅Π΄ΠΈΠ·Π²ΠΈΠΊΠ° няколко Ρ„Π°Π»ΡˆΠΈΠ²ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»Π½ΠΈ Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ Π½Π° ограничСнията, Π½ΠΎ Π°ΠΊΠΎ Ρ‚Π΅ са ΠΌΠ°Π»ΠΊΠΎ, Π½Π΅ трябва Π΄Π° влияят Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½Π° ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Ρ‚Π°ΠΊΠΈΠ²Π° ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΈ са Π½ΠΎΡ€ΠΌΠ°Π»Π½Π° ситуация Π·Π° тях. Π’Π΅ сС случват, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π΄Π²Π°ΠΌΠ° ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ Π·Π°ΠΏΠΎΡ‡Π½Π°Ρ‚ Π΅Π΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π΄Π° Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€Π°Ρ‚ Π΅Π΄ΠΈΠ½ ΠΈ ΡΡŠΡ‰ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡŠΡ‚ Π½Π° втория ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» Π½Π΅ успява Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈ информация, Ρ‡Π΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΡŠΡ‚ Π²Π΅Ρ‡Π΅ Π΅ Π±Π»ΠΎΠΊΠΈΡ€Π°Π½ Π·Π° Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€Π°Π½Π΅ ΠΎΡ‚ ΠΏΡŠΡ€Π²ΠΈΡ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π». Π’ Ρ‚Π°ΠΊΠ°Π²Π° ситуация ΡΡŠΡ€Π²ΡŠΡ€ΡŠΡ‚ ΠΎΡ‚ΠΊΠ°Π·Π²Π° Π½Π° втория ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π», Π° нСговият ΠΊΠ»ΠΈΠ΅Π½Ρ‚ отмСня ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΈ Π±Π»ΠΎΠΊΠΈΡ€Π° Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°. По-късно, ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΏΡŠΡ€Π²ΠΈΡΡ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» Π·Π°Π²ΡŠΡ€ΡˆΠΈ рСдакцията, вторият Ρ‰Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈ информация, Ρ‡Π΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΡŠΡ‚ Π²Π΅Ρ‡Π΅ Π½Π΅ Π΅ Π±Π»ΠΎΠΊΠΈΡ€Π°Π½ ΠΈ Ρ‰Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈ своСто дСйствиС.

Postgres: Ρ€Π°Π·Π΄ΡƒΠ²Π°Π½Π΅, pg_repack ΠΈ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΈ ограничСния

Π—Π° Π΄Π° ΠΌΠΎΠ³Π°Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈΡ‚Π΅ Π²ΠΈΠ½Π°Π³ΠΈ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Π² спСшСн Ρ€Π΅ΠΆΠΈΠΌ, ΡΡŠΠ·Π΄Π°Π΄ΠΎΡ…ΠΌΠ΅ Π½ΠΎΠ² индСкс, ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π° ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΎΡ‚ΠΎ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅:

CREATE UNIQUE INDEX CONCURRENTLY uk_tablename__immediate ON tablename (id, index);
-- изпълни pg_repack
DROP INDEX CONCURRENTLY uk_tablename__immediate;

Π’ тСстовата срСда ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ…ΠΌΠ΅ само няколко ΠΎΡ‡Π°ΠΊΠ²Π°Π½ΠΈ Π³Ρ€Π΅ΡˆΠΊΠΈ. УспСх! ΠžΡ‚Π½ΠΎΠ²ΠΎ стартирахмС pg_repack Π½Π° продукция ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ…ΠΌΠ΅ 5 Π³Ρ€Π΅ΡˆΠΊΠΈ Π² ΠΏΡŠΡ€Π²ΠΈΡ кластСр Π·Π° Π΅Π΄ΠΈΠ½ час Ρ€Π°Π±ΠΎΡ‚Π°. Π’ΠΎΠ²Π° Π΅ ΠΏΡ€ΠΈΠ΅ΠΌΠ»ΠΈΠ² Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π°, Π²Ρ‚ΠΎΡ€Π°Ρ‚Π° кластСрна Π³Ρ€Π΅ΡˆΠΊΠ° нарасна ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ ΠΈ Π½ΠΈ сС Π½Π°Π»ΠΎΠΆΠΈ Π΄Π° спрСм pg_repack.

Π—Π°Ρ‰ΠΎ сС случи Ρ‚ΠΎΠ²Π°? ВСроятността Π΄Π° възникнС Π³Ρ€Π΅ΡˆΠΊΠ° зависи ΠΎΡ‚ Ρ‚ΠΎΠ²Π° ΠΊΠΎΠ»ΠΊΠΎ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ работят Π΅Π΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ с Π΅Π΄Π½ΠΈ ΠΈ ΡΡŠΡ‰ΠΈ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΈ. ИзглСТда, Ρ‡Π΅ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° с Π΄Π°Π½Π½ΠΈΡ‚Π΅, ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Π½ΠΈ Π² ΠΏΡŠΡ€Π²ΠΈΡ кластСр, Π΅ ΠΈΠΌΠ°Π»ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Π½ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ, ΠΎΡ‚ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ Π² останалитС, Ρ‚.Π΅. просто смС β€žΠΈΠΌΠ°Π»ΠΈ ΠΊΡŠΡΠΌΠ΅Ρ‚β€œ.

Π˜Π΄Π΅ΡΡ‚Π° Π½Π΅ сработи. Π’ Ρ‚ΠΎΠ·ΠΈ ΠΌΠΎΠΌΠ΅Π½Ρ‚ видяхмС Π΄Π²Π΅ Π΄Ρ€ΡƒΠ³ΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Π·Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅: Π΄Π° ΠΏΡ€Π΅Π·Π°ΠΏΠΈΡˆΠ΅ΠΌ нашия ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ ΠΊΠΎΠ΄, Π·Π° Π΄Π° сС ΠΎΡ‚ΠΊΠ°ΠΆΠ΅ΠΌ ΠΎΡ‚ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΈΡ‚Π΅ ограничСния, ΠΈΠ»ΠΈ Π΄Π° β€žΠ½Π°ΡƒΡ‡ΠΈΠΌβ€œ pg_repack Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ с тях. Π˜Π·Π±Ρ€Π°Ρ…ΠΌΠ΅ Π²Ρ‚ΠΎΡ€ΠΎΡ‚ΠΎ.

Π”Π° Π·Π°ΠΌΠ΅Π½ΠΈΠΌ индСкситС Π² Π½ΠΎΠ²Π°Ρ‚Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° с ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΈ ограничСния ΠΎΡ‚ ΠΈΠ·Ρ…ΠΎΠ΄Π½Π°Ρ‚Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°.

Π¦Π΅Π»Ρ‚Π° Π½Π° Π΄ΠΎΡ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π° бСшС ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Π° – Π°ΠΊΠΎ ΠΈΠ·Ρ…ΠΎΠ΄Π½Π°Ρ‚Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΈΠΌΠ° ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅, Π·Π° Π½ΠΎΠ²Π°Ρ‚Π° трябва Π΄Π° сС създадС Ρ‚Π°ΠΊΠΎΠ²Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅, Π° Π½Π΅ индСкс.

Π—Π° Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅, написахмС прост тСст:

  • Ρ‚Π°Π±Π»ΠΈΡ†Π° с ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΈ Π΅Π΄Π½Π° запис;
  • вмъквамС Π² Ρ†ΠΈΠΊΡŠΠ» Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΈΠ·Π²ΠΈΠΊΠ²Π°Ρ‚ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ с Π²Π΅Ρ‡Π΅ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‰Π°Ρ‚Π° запис;
  • ΠΏΡ€Π°Π²ΠΈΠΌ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ – Π΄Π°Π½Π½ΠΈΡ‚Π΅ Π²Π΅Ρ‡Π΅ Π½Π΅ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΡƒΠ²Π°Ρ‚;
  • ΠΊΠΎΠΌΠΈΡ‚Π²Π°ΠΌΠ΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅.

създаванС Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° test_table
(
  id serial,
  val int,
  constraint uk_test_table__val unique (val) deferrable initially deferred 
);

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

ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½Π°Ρ‚Π° вСрсия Π½Π° pg_repack Π²ΠΈΠ½Π°Π³ΠΈ ΠΏΠ°Π΄Π½Π° ΠΏΡ€ΠΈ ΠΏΡŠΡ€Π²ΠΎΡ‚ΠΎ вмъкванС, ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π΅Π½Π°Ρ‚Π° вСрсия Ρ€Π°Π±ΠΎΡ‚Π΅ΡˆΠ΅ Π±Π΅Π· Π³Ρ€Π΅ΡˆΠΊΠΈ. ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ.

ΠžΡ‚ΠΈΠ²Π°ΠΌΠ΅ Π½Π° продукция ΠΈ ΠΎΡ‚Π½ΠΎΠ²ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ Π³Ρ€Π΅ΡˆΠΊΠ° Π² ΡΡŠΡ‰Π°Ρ‚Π° Ρ„Π°Π·Π° Π½Π° ΠΊΠΎΠΏΠΈΡ€Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ Π»ΠΎΠ³ Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° Π² Π½ΠΎΠ²Π°Ρ‚Π°:

$ ./pg_repack -t tablename -o id
INFO: Ρ€Π΅ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈΡ€Π°Π½Π΅ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° "tablename"
ERROR: заявката Π½Π΅ успя: 
    ERROR: Π΄ΡƒΠ±Π»ΠΈΡ€Π°Π½Π° стойност Π½Π° ΠΊΠ»ΡŽΡ‡ Π½Π°Ρ€ΡƒΡˆΠ°Π²Π° ΡƒΠ½ΠΈΠΊΠ°Π»Π½ΠΎΡ‚ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ "index_16508"
DETAIL: ΠšΠ»ΡŽΡ‡ΡŠΡ‚ (id, index)=(100500, 42) Π²Π΅Ρ‡Π΅ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°.

ΠšΠ»Π°ΡΠΈΡ‡Π΅ΡΠΊΠ° ситуация: Π² тСстовитС срСди всичко Ρ€Π°Π±ΠΎΡ‚ΠΈ, Π° Π½Π° продукцията – Π½Π΅?!

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; -- ΠΎΡ‰Π΅ Π΅Π΄ΠΈΠ½ update
    COMMIT;
  END;
END LOOP;

И Ρ‚Π°ΠΊΠ°, слСдващата Π·Π°Π΄Π°Ρ‡Π° Π΅ Π΄Π° Π½Π°ΠΊΠ°Ρ€Π°ΠΌΠ΅ Π΄Π°Π½Π½ΠΈΡ‚Π΅ ΠΎΡ‚ ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½Π°Ρ‚Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°, ΠΊΠΎΠΈΡ‚ΠΎ сС промСняха Π² Π΅Π΄Π½Π° транзакция, Π΄Π° ΠΏΠΎΠΏΠ°Π΄Π½Π°Ρ‚ Π² Π½ΠΎΠ²Π°Ρ‚Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° ΡΡŠΡ‰ΠΎ Π² Π΅Π΄Π½Π° транзакция.

ΠžΡ‚ΠΊΠ°Π· ΠΎΡ‚ ΠΏΠ°Ρ€Ρ‚ΠΈΠ΄ΠΈ

И ΠΏΡ€ΠΈ нас ΠΎΡ‚Π½ΠΎΠ²ΠΎ имашС Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Π·Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ. ΠŸΡŠΡ€Π²ΠΈΡΡ‚: Π΄Π° сС ΠΎΡ‚ΠΊΠ°ΠΆΠ΅ΠΌ изцяло ΠΎΡ‚ Ρ€Π°Π·Ρ‡Π»Π΅Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Π±Π°Ρ‚ΡƒΡ†ΠΈ ΠΈ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»ΡΠ½Π΅Ρ‚ΠΎ Π½Π° Π΄Π°Π½Π½ΠΈ с Π΅Π΄Π½Π° транзакция. Π’ ΠΏΠΎΠ»Π·Π° Π½Π° Ρ‚ΠΎΠ²Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ бСшС Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° простота – Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈΡ‚Π΅ измСнСния Π² ΠΊΠΎΠ΄Π° бяха ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΈ (ΠΌΠ΅ΠΆΠ΄Ρƒ Π΄Ρ€ΡƒΠ³ΠΎΡ‚ΠΎ, Π² ΠΏΠΎ-старитС вСрсии pg_reorg Ρ€Π°Π±ΠΎΡ‚Π΅ΡˆΠ΅ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠ°). Но ΠΈΠΌΠ° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ – създавамС дълга транзакция, Π° Ρ‚ΠΎΠ²Π°, ΠΊΠ°ΠΊΡ‚ΠΎ бСшС спомСнато ΠΏΠΎ-Ρ€Π°Π½ΠΎ, Π΅ Π·Π°ΠΏΠ»Π°Ρ…Π° Π·Π° Π²ΡŠΠ·Π½ΠΈΠΊΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π½ΠΎΠ² bloat.

Π’Ρ‚ΠΎΡ€ΠΎΡ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ – ΠΏΠΎ-слоТно, Π½ΠΎ вСроятно ΠΏΠΎ-ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ: Π΄Π° създадСм Π² Π»ΠΎΠ³-Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° ΠΊΠΎΠ»ΠΎΠ½Π° с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π½Π° транзакцията, която Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠ»Π° Π΄Π°Π½Π½ΠΈΡ‚Π΅ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π°. Π’ΠΎΠ³Π°Π²Π° ΠΏΡ€ΠΈ ΠΊΠΎΠΏΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π΄Π°Π½Π½ΠΈΡ‚Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π³ΠΈ Π³Ρ€ΡƒΠΏΠΈΡ€Π°ΠΌΠ΅ ΠΏΠΎ Ρ‚ΠΎΠ·ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΈ Π΄Π° Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€Π°ΠΌΠ΅, Ρ‡Π΅ ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈΡ‚Π΅ измСнСния Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ прСнСсСни Π·Π°Π΅Π΄Π½ΠΎ. Π‘Π°Ρ‚Ρ‡ΡŠΡ‚ Ρ‰Π΅ бъдС Ρ„ΠΎΡ€ΠΌΠΈΡ€Π°Π½ ΠΎΡ‚ няколко Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ (ΠΈΠ»ΠΈ Π΅Π΄Π½Π° голяма) ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΡŠΡ‚ ΠΌΡƒ Ρ‰Π΅ Π²Π°Ρ€ΠΈΡ€Π° Π² зависимост ΠΎΡ‚ Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ»ΠΊΠΎ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Π°Π½Π½ΠΈ са Π±ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Π½ΠΈ Π² Ρ‚Π΅Π·ΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ. Π’Π°ΠΆΠ½ΠΎ Π΅ Π΄Π° сС ΠΎΡ‚Π±Π΅Π»Π΅ΠΆΠΈ, Ρ‡Π΅ Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Π΄Π°Π½Π½ΠΈΡ‚Π΅ ΠΎΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠΏΠ°Π΄Π° Π² Π»ΠΎΠ³-Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ Ρ€Π΅Π΄, Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° я Ρ‡Π΅Ρ‚Π΅ΠΌ послСдоватСлно, ΠΊΠ°ΠΊΡ‚ΠΎ бСшС ΠΏΠΎ-Ρ€Π°Π½ΠΎ. seqscan ΠΏΡ€ΠΈ всяко Π·Π°ΠΏΠΈΡ‚Π²Π°Π½Π΅ с Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°Π½Π΅ ΠΏΠΎ tx_id Π΅ Ρ‚Π²ΡŠΡ€Π΄Π΅ скъпо, Π½ΡƒΠΆΠ΅Π½ Π΅ индСкс, Π½ΠΎ ΠΈ Ρ‚ΠΎΠΉ Ρ‰Π΅ Π·Π°Π±Π°Π²ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π·Π°Ρ€Π°Π΄ΠΈ Ρ€Π°Π·Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ ΠΏΠΎ актуализацията ΠΌΡƒ. Π’ ΠΎΠ±Ρ‰ΠΈ Π»ΠΈΠ½ΠΈΠΈ, ΠΊΠ°ΠΊΡ‚ΠΎ Π²ΠΈΠ½Π°Π³ΠΈ Π΅ Π½ΡƒΠΆΠ½ΠΎ Π΄Π° сС ΠΆΠ΅Ρ€Ρ‚Π²Π° Π½Π΅Ρ‰ΠΎ.

И Ρ‚Π°ΠΊΠ°, Ρ€Π΅ΡˆΠΈΡ…ΠΌΠ΅ Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅ΠΌ с ΠΏΡŠΡ€Π²ΠΈΡ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, ΠΊΠ°Ρ‚ΠΎ ΠΏΠΎ-прост. Π—Π° Π½Π°Ρ‡Π°Π»ΠΎ бСшС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ Π΄Π°Π»ΠΈ Π΄ΡŠΠ»Π³Π°Ρ‚Π° транзакция Ρ‰Π΅ бъдС Ρ€Π΅Π°Π»Π΅Π½ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. Въй ΠΊΠ°Ρ‚ΠΎ основното ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»ΡΠ½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ старата Ρ‚Π°Π±Π»ΠΈΡ†Π° Π² Π½ΠΎΠ²Π°Ρ‚Π° ΡΡŠΡ‰ΠΎ сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° с Π΅Π΄Π½Π° дълга транзакция, Π²ΡŠΠΏΡ€ΠΎΡΡŠΡ‚ сС трансформира Π² "ΠΊΠΎΠ»ΠΊΠΎ Ρ‰Π΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠΌ Ρ‚Π°Π·ΠΈ транзакция?" ΠŸΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈΡ‚Π΅Π»Π½ΠΎΡΡ‚Ρ‚Π° Π½Π° ΠΏΡŠΡ€Π²Π°Ρ‚Π° транзакция зависи основно ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π°. ΠŸΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈΡ‚Π΅Π»Π½ΠΎΡΡ‚Ρ‚Π° Π½Π° Π½ΠΎΠ²Π°Ρ‚Π° – ΠΎΡ‚ Ρ‚ΠΎΠ²Π° ΠΊΠΎΠ»ΠΊΠΎ ΠΌΠ½ΠΎΠ³ΠΎ измСнСния Ρ‰Π΅ сС Π½Π°Ρ‚Ρ€ΡƒΠΏΠ°Ρ‚ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΏΡ€Π΅Π»ΠΈΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π΄Π°Π½Π½ΠΈΡ‚Π΅, Ρ‚.Π΅. ΠΎΡ‚ интСнзивността Π½Π° Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅Ρ‚ΠΎ. ΠŸΡ€ΠΎΡ†Π΅ΡΡŠΡ‚ Π½Π° pg_repack сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠΈ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΎ Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅ Π½Π° услугата ΠΈ ΠΎΠ±Π΅ΠΌΡŠΡ‚ Π½Π° измСнСнията бСшС нСсравнимо малък Π² сравнСниС с ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½ΠΈΡ ΠΎΠ±Π΅ΠΌ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π°. Π Π΅ΡˆΠΈΡ…ΠΌΠ΅, Ρ‡Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡ€Π΅Π½Π΅Π±Ρ€Π΅Π³Π½Π΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π½Π° Π½ΠΎΠ²Π°Ρ‚Π° транзакция (Π·Π° сравнСниС, срСдно Ρ‚ΠΎΠ²Π° Π΅ 1Ρ‡ ΠΈ 2-3 ΠΌΠΈΠ½ΡƒΡ‚ΠΈ).

ЕкспСримСнтитС бяха ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»Π½ΠΈ. Π‘Ρ‚Π°Ρ€Ρ‚ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° продукция ΡΡŠΡ‰ΠΎ. Π—Π° наглСдност – ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ с Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° Π΅Π΄Π½Π° ΠΎΡ‚ Π±Π°Π·ΠΈΡ‚Π΅ слСд ΠΏΡ€Π΅Π³Π»Π΅Π΄Π°:

Postgres: Ρ€Π°Π·Π΄ΡƒΠ²Π°Π½Π΅, pg_repack ΠΈ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΈ ограничСния

Въй ΠΊΠ°Ρ‚ΠΎ Ρ‚ΠΎΠ²Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½ΠΈ удовлСтворява напълно, Π½Π΅ ΠΎΠΏΠΈΡ‚Π°Ρ…ΠΌΠ΅ Π΄Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ Π²Ρ‚ΠΎΡ€ΠΎΡ‚ΠΎ, Π½ΠΎ обмислямС Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π° Π΄Π° Π³ΠΎ обсъдим с Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΠ΅Ρ‚ΠΎ. ΠΠ°ΡˆΠ΅Ρ‚ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π΅Π½ΠΈΠ΅, Π·Π° съТалСниС, всС ΠΎΡ‰Π΅ Π½Π΅ Π΅ Π³ΠΎΡ‚ΠΎΠ²ΠΎ Π·Π° ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½Π΅, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Ρ€Π΅ΡˆΠΈΡ…ΠΌΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° само с ΡƒΠ½ΠΈΠΊΠ°Π»Π½ΠΈΡ‚Π΅ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΈ ограничСния, Π° Π·Π° ΠΏΡŠΠ»Π½ΠΎΡ†Π΅Π½Π΅Π½ ΠΏΠ°Ρ‡ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° ΠΈ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ‚Π΅ Ρ‚ΠΈΠΏΠΎΠ²Π΅. НадявамС сС, Ρ‡Π΅ Ρ‰Π΅ успССм Π΄Π° Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ Π² Π±ΡŠΠ΄Π΅Ρ‰Π΅.

Π’ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΅ Π΄Π° стС сС Π·Π°ΠΏΠΈΡ‚Π°Π»ΠΈ Π·Π°Ρ‰ΠΎ ΠΈΠ·ΠΎΠ±Ρ‰ΠΎ сС Π·Π°Ρ…Π²Π°Π½Π°Ρ…ΠΌΠ΅ с Ρ‚Π°Π·ΠΈ история с Π΄ΠΎΡ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π° Π½Π° pg_repack, Π° Π½Π΅ Ρ€Π΅ΡˆΠΈΡ…ΠΌΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π½Π΅Π³ΠΎΠ²ΠΈΡ‚Π΅ Π°Π½Π°Π»ΠΎΠ·ΠΈ? Π’ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΈ Π½ΠΈΠ΅ мислСхмС Π·Π° Ρ‚ΠΎΠ²Π°, Π½ΠΎ полоТитСлният ΠΎΠΏΠΈΡ‚ ΠΎΡ‚ ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΎΡ‚ΠΎ ΠΌΡƒ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅, Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ Π±Π΅Π· ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΈ ограничСния, Π½ΠΈ ΠΌΠΎΡ‚ΠΈΠ²ΠΈΡ€Π° Π΄Π° ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ ΡΡŠΡ‰Π½ΠΎΡΡ‚Ρ‚Π° Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΈ Π΄Π° Π³ΠΎ ΠΊΠΎΡ€ΠΈΠ³ΠΈΡ€Π°ΠΌΠ΅. ОсвСн Ρ‚ΠΎΠ²Π°, Π·Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π΄Ρ€ΡƒΠ³ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π·Π° ΠΏΡ€ΠΎΠ²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° тСстовС, Π·Π°Ρ‚ΠΎΠ²Π° Ρ€Π΅ΡˆΠΈΡ…ΠΌΠ΅, Ρ‡Π΅ ΠΏΡŠΡ€Π²ΠΎ Ρ‰Π΅ ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Π° Ρ€Π΅ΡˆΠΈΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Π½Π΅Π³ΠΎ, Π° Π°ΠΊΠΎ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ, Ρ‡Π΅ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ Π·Π° Ρ€Π°Π·ΡƒΠΌΠ½ΠΎ Π²Ρ€Π΅ΠΌΠ΅, Ρ‚ΠΎΠ³Π°Π²Π° Ρ‰Π΅ Π·Π°ΠΏΠΎΡ‡Π½Π΅ΠΌ Π΄Π° Ρ€Π°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‚Π΅.

Изводи

Какво ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡Π°ΠΌΠ΅ въз основа Π½Π° собствСн ΠΎΠΏΠΈΡ‚:

  1. ΠΠ°Π±Π»ΡŽΠ΄Π°Π²Π°ΠΉΡ‚Π΅ вашия bloat. На Π±Π°Π·Π°Ρ‚Π° Π½Π° Π΄Π°Π½Π½ΠΈΡ‚Π΅ ΠΎΡ‚ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° Ρ‰Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅, ΠΊΠΎΠ»ΠΊΠΎ Π΄ΠΎΠ±Ρ€Π΅ Π΅ настроСн autovacuum.
  2. НастройвайтС AUTOVACUUM, Π·Π° Π΄Π° ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Ρ‚Π΅ bloat Π½Π° допустимо Π½ΠΈΠ²ΠΎ.
  3. Ако всС ΠΏΠ°ΠΊ bloat нараства ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° сС справитС с Π½Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° срСдства "извън кутията", Π½Π΅ сС страхувайтС Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ външни Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΡ. Π’Π°ΠΆΠ½ΠΎ Π΅ всичко Π΄Π° бъдС Π΄ΠΎΠ±Ρ€Π΅ тСствано.
  4. НС сС страхувайтС Π΄Π° Π΄ΠΎΡ€Π°Π±ΠΎΡ‚Π²Π°Ρ‚Π΅ външни Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ спорСд своитС Π½ΡƒΠΆΠ΄ΠΈ – понякога Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΏΠΎ-Π΅Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈ Π΄ΠΎΡ€ΠΈ ΠΏΠΎ-просто, ΠΎΡ‚ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ Π΄Π° промСнятС своя собствСн ΠΊΠΎΠ΄.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster