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

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

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

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

Π’Π°Π·ΠΈ статия сС основава Π½Π° моята Ρ€Π΅Ρ‡ Π½Π° PgConf.Russia 2020.

Π—Π°Ρ‰ΠΎ ΠΈΠΌΠ° ΠΏΠΎΠ΄ΡƒΠ²Π°Π½Π΅

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

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

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

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

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

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

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

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

Postgres ΠΈΠΌΠ° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ Π’ΠΠšΠ£Π£Πœ, ΠΊΠΎΠΉΡ‚ΠΎ изчиства остарСлитС вСрсии ΠΈ ΠΏΡ€Π°Π²ΠΈ място Π·Π° Π½ΠΎΠ²ΠΈ Π΄Π°Π½Π½ΠΈ. Но Π°ΠΊΠΎ Π½Π΅ Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ агрСсивно ΠΈΠ»ΠΈ Π΅ Π·Π°Π΅Ρ‚ Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ, Ρ‚ΠΎΠ³Π°Π²Π° β€žΠ΄Π°Π½Π½ΠΈΡ‚Π΅ Π·Π° Π±ΠΎΠΊΠ»ΡƒΠΊΠ°β€œ остават ΠΈ трябва Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ страници Π·Π° Π½ΠΎΠ²ΠΈ Π΄Π°Π½Π½ΠΈ.

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

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

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

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

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

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

Имам Π»ΠΈ ΠΏΠΎΠ΄ΡƒΠ²Π°Π½Π΅?

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

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

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

Начини Π·Π° справянС с ΠΏΠΎΠ΄ΡƒΠ²Π°Π½Π΅Ρ‚ΠΎ

Има няколко Π³ΠΎΡ‚ΠΎΠ²ΠΈ Π½Π°Ρ‡ΠΈΠ½Π° Π·Π° справянС с ΠΏΠΎΠ΄ΡƒΠ²Π°Π½Π΅Ρ‚ΠΎ Π² Postgres, Π½ΠΎ Ρ‚Π΅ Π΄Π°Π»Π΅Ρ‡ Π½Π΅ са Π²ΠΈΠ½Π°Π³ΠΈ ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π΅ отговарят Π½Π° всички.

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

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

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

Как Π΄Π° Π±ΡŠΠ΄Π΅Ρ‚Π΅ Π² ситуация, ΠΊΠΎΠ³Π°Ρ‚ΠΎ стС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π»ΠΈ AUTOVACUUM, Π½ΠΎ ΠΏΠΎΠ΄ΡƒΠ²Π°Π½Π΅Ρ‚ΠΎ ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠ°Π²Π° Π΄Π° растС.

ΠžΡ‚Π±ΠΎΡ€ Π’ΠΠšΠ£Π£Πœ ПΠͺЛЕН Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π° ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ ΠΈ индСкси ΠΈ оставя само Π°ΠΊΡ‚ΡƒΠ°Π»Π½ΠΈ Π΄Π°Π½Π½ΠΈ Π² тях. Π—Π° Π΄Π° Π΅Π»ΠΈΠΌΠΈΠ½ΠΈΡ€Π° Ρ€Π°Π·Π΄ΡƒΠ²Π°Π½Π΅Ρ‚ΠΎ, Ρ‚ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΏΠ΅Ρ€Ρ„Π΅ΠΊΡ‚Π½ΠΎ, Π½ΠΎ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΌΡƒ сС улавя ΠΈΠ·ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ Π·Π°ΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° (AccessExclusiveLock), ΠΊΠΎΠ΅Ρ‚ΠΎ няма Π΄Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ заявки към Ρ‚Π°Π·ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Π°, Π΄ΠΎΡ€ΠΈ сСлСктира. Ако ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° си ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚Π΅ Π΄Π° спрСтС услугата си ΠΈΠ»ΠΈ част ΠΎΡ‚ нСя Π·Π° извСстно Π²Ρ€Π΅ΠΌΠ΅ (ΠΎΡ‚ дСсСтки ΠΌΠΈΠ½ΡƒΡ‚ΠΈ Π΄ΠΎ няколко часа Π² зависимост ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ ΠΈ вашия Ρ…Π°Ρ€Π΄ΡƒΠ΅Ρ€), Ρ‚ΠΎΠ³Π°Π²Π° Ρ‚Π°Π·ΠΈ опция Π΅ Π½Π°ΠΉ-Π΄ΠΎΠ±Ρ€Π°Ρ‚Π°. НиС, Π·Π° съТалСниС, нямамС Π²Ρ€Π΅ΠΌΠ΅ Π΄Π° стартирамС VACUUM FULL ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΏΠ»Π°Π½ΠΈΡ€Π°Π½Π°Ρ‚Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ°, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Ρ‚ΠΎΠ·ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π΅ Π½ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠΆΠ΄Π°.

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

