ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π΅Π½ Π°Π½Π°Π»ΠΈΠ· Π² Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° Π½Π° микросСрвизи: ΠΏΠΎΠΌΠΎΡ‰ ΠΈ ΠΏΠΎΠ΄ΠΊΠ°Π½Π° Postgres FDW

АрхитСктурата Π½Π° микросСрвизитС, ΠΊΠ°ΠΊΡ‚ΠΎ всичко Π½Π° Ρ‚ΠΎΠ·ΠΈ свят, ΠΈΠΌΠ° своитС плюсовС ΠΈ минуси. Някои процСси стават ΠΏΠΎ-лСсни с Π½Π΅Π³ΠΎ, Π΄Ρ€ΡƒΠ³ΠΈ ΠΏΠΎ-Ρ‚Ρ€ΡƒΠ΄Π½ΠΈ. И Π² ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° скоростта Π½Π° промяната ΠΈ ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π°Ρ‚Π° мащабируСмост трябва Π΄Π° ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ ΠΆΠ΅Ρ€Ρ‚Π²ΠΈ. Π•Π΄Π½Π° ΠΎΡ‚ тях Π΅ слоТността Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°. Ако Π² ΠΌΠΎΠ½ΠΎΠ»ΠΈΡ‚ всички ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Π½Π°ΠΌΠ°Π»Π΅Π½ΠΈ Π΄ΠΎ SQL заявки към Π°Π½Π°Π»ΠΈΡ‚ΠΈΡ‡Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°, Ρ‚ΠΎΠ³Π°Π²Π° Π² мултисСрвизна Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° всяка услуга ΠΈΠΌΠ° своя собствСна Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΈ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°, Ρ‡Π΅ Π΅Π΄Π½Π° заявка Π½Π΅ Π΅ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½Π° (ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅ Π±ΠΈ Ρ‰Π΅ станС?). Π—Π° Ρ‚Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ сС интСрСсуват ΠΊΠ°ΠΊ Ρ€Π΅ΡˆΠΈΡ…ΠΌΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с опСративния Π°Π½Π°Π»ΠΈΠ· Π² Π½Π°ΡˆΠ°Ρ‚Π° компания ΠΈ ΠΊΠ°ΠΊ сС Π½Π°ΡƒΡ‡ΠΈΡ…ΠΌΠ΅ Π΄Π° ΠΆΠΈΠ²Π΅Π΅ΠΌ с Ρ‚ΠΎΠ²Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ - Π΄ΠΎΠ±Ρ€Π΅ дошли.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π΅Π½ Π°Π½Π°Π»ΠΈΠ· Π² Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° Π½Π° микросСрвизи: ΠΏΠΎΠΌΠΎΡ‰ ΠΈ ΠΏΠΎΠ΄ΠΊΠ°Π½Π° Postgres FDW
Казвам сС ПавСл Биваш, Π² DomClick работя Π² Π΅ΠΊΠΈΠΏ, ΠΊΠΎΠΉΡ‚ΠΎ отговаря Π·Π° ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π½Π° Π°Π½Π°Π»ΠΈΡ‚ΠΈΡ‡Π½ΠΈ Π΄Π°Π½Π½ΠΈ. Условно Π½Π°ΡˆΠΈΡ‚Π΅ дСйности ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ приписани Π½Π° ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ΠΈΠ½Π³ Π½Π° Π΄Π°Π½Π½ΠΈ, Π½ΠΎ Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ ΠΎΠ±Ρ…Π²Π°Ρ‚ΡŠΡ‚ Π½Π° Π·Π°Π΄Π°Ρ‡ΠΈΡ‚Π΅ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-ΡˆΠΈΡ€ΠΎΠΊ. Има стандартно инТСнСрство Π½Π° Π΄Π°Π½Π½ΠΈ ETL / ELT, ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° ΠΈ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€Π°Π½Π΅ Π½Π° инструмСнти Π·Π° Π°Π½Π°Π»ΠΈΠ· Π½Π° Π΄Π°Π½Π½ΠΈ ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π²Π°Π½Π΅ Π½Π° собствСни инструмСнти. По-спСциално, Π·Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΡ‚ΠΎ ΠΎΡ‚Ρ‡ΠΈΡ‚Π°Π½Π΅ Ρ€Π΅ΡˆΠΈΡ…ΠΌΠ΅ Π΄Π° сС β€žΠΏΡ€Π΅ΡΡ‚Ρ€ΡƒΠ²Π°ΠΌΠ΅β€œ, Ρ‡Π΅ ΠΈΠΌΠ°ΠΌΠ΅ ΠΌΠΎΠ½ΠΎΠ»ΠΈΡ‚ ΠΈ Π΄Π° Π΄Π°Π΄Π΅ΠΌ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ Π΅Π΄Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ, която Ρ‰Π΅ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° всички Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ Π΄Π°Π½Π½ΠΈ.

