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-ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π°. Π—Π½Π°Ρ‡ΠΈ трябва Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ Ρ‚Π°ΠΊΠ°, Ρ‡Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈΡ‚Π΅ Π΄Π° сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Ρ‚ Π΅Π΄Π½Π°ΠΊΠ²ΠΎ Π² Π΄Π²Π°Ρ‚Π° случая: ΠΈΠ»ΠΈ Π²ΠΈΠ½Π°Π³ΠΈ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΎ, ΠΈΠ»ΠΈ Π²ΠΈΠ½Π°Π³ΠΈ Π²Π΅Π΄Π½Π°Π³Π°.

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

Π”Π° създадСм индСкс, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ Π½Π° ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½.

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

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

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

CREATE UNIQUE INDEX CONCURRENTLY uk_tablename__immediate ON tablename (id, index);
-- run pg_repack
DROP INDEX CONCURRENTLY uk_tablename__immediate;

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

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

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

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

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

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

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

create table test_table
(
  id serial,
  val int,
  constraint uk_test_table__val unique (val) deferrable initially deferred 
);

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

Π˜ΡΡ…ΠΎΠ΄Π½Π°Ρ‚Π° вСрсия pg_repack Π²ΠΈΠ½Π°Π³ΠΈ падашС ΠΏΡ€ΠΈ ΠΏΡŠΡ€Π²ΠΈΡ insert, ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π΅Π½Π°Ρ‚Π° вСрсия Ρ€Π°Π±ΠΎΡ‚Π΅ΡˆΠ΅ Π±Π΅Π· Π³Ρ€Π΅ΡˆΠΊΠΈ. ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ.

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

$ ./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;  
 /* всС ΠΎΡ‰Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° някои ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ, ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈ. */
...
}

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡŠΡ‚ Π΅, Ρ‡Π΅ Π΄Π°Π½Π½ΠΈΡ‚Π΅ ΠΎΡ‚ ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½Π°Ρ‚Π° транзакция, Π² която няколко ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ³Π°Ρ‚ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»Π½ΠΎ Π΄Π° Π½Π°Ρ€ΡƒΡˆΠ°Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅Ρ‚ΠΎ, ΠΏΡ€ΠΈ ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»ΡΠ½Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΠΎΠΊΠ°ΠΆΠ°Ρ‚ Π½Π° Ρ€ΡŠΠ±Π° Π½Π° Π΄Π²Π° ΠΏΠ°ΠΊΠ΅Ρ‚Π° – ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ Π·Π°ΠΊΠΎΠΌΠΈΡ‚Π½Π΅Π½ΠΈ Π² ΠΏΡŠΡ€Π²ΠΈΡ ΠΏΠ°ΠΊΠ΅Ρ‚, Π° Π΄Ρ€ΡƒΠ³Π°Ρ‚Π° ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° – във втория. И Ρ‚ΡƒΠΊ ΠΊΠ°ΠΊΠ²ΠΎΡ‚ΠΎ станС: Π°ΠΊΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡ‚Π΅ Π² ΠΏΡŠΡ€Π²ΠΈΡ ΠΏΠ°ΠΊΠ΅Ρ‚ Π½Π΅ Π½Π°Ρ€ΡƒΡˆΠ°Π²Π°Ρ‚ Π½ΠΈΡ‰ΠΎ, всичко Π΅ Π½Π°Ρ€Π΅Π΄, Π° Π°ΠΊΠΎ Π½Π°Ρ€ΡƒΡˆΠ°Π²Π°Ρ‚ – възниква Π³Ρ€Π΅ΡˆΠΊΠ°.

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