ΠžΡ‚Π±ΠΎΡ€ REINDEX ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈΡ‚Π΅ Π΄Π²Π°, Π½ΠΎ ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π° ΠΎΡ‚Π½ΠΎΠ²ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π΅Π½ индСкс ΠΈΠ»ΠΈ всички индСкси Π² Ρ‚Π°Π±Π»ΠΈΡ†Π°. Π—Π°ΠΊΠ»ΡŽΡ‡Π²Π°Π½ΠΈΡΡ‚Π° са ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-слаби: ShareLock Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° (прСдотвратява ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, Π½ΠΎ позволява сСлСкции) ΠΈ AccessExclusiveLock Π½Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Ρ‰ сС индСкс (Π±Π»ΠΎΠΊΠΈΡ€Π° заявки, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‰ΠΈ Ρ‚ΠΎΠ·ΠΈ индСкс). Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π°, Postgres 12 въвСдС опцията Π•Π”ΠΠžΠ’Π Π•ΠœΠ•ΠΠΠž, ΠΊΠΎΠ΅Ρ‚ΠΎ Π²ΠΈ позволява Π΄Π° ΠΈΠ·Π³Ρ€Π°Π΄ΠΈΡ‚Π΅ ΠΎΡ‚Π½ΠΎΠ²ΠΎ индСкс, Π±Π΅Π· Π΄Π° Π±Π»ΠΎΠΊΠΈΡ€Π°Ρ‚Π΅ Π΅Π΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΡ‚ΠΎ добавянС, ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½Π΅ ΠΈΠ»ΠΈ ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅ Π½Π° записи.

Π’ ΠΏΠΎ-Ρ€Π°Π½Π½ΠΈΡ‚Π΅ вСрсии Π½Π° Postgres ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° постигнСтС Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚, ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π° REINDEX Π•Π”ΠΠžΠ’Π Π•ΠœΠ•ΠΠΠž с Π‘ΠͺЗДАВАЙВЕ Π˜ΠΠ”Π•ΠšΠ‘ Π•Π”ΠΠžΠ’Π Π•ΠœΠ•ΠΠΠž. Позволява Π²ΠΈ Π΄Π° ΡΡŠΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ индСкс Π±Π΅Π· силно Π·Π°ΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅ (ShareUpdateExclusiveLock, ΠΊΠΎΠ΅Ρ‚ΠΎ Π½Π΅ ΠΏΡ€Π΅Ρ‡ΠΈ Π½Π° ΠΏΠ°Ρ€Π°Π»Π΅Π»Π½ΠΈΡ‚Π΅ заявки), слСд Ρ‚ΠΎΠ²Π° Π΄Π° Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ стария индСкс с Π½ΠΎΠ² ΠΈ Π΄Π° ΠΈΠ·Ρ‚Ρ€ΠΈΠ΅Ρ‚Π΅ стария индСкс. Π’ΠΎΠ²Π° Π²ΠΈ позволява Π΄Π° ΠΏΡ€Π΅ΠΌΠ°Ρ…Π½Π΅Ρ‚Π΅ Ρ€Π°Π·Π΄ΡƒΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° индСкса, Π±Π΅Π· Π΄Π° ΠΏΡ€Π΅Ρ‡ΠΈ Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π²ΠΈ. Π’Π°ΠΆΠ½ΠΎ Π΅ Π΄Π° сС ΠΈΠΌΠ° ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄, Ρ‡Π΅ ΠΏΡ€ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° индСкси Ρ‰Π΅ ΠΈΠΌΠ° Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΎ Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅ Π½Π° дисковата подсистСма.

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

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

Postgres: Ρ€Π°Π·Π΄ΡƒΠ²Π°Π½Π΅, 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. По Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ‚Π΅ Π² ΡΡŠΡΡ‚Π°Π²Π° ΠΌΡƒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ…ΠΌΠ΅ β€žΠ½Π°ΡˆΠ΅Ρ‚ΠΎβ€ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΌΡƒ ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π°. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡŠΡ‚ сС ΠΎΠΊΠ°Π·Π°, Ρ‡Π΅ Ρ‚ΠΎΠ²Π° Π½Π΅ Π΅ съвсСм ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅, Π° Π·Π°Π±Π°Π²Π΅Π½ΠΎ (ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅), Ρ‚.Π΅. Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° валидация сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° ΠΏΠΎ-късно ΠΎΡ‚ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° 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] 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, ΠΈΠΌΠ° Ρ‚Ρ€ΠΈ Π½ΠΈΠ²Π° Π½Π° дСтайлност Π½Π° тяхното Π²Π°Π»ΠΈΠ΄ΠΈΡ€Π°Π½Π΅: Ρ€Π΅Π΄, транзакция ΠΈ ΠΈΠ·Ρ€Π°Π·.
Postgres: Ρ€Π°Π·Π΄ΡƒΠ²Π°Π½Π΅, pg_repack ΠΈ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΈ ограничСния
Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: begriffs

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: Ρ€Π°Π·Π΄ΡƒΠ²Π°Π½Π΅, pg_repack ΠΈ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΈ ограничСния

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

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

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

Π‘ΡŠΠ·Π΄Π°ΠΉΡ‚Π΅ индСкс, ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π° ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½

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

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 ΠΎΡ‚Π½ΠΎΠ²ΠΎ Π½Π° 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 ΠΌΠΈΠ½ΡƒΡ‚ΠΈ).

ЕкспСримСнтитС бяха ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»Π½ΠΈ. ΠŸΡƒΡΠ½Π΅Ρ‚Π΅ ΠΈ Π² ΠΏΡ€ΠΎΠ΄Π°ΠΆΠ±Π°. Π—Π° ΠΏΠΎ-голяма яснота, Π΅Ρ‚ΠΎ снимка с Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° Π΅Π΄Π½Π° ΠΎΡ‚ Π±Π°Π·ΠΈΡ‚Π΅ слСд ΠΏΡ€ΠΎΠ±Π΅Π³Π°:

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

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

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

Π”Π°Π½Π½ΠΈ

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

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

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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€