ΠšΠ°Ρ‚ΠΎ цяло обмисляхмС Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΈ. Π‘Π΅ΡˆΠ΅ възмоТно Π΄Π° сС ΠΈΠ·Π³Ρ€Π°Π΄ΠΈ ΠΏΡŠΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ - Π΄ΠΎΡ€ΠΈ сС ΠΎΠΏΠΈΡ‚Π°Ρ…ΠΌΠ΅, Π½ΠΎ, чСстно ΠΊΠ°Π·Π°Π½ΠΎ, Π½Π΅ успяхмС Π΄Π° сС сприятСлим с доста чСсти ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² Π»ΠΎΠ³ΠΈΠΊΠ°Ρ‚Π° с доста Π±Π°Π²Π΅Π½ процСс Π½Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΈ ΠΏΡ€Π°Π²Π΅Π½Π΅ Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² Π½Π΅Π³ΠΎ ( Π°ΠΊΠΎ някой Π΅ успял, Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Π² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΡ‚Π΅ ΠΊΠ°ΠΊ). Π‘ΠΈΡ…Ρ‚Π΅ ΠΌΠΎΠ³Π»ΠΈ Π΄Π° ΠΊΠ°ΠΆΠ΅Ρ‚Π΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΈΡ‚Π΅: β€žΠœΠΎΠΌΡ‡Π΅Ρ‚Π°, Π½Π°ΡƒΡ‡Π΅Ρ‚Π΅ Python ΠΈ ΠΎΡ‚ΠΈΠ΄Π΅Ρ‚Π΅ Π½Π° Π°Π½Π°Π»ΠΈΡ‚ΠΈΡ‡Π½ΠΈ Π»ΠΈΠ½ΠΈΠΈβ€œ, Π½ΠΎ Ρ‚ΠΎΠ²Π° Π΅ Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΎ изискванС Π·Π° Π½Π°Π±ΠΈΡ€Π°Π½Π΅ Π½Π° пСрсонал ΠΈ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°, Ρ‡Π΅ Ρ‚ΠΎΠ²Π° трябва Π΄Π° сС избягва, Π°ΠΊΠΎ Π΅ възмоТно. Π Π΅ΡˆΠΈΡ…ΠΌΠ΅ Π΄Π° ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ с тСхнологията FDW (Foreign Data Wrapper): Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ Ρ‚ΠΎΠ²Π° Π΅ стандартСн dblink, ΠΊΠΎΠΉΡ‚ΠΎ Π΅ Π² стандарта SQL, Π½ΠΎ с ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-удобния интСрфСйс. Π’ΡŠΠ· основа Π½Π° Π½Π΅Π³ΠΎ Π²Π·Π΅Ρ…ΠΌΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅Ρ‚ΠΎ Π² ΠΊΡ€Π°ΠΉΠ½Π° смСтка сС Π·Π°Ρ‚Π²ΡŠΡ€Π΄ΠΈ, спряхмС сС Π½Π° Π½Π΅Π³ΠΎ. НСговитС подробности са Ρ‚Π΅ΠΌΠ° Π½Π° ΠΎΡ‚Π΄Π΅Π»Π½Π° статия, Π° ΠΌΠΎΠΆΠ΅ Π±ΠΈ ΠΈ ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΎΡ‚ Π΅Π΄Π½Π°, Π·Π°Ρ‰ΠΎΡ‚ΠΎ искам Π΄Π° говоря Π·Π° ΠΌΠ½ΠΎΠ³ΠΎ: ΠΎΡ‚ синхронизиранСто Π½Π° схСмата Π½Π° Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ Π΄ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π° Π½Π° Π΄ΠΎΡΡ‚ΡŠΠΏΠ° ΠΈ ΠΎΠ±Π΅Π·Π»ΠΈΡ‡Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π»ΠΈΡ‡Π½ΠΈ Π΄Π°Π½Π½ΠΈ. Врябва ΡΡŠΡ‰ΠΎ Π΄Π° сС ΠΎΡ‚Π±Π΅Π»Π΅ΠΆΠΈ, Ρ‡Π΅ Ρ‚ΠΎΠ²Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π΅ Π΅ замСститСл Π½Π° Ρ€Π΅Π°Π»Π½ΠΈ Π°Π½Π°Π»ΠΈΡ‚ΠΈΡ‡Π½ΠΈ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ ΠΈ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°, Ρ‚ΠΎ Ρ€Π΅ΡˆΠ°Π²Π° само ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π΅Π½ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

На Π½Π°ΠΉ-високо Π½ΠΈΠ²ΠΎ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Ρ‚Π°ΠΊΠ°:

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π΅Π½ Π°Π½Π°Π»ΠΈΠ· Π² Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° Π½Π° микросСрвизи: ΠΏΠΎΠΌΠΎΡ‰ ΠΈ ΠΏΠΎΠ΄ΠΊΠ°Π½Π° Postgres FDW
Има PostgreSQL Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Ρ‚ своитС Ρ€Π°Π±ΠΎΡ‚Π½ΠΈ Π΄Π°Π½Π½ΠΈ, ΠΈ Π½Π°ΠΉ-Π²Π°ΠΆΠ½ΠΎΡ‚ΠΎ Π΅, Ρ‡Π΅ Π°Π½Π°Π»ΠΈΡ‚ΠΈΡ‡Π½ΠΈΡ‚Π΅ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ Π½Π° всички услуги са ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ към Ρ‚Π°Π·ΠΈ Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ Ρ‡Ρ€Π΅Π· FDW. Π’ΠΎΠ²Π° Π΄Π°Π²Π° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ заявка към няколко Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ ΠΈ няма Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ Π΅: PostgreSQL, MySQL, MongoDB ΠΈΠ»ΠΈ Π½Π΅Ρ‰ΠΎ Π΄Ρ€ΡƒΠ³ΠΎ (Ρ„Π°ΠΉΠ», API, Π°ΠΊΠΎ извСднъТ няма подходяща ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ своя собствСна). Π•, всичко ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° страхотно! КъсамС?

Ако всичко ΠΏΡ€ΠΈΠΊΠ»ΡŽΡ‡ΠΈ Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° Π±ΡŠΡ€Π·ΠΎ ΠΈ просто, Ρ‚ΠΎΠ³Π°Π²Π°, вСроятно, статията нямашС Π΄Π° ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°.

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

ΠŸΡ€ΠΎΡΡ‚Π° заявка ΠΈ ΠΏΠ»Π°Π½ с нСя

Π—Π° Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ ΠΊΠ°ΠΊ Postgres ΠΏΡ€Π°Π²ΠΈ запитвания към Ρ‚Π°Π±Π»ΠΈΡ†Π° с 6 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° Ρ€Π΅Π΄Π° Π½Π° ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ ΡΡŠΡ€Π²ΡŠΡ€, Π½Π΅ΠΊΠ° Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π΅Π΄ΠΈΠ½ прост ΠΏΠ»Π°Π½.

explain analyze verbose  
SELECT count(1)
FROM fdw_schema.table;

Aggregate  (cost=418383.23..418383.24 rows=1 width=8) (actual time=3857.198..3857.198 rows=1 loops=1)
  Output: count(1)
  ->  Foreign Scan on fdw_schema."table"  (cost=100.00..402376.14 rows=6402838 width=0) (actual time=4.874..3256.511 rows=6406868 loops=1)
        Output: "table".id, "table".is_active, "table".meta, "table".created_dt
        Remote SQL: SELECT NULL FROM fdw_schema.table
Planning time: 0.986 ms
Execution time: 3857.436 ms

Π˜Π·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° VERBOSE Π²ΠΈ позволява Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ заявката, която Ρ‰Π΅ бъдС ΠΈΠ·ΠΏΡ€Π°Ρ‚Π΅Π½Π° Π΄ΠΎ отдалСчСния ΡΡŠΡ€Π²ΡŠΡ€ ΠΈ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅ ΠΎΡ‚ която Ρ‰Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π·Π° ΠΏΠΎ-Π½Π°Ρ‚Π°Ρ‚ΡŠΡˆΠ½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° (RemoteSQL Π½ΠΈΠ·).

НСка ΠΎΡ‚ΠΈΠ΄Π΅ΠΌ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-Π΄Π°Π»Π΅Ρ‡ ΠΈ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ няколко Ρ„ΠΈΠ»Ρ‚ΡŠΡ€Π° към Π½Π°ΡˆΠ°Ρ‚Π° заявка: Π΅Π΄ΠΈΠ½ ΠΏΠΎ Π±ΡƒΠ»Π΅Π²Π° ΠΏΠΎΠ»Π΅, Π΅Π΄Π½ΠΎ ΠΏΠΎ Π²Ρ… ΠΊΠ»Π΅ΠΉΠΌΠΎΡ‚ΠΎ Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» ΠΈ Π΅Π΄ΠΈΠ½ ΠΏΠΎ jsonb.

explain analyze verbose
SELECT count(1)
FROM fdw_schema.table 
WHERE is_active is True
AND created_dt BETWEEN CURRENT_DATE - INTERVAL '7 month' 
AND CURRENT_DATE - INTERVAL '6 month'
AND meta->>'source' = 'test';

Aggregate  (cost=577487.69..577487.70 rows=1 width=8) (actual time=27473.818..25473.819 rows=1 loops=1)
  Output: count(1)
  ->  Foreign Scan on fdw_schema."table"  (cost=100.00..577469.21 rows=7390 width=0) (actual time=31.369..25372.466 rows=1360025 loops=1)
        Output: "table".id, "table".is_active, "table".meta, "table".created_dt
        Filter: (("table".is_active IS TRUE) AND (("table".meta ->> 'source'::text) = 'test'::text) AND ("table".created_dt >= (('now'::cstring)::date - '7 mons'::interval)) AND ("table".created_dt <= ((('now'::cstring)::date)::timestamp with time zone - '6 mons'::interval)))
        Rows Removed by Filter: 5046843
        Remote SQL: SELECT created_dt, is_active, meta FROM fdw_schema.table
Planning time: 0.665 ms
Execution time: 27474.118 ms

Π’ΡƒΠΊ сС ΠΊΡ€ΠΈΠ΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΡŠΡ‚, Π½Π° ΠΊΠΎΠΉΡ‚ΠΎ трябва Π΄Π° ΠΎΠ±ΡŠΡ€Π½Π΅Ρ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΏΡ€ΠΈ писанС Π½Π° заявки. Π€ΠΈΠ»Ρ‚Ρ€ΠΈΡ‚Π΅ Π½Π΅ са Π±ΠΈΠ»ΠΈ ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»Π΅Π½ΠΈ към отдалСчСния ΡΡŠΡ€Π²ΡŠΡ€, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°, Ρ‡Π΅ Π·Π° Π΄Π° Π³ΠΎ изпълни, postgres изтСгля всичкитС 6 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° Ρ€Π΅Π΄Π°, Π·Π° Π΄Π° Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π° Π»ΠΎΠΊΠ°Π»Π½ΠΎ (Ρ€Π΅Π΄Π° Filter) ΠΈ Π΄Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠΈ Π°Π³Ρ€Π΅Π³ΠΈΡ€Π°Π½Π΅ ΠΏΠΎ-късно. ΠšΠ»ΡŽΡ‡ΡŠΡ‚ към успСха Π΅ Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ заявка, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ‚Π΅ Π΄Π° сС ΠΏΡ€Π΅Π΄Π°Π²Π°Ρ‚ Π½Π° ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½Π°Ρ‚Π° машина, Π° Π½ΠΈΠ΅ Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ ΠΈ ΠΎΠ±ΠΎΠ±Ρ‰Π°Π²Π°ΠΌΠ΅ само Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈΡ‚Π΅ Ρ€Π΅Π΄ΠΎΠ²Π΅.

Π’ΠΎΠ²Π° са някакви Π±ΡƒΠ»Π΅Π²ΠΈ глупости

Π‘ Π±ΡƒΠ»Π΅Π²ΠΈΡ‚Π΅ ΠΏΠΎΠ»Π΅Ρ‚Π° всичко Π΅ просто. Π’ ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½ΠΎΡ‚ΠΎ Π·Π°ΠΏΠΈΡ‚Π²Π°Π½Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡŠΡ‚ сС дълТи Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° is. Ако Π³ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΠΌ с =, Ρ‚ΠΎΠ³Π°Π²Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ слСдния Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚:

explain analyze verbose
SELECT count(1)
FROM fdw_schema.table
WHERE is_active = True
AND created_dt BETWEEN CURRENT_DATE - INTERVAL '7 month' 
AND CURRENT_DATE - INTERVAL '6 month'
AND meta->>'source' = 'test';

Aggregate  (cost=508010.14..508010.15 rows=1 width=8) (actual time=19064.314..19064.314 rows=1 loops=1)
  Output: count(1)
  ->  Foreign Scan on fdw_schema."table"  (cost=100.00..507988.44 rows=8679 width=0) (actual time=33.035..18951.278 rows=1360025 loops=1)
        Output: "table".id, "table".is_active, "table".meta, "table".created_dt
        Filter: ((("table".meta ->> 'source'::text) = 'test'::text) AND ("table".created_dt >= (('now'::cstring)::date - '7 mons'::interval)) AND ("table".created_dt <= ((('now'::cstring)::date)::timestamp with time zone - '6 mons'::interval)))
        Rows Removed by Filter: 3567989
        Remote SQL: SELECT created_dt, meta FROM fdw_schema.table WHERE (is_active)
Planning time: 0.834 ms
Execution time: 19064.534 ms

ΠšΠ°ΠΊΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ„ΠΈΠ»Ρ‚ΡŠΡ€ΡŠΡ‚ прСлСтя към отдалСчСния ΡΡŠΡ€Π²ΡŠΡ€ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π·Π° изпълнСниС бСшС Π½Π°ΠΌΠ°Π»Π΅Π½ΠΎ ΠΎΡ‚ 27 Π½Π° 19 сСкунди.

Врябва Π΄Π° сС ΠΎΡ‚Π±Π΅Π»Π΅ΠΆΠΈ, Ρ‡Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΡŠΡ‚ is Ρ€Π°Π·Π»ΠΈΡ‡Π΅Π½ ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° = Ρ‚ΠΎΠ·ΠΈ, ΠΊΠΎΠΉΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ с Π½ΡƒΠ»Π΅Π²Π°Ρ‚Π° стойност. ΠžΠ·Π½Π°Ρ‡Π°Π²Π°, Ρ‡Π΅ Π½Π΅ Π΅ вярно във Ρ„ΠΈΠ»Ρ‚ΡŠΡ€Π° Ρ‰Π΅ остави стойноститС False ΠΈ Null, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ != Вярно Ρ‰Π΅ остави само False стойности. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎ ΠΏΡ€ΠΈ смяна Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° Π½Π΅ трябва Π΄Π° ΠΏΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ Π΄Π²Π΅ условия към Ρ„ΠΈΠ»Ρ‚ΡŠΡ€Π° с ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° OR, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, WHERE (ΠΊΠΎΠ»Π° != True) Π˜Π›Π˜ (ΠΊΠΎΠ»Π° Π΅ Π½ΡƒΠ»Π°).

Π‘ Ρ€Π°Π·Π±Ρ€Π°Π½ΠΎ Π±ΡƒΠ»Π΅Π²ΠΎ, ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠ°Π²Π°ΠΌΠ΅ Π½Π°ΠΏΡ€Π΅Π΄. ΠœΠ΅ΠΆΠ΄ΡƒΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π½Π΅ΠΊΠ° Π²ΡŠΡ€Π½Π΅ΠΌ Ρ„ΠΈΠ»Ρ‚ΡŠΡ€Π° ΠΏΠΎ Π±ΡƒΠ»Π΅Π²Π° стойност Π² ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π½Π°Ρ‚Π° ΠΌΡƒ Ρ„ΠΎΡ€ΠΌΠ°, Π·Π° Π΄Π° Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ нСзависимо Π΅Ρ„Π΅ΠΊΡ‚Π° ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ.

timestamptz? Ρ…Ρ†

По ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ чСсто трябва Π΄Π° СкспСримСнтиратС ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ заявка, която Π²ΠΊΠ»ΡŽΡ‡Π²Π° ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ΠΈ ΡΡŠΡ€Π²ΡŠΡ€ΠΈ, ΠΈ Π΅Π΄Π²Π° слСд Ρ‚ΠΎΠ²Π° Π΄Π° Ρ‚ΡŠΡ€ΡΠΈΡ‚Π΅ обяснСниС Π·Π°Ρ‰ΠΎ Ρ‚ΠΎΠ²Π° сС случва. Много ΠΌΠ°Π»ΠΊΠΎ информация Π·Π° Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½Π°ΠΌΠ΅Ρ€ΠΈ Π² ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚. И Ρ‚Π°ΠΊΠ°, Π² СкспСримСнти установихмС, Ρ‡Π΅ Ρ„ΠΈΠ»Ρ‚ΡŠΡ€ с фиксирана Π΄Π°Ρ‚Π° Π»Π΅Ρ‚ΠΈ Π΄ΠΎ ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ ΡΡŠΡ€Π²ΡŠΡ€ с Π³Ρ€ΡŠΠΌ ΠΈ Ρ‚Ρ€ΡΡΡŠΠΊ, Π½ΠΎ ΠΊΠΎΠ³Π°Ρ‚ΠΎ искамС Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΠΌ Π΄Π°Ρ‚Π°Ρ‚Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π½ΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ now() ΠΈΠ»ΠΈ CURRENT_DATE, Ρ‚ΠΎΠ²Π° Π½Π΅ сС случва. Π’ нашия ΠΏΡ€ΠΈΠΌΠ΅Ρ€ смС Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Ρ„ΠΈΠ»Ρ‚ΡŠΡ€, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ ΠΊΠΎΠ»ΠΎΠ½Π°Ρ‚Π° created_at Π΄Π° ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° Π΄Π°Π½Π½ΠΈ Π·Π° Ρ‚ΠΎΡ‡Π½ΠΎ 1 мСсСц Π² ΠΌΠΈΠ½Π°Π»ΠΎΡ‚ΠΎ (ΠœΠ•Π–Π”Π£ CURRENT_DATE - INTERVAL '7 мСсСца' И CURRENT_DATE - INTERVAL '6 мСсСца'). Какво Π½Π°ΠΏΡ€Π°Π²ΠΈΡ…ΠΌΠ΅ Π² Ρ‚ΠΎΠ·ΠΈ случай?

explain analyze verbose
SELECT count(1)
FROM fdw_schema.table 
WHERE is_active is True
AND created_dt >= (SELECT CURRENT_DATE::timestamptz - INTERVAL '7 month') 
AND created_dt <(SELECT CURRENT_DATE::timestamptz - INTERVAL '6 month')
AND meta->>'source' = 'test';

Aggregate  (cost=306875.17..306875.18 rows=1 width=8) (actual time=4789.114..4789.115 rows=1 loops=1)
  Output: count(1)
  InitPlan 1 (returns $0)
    ->  Result  (cost=0.00..0.02 rows=1 width=8) (actual time=0.007..0.008 rows=1 loops=1)
          Output: ((('now'::cstring)::date)::timestamp with time zone - '7 mons'::interval)
  InitPlan 2 (returns $1)
    ->  Result  (cost=0.00..0.02 rows=1 width=8) (actual time=0.002..0.002 rows=1 loops=1)
          Output: ((('now'::cstring)::date)::timestamp with time zone - '6 mons'::interval)
  ->  Foreign Scan on fdw_schema."table"  (cost=100.02..306874.86 rows=105 width=0) (actual time=23.475..4681.419 rows=1360025 loops=1)
        Output: "table".id, "table".is_active, "table".meta, "table".created_dt
        Filter: (("table".is_active IS TRUE) AND (("table".meta ->> 'source'::text) = 'test'::text))
        Rows Removed by Filter: 76934
        Remote SQL: SELECT is_active, meta FROM fdw_schema.table WHERE ((created_dt >= $1::timestamp with time zone)) AND ((created_dt < $2::timestamp with time zone))
Planning time: 0.703 ms
Execution time: 4789.379 ms

ΠŸΠΎΠ΄ΠΊΠ°Π½ΠΈΡ…ΠΌΠ΅ плановия Π΄Π° изчисли Π΄Π°Ρ‚Π°Ρ‚Π° ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ Π² подзаявката ΠΈ Π΄Π° ΠΏΡ€Π΅Π΄Π°Π΄Π΅ Π²Π΅Ρ‡Π΅ ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²Π΅Π½Π°Ρ‚Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° към Ρ„ΠΈΠ»Ρ‚ΡŠΡ€Π°. И Ρ‚Π°Π·ΠΈ подсказка Π½ΠΈ Π΄Π°Π΄Π΅ страхотСн Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚, заявката стана ΠΏΠΎΡ‡Ρ‚ΠΈ 6 ΠΏΡŠΡ‚ΠΈ ΠΏΠΎ-Π±ΡŠΡ€Π·Π°!

ΠžΡ‚Π½ΠΎΠ²ΠΎ Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° Π²Π½ΠΈΠΌΠ°Π²Π°Ρ‚Π΅ Ρ‚ΡƒΠΊ: Ρ‚ΠΈΠΏΡŠΡ‚ Π΄Π°Π½Π½ΠΈ Π² подзаявката трябва Π΄Π° Π΅ ΡΡŠΡ‰ΠΈΡΡ‚ ΠΊΠ°Ρ‚ΠΎ Ρ‚ΠΎΠ·ΠΈ Π½Π° ΠΏΠΎΠ»Π΅Ρ‚ΠΎ, ΠΏΠΎ ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°ΠΌΠ΅, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π΅Π½ случай плановият Ρ‰Π΅ Ρ€Π΅ΡˆΠΈ, Ρ‡Π΅ Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Ρ‚ΠΈΠΏΠΎΠ²Π΅Ρ‚Π΅ са Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡŠΡ€Π²ΠΎ Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ всички Π΄Π°Π½Π½ΠΈ ΠΈ Π³ΠΈ Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°ΠΉΡ‚Π΅ Π»ΠΎΠΊΠ°Π»Π½ΠΎ.

НСка Π²ΡŠΡ€Π½Π΅ΠΌ Ρ„ΠΈΠ»Ρ‚ΡŠΡ€Π° ΠΏΠΎ Π΄Π°Ρ‚Π° към ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½Π°Ρ‚Π° ΠΌΡƒ стойност.

Π€Ρ€Π΅Π΄ΠΈ срСщу jsonb

ΠšΠ°Ρ‚ΠΎ цяло Π±ΡƒΠ»Π΅Π²ΠΈΡ‚Π΅ ΠΏΠΎΠ»Π΅Ρ‚Π° ΠΈ Π΄Π°Ρ‚ΠΈ Π²Π΅Ρ‡Π΅ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ ускориха Π½Π°ΡˆΠ°Ρ‚Π° заявка, Π½ΠΎ имашС ΠΎΡ‰Π΅ Π΅Π΄ΠΈΠ½ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½ΠΈ. Π‘ΠΈΡ‚ΠΊΠ°Ρ‚Π° с Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ ΠΏΠΎ Π½Π΅Π³ΠΎ, чСстно ΠΊΠ°Π·Π°Π½ΠΎ, всС ΠΎΡ‰Π΅ Π½Π΅ Π΅ ΠΏΡ€ΠΈΠΊΠ»ΡŽΡ‡ΠΈΠ»Π°, Π²ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅ ΠΈ Ρ‚ΡƒΠΊ ΠΈΠΌΠ° успСхи. И Ρ‚Π°ΠΊΠ°, Π΅Ρ‚ΠΎ ΠΊΠ°ΠΊ успяхмС Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ΠΌ Ρ„ΠΈΠ»Ρ‚ΡŠΡ€Π° jsonb ΠΏΠΎΠ»Π΅ към ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ ΡΡŠΡ€Π²ΡŠΡ€.

explain analyze verbose
SELECT count(1)
FROM fdw_schema.table 
WHERE is_active is True
AND created_dt BETWEEN CURRENT_DATE - INTERVAL '7 month' 
AND CURRENT_DATE - INTERVAL '6 month'
AND meta @> '{"source":"test"}'::jsonb;

Aggregate  (cost=245463.60..245463.61 rows=1 width=8) (actual time=6727.589..6727.590 rows=1 loops=1)
  Output: count(1)
  ->  Foreign Scan on fdw_schema."table"  (cost=1100.00..245459.90 rows=1478 width=0) (actual time=16.213..6634.794 rows=1360025 loops=1)
        Output: "table".id, "table".is_active, "table".meta, "table".created_dt
        Filter: (("table".is_active IS TRUE) AND ("table".created_dt >= (('now'::cstring)::date - '7 mons'::interval)) AND ("table".created_dt <= ((('now'::cstring)::date)::timestamp with time zone - '6 mons'::interval)))
        Rows Removed by Filter: 619961
        Remote SQL: SELECT created_dt, is_active FROM fdw_schema.table WHERE ((meta @> '{"source": "test"}'::jsonb))
Planning time: 0.747 ms
Execution time: 6727.815 ms

ВмСсто Π΄Π° Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°Ρ‚Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΈ, трябва Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ ΠΏΡ€ΠΈΡΡŠΡΡ‚Π²ΠΈΠ΅Ρ‚ΠΎ Π½Π° Π΅Π΄ΠΈΠ½ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€. jsonb Π² Ρ€Π°Π·Π»ΠΈΡ‡Π΅Π½. 7 сСкунди вмСсто ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½ΠΈΡ‚Π΅ 29. ЗасСга Ρ‚ΠΎΠ²Π° Π΅ СдинствСният ΡƒΡΠΏΠ΅ΡˆΠ΅Π½ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π·Π° ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»ΡΠ½Π΅ Π½Π° Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ jsonb към ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ ΡΡŠΡ€Π²ΡŠΡ€, Π½ΠΎ Ρ‚ΡƒΠΊ Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° Π²Π·Π΅ΠΌΠ΅ΠΌ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ Π΅Π΄Π½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅: ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ вСрсия 9.6 Π½Π° Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ, Π½ΠΎ Π΄ΠΎ края Π½Π° Π°ΠΏΡ€ΠΈΠ» ΠΏΠ»Π°Π½ΠΈΡ€Π°ΠΌΠ΅ Π΄Π° Π·Π°Π²ΡŠΡ€ΡˆΠΈΠΌ послСднитС тСстовС ΠΈ Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ΠΌ към вСрсия 12. Π’Π΅Π΄Π½Π°Π³Π° слСд ΠΊΠ°Ρ‚ΠΎ Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅, Ρ‰Π΅ напишСм ΠΊΠ°ΠΊ сС Π΅ ΠΎΡ‚Ρ€Π°Π·ΠΈΠ»ΠΎ, Π·Π°Ρ‰ΠΎΡ‚ΠΎ ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ, Π·Π° ΠΊΠΎΠΈΡ‚ΠΎ ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ Π½Π°Π΄Π΅ΠΆΠ΄ΠΈ: json_path, Π½ΠΎΠ²ΠΎ CTE ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, push down (ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‰ΠΈ ΠΎΡ‚ вСрсия 10). Много искам Π΄Π° Π³ΠΎ ΠΏΡ€ΠΎΠ±Π²Π°ΠΌ скоро.

Π”ΠΎΠ²ΡŠΡ€ΡˆΠΈ Π³ΠΎ

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ…ΠΌΠ΅ ΠΊΠ°ΠΊ всяка промяна влияС Π²ΡŠΡ€Ρ…Ρƒ скоростта Π½Π° заявката ΠΏΠΎΠΎΡ‚Π΄Π΅Π»Π½ΠΎ. НСка сСга Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊΠ²ΠΎ сС случва, ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΈ Ρ‚Ρ€ΠΈΡ‚Π΅ Ρ„ΠΈΠ»Ρ‚ΡŠΡ€Π° са написани ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ.

explain analyze verbose
SELECT count(1)
FROM fdw_schema.table 
WHERE is_active = True
AND created_dt >= (SELECT CURRENT_DATE::timestamptz - INTERVAL '7 month') 
AND created_dt <(SELECT CURRENT_DATE::timestamptz - INTERVAL '6 month')
AND meta @> '{"source":"test"}'::jsonb;

Aggregate  (cost=322041.51..322041.52 rows=1 width=8) (actual time=2278.867..2278.867 rows=1 loops=1)
  Output: count(1)
  InitPlan 1 (returns $0)
    ->  Result  (cost=0.00..0.02 rows=1 width=8) (actual time=0.010..0.010 rows=1 loops=1)
          Output: ((('now'::cstring)::date)::timestamp with time zone - '7 mons'::interval)
  InitPlan 2 (returns $1)
    ->  Result  (cost=0.00..0.02 rows=1 width=8) (actual time=0.003..0.003 rows=1 loops=1)
          Output: ((('now'::cstring)::date)::timestamp with time zone - '6 mons'::interval)
  ->  Foreign Scan on fdw_schema."table"  (cost=100.02..322041.41 rows=25 width=0) (actual time=8.597..2153.809 rows=1360025 loops=1)
        Output: "table".id, "table".is_active, "table".meta, "table".created_dt
        Remote SQL: SELECT NULL FROM fdw_schema.table WHERE (is_active) AND ((created_dt >= $1::timestamp with time zone)) AND ((created_dt < $2::timestamp with time zone)) AND ((meta @> '{"source": "test"}'::jsonb))
Planning time: 0.820 ms
Execution time: 2279.087 ms

Π”Π°, заявката ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΠΎ-слоТна, Ρ‚ΠΎΠ²Π° Π΅ форсирана Ρ†Π΅Π½Π°, Π½ΠΎ скоростта Π½Π° изпълнСниС Π΅ 2 сСкунди, ΠΊΠΎΠ΅Ρ‚ΠΎ Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΎΡ‚ 10 ΠΏΡŠΡ‚ΠΈ ΠΏΠΎ-Π±ΡŠΡ€Π·ΠΎ! И Π½ΠΈΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π·Π° проста заявка Π·Π° сравнитСлно малък Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ Π΄Π°Π½Π½ΠΈ. ΠŸΡ€ΠΈ Ρ€Π΅Π°Π»Π½ΠΈ заявки ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ…ΠΌΠ΅ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π΄ΠΎ няколкостотин ΠΏΡŠΡ‚ΠΈ.

Π—Π° Π΄Π° ΠΎΠ±ΠΎΠ±Ρ‰ΠΈΠΌ: Π°ΠΊΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ PostgreSQL с FDW, Π²ΠΈΠ½Π°Π³ΠΈ провСрявайтС Π΄Π°Π»ΠΈ всички Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ са ΠΈΠ·ΠΏΡ€Π°Ρ‚Π΅Π½ΠΈ към отдалСчСния ΡΡŠΡ€Π²ΡŠΡ€ ΠΈ Ρ‰Π΅ стС Π΄ΠΎΠ²ΠΎΠ»Π½ΠΈ... ПонС Π΄ΠΎΠΊΠ°Ρ‚ΠΎ Π½Π΅ стигнСтС Π΄ΠΎ обСдинСния ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ ΠΎΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΡΡŠΡ€Π²ΡŠΡ€ΠΈ. Но Ρ‚ΠΎΠ²Π° Π΅ история Π·Π° Π΄Ρ€ΡƒΠ³Π° статия.

Благодаря Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅Ρ‚ΠΎ! Π©Π΅ сС Ρ€Π°Π΄Π²Π°ΠΌ Π΄Π° чуя Π²ΡŠΠΏΡ€ΠΎΡΠΈ, ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈ ΠΈ истории Π·Π° Π²Π°ΡˆΠΈΡ‚Π΅ прСТивявания Π² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΡ‚Π΅.

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

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