ΠΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠ½Π°ΡΠ° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° Π²ΡΠΈΡΠΊΠΎ ΠΎΡΡΠ°Π½Π°Π»ΠΎ Π² ΡΠΎΠ·ΠΈ ΡΠ²ΡΡ, ΠΈΠΌΠ° ΡΠ²ΠΎΠΈΡΠ΅ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π° ΠΈ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΡΠΈ. ΠΡΠΊΠΎΠΈ ΠΏΡΠΎΡΠ΅ΡΠΈ ΡΡΠ°Π²Π°Ρ ΠΏΠΎ-ΠΏΡΠΎΡΡΠΈ, Π° Π΄ΡΡΠ³ΠΈ β ΠΏΠΎ-ΡΠ»ΠΎΠΆΠ½ΠΈ. Π ΠΈΠΌΠ΅ΡΠΎ Π½Π° Π±ΡΡΠ·ΠΈΠ½Π°ΡΠ° Π½Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ ΠΈ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ°ΡΠ° ΠΌΠ°ΡΠ°Π±ΠΈΡΡΠ΅ΠΌΠΎΡΡ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠ°Π²ΠΈΠΌ ΠΆΠ΅ΡΡΠ²ΠΈ. ΠΠ΄Π½Π° ΠΎΡ ΡΡΡ Π΅ ΡΡΠ»ΠΎΠΆΠ½ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π°Π½Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠ°. ΠΠΎΠΊΠ°ΡΠΎ ΠΏΡΠΈ ΠΌΠΎΠ½ΠΎΠ»ΠΈΡΠ° ΡΡΠ»Π°ΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½Π° Π°Π½Π°Π»ΠΈΡΠΈΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ²Π΅Π΄Π΅ Π΄ΠΎ SQL Π·Π°ΡΠ²ΠΊΠΈ ΠΊΡΠΌ Π°Π½Π°Π»ΠΈΡΠΈΡΠ½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°, Π² ΠΌΡΠ»ΡΠΈΡΠ΅ΡΠ²ΠΈΡΠ½Π°ΡΠ° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° Π²ΡΠ΅ΠΊΠΈ ΡΠ΅ΡΠ²ΠΈΡ ΡΠ°Π·ΠΏΠΎΠ»Π°Π³Π° ΡΡΡ ΡΠ²ΠΎΡ Π±Π°Π·Π° ΠΈ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°, ΡΠ΅ Ρ Π΅Π΄Π½Π° Π·Π°ΡΠ²ΠΊΠ° Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠ΅ ΡΠΏΡΠ°Π²ΠΈΠΌ (ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅ Π±ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ?). ΠΠ° ΡΠ΅Π·ΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ²Π°Ρ ΠΊΠ°ΠΊ ΡΠ΅ΡΠΈΡ ΠΌΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½Π°ΡΠ° Π°Π½Π°Π»ΠΈΡΠΈΠΊΠ° Π² Π½Π°ΡΠ°ΡΠ° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ ΠΈ ΠΊΠ°ΠΊ ΡΠ΅ Π½Π°ΡΡΠΈΡ ΠΌΠ΅ Π΄Π° ΠΆΠΈΠ²Π΅Π΅ΠΌ Ρ ΡΠΎΠ²Π° ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ β Π΄ΠΎΠ±ΡΠ΅ Π΄ΠΎΡΠ»ΠΈ.

ΠΠ°Π·Π²Π°ΠΌ ΡΠ΅ ΠΠ°Π²Π΅Π» Π‘ΠΈΠ²Π°Ρ ΠΈ Π² ΠΠΎΠΌΠΠ»ΠΈΠΊ ΡΠ°Π±ΠΎΡΡ Π² Π΅ΠΊΠΈΠΏ, ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ΅Π½ Π·Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°ΡΠ° Π½Π° Π°Π½Π°Π»ΠΈΡΠΈΡΠ½ΠΎΡΠΎ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π½Π° Π΄Π°Π½Π½ΠΈ. Π£ΡΠ»ΠΎΠ²Π½ΠΎ Π½Π°ΡΠ°ΡΠ° Π΄Π΅ΠΉΠ½ΠΎΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΎΡΠ½Π΅ΡΠ΅ ΠΊΡΠΌ Π΄Π°ΡΠ° ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΠΈΠ½Π³, Π½ΠΎ Π²ΡΡΡΠ½ΠΎΡΡ ΠΎΠ±Ρ
Π²Π°ΡΡΡ Π½Π° Π·Π°Π΄Π°ΡΠΈΡΠ΅ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-ΡΠΈΡΠΎΠΊ. ΠΠΌΠ° ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈ Π·Π° Π΄Π°ΡΠ° ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΠΈΠ½Π³Π° ETL/ELT, ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° ΠΈ Π°Π΄Π°ΠΏΡΠ°ΡΠΈΡ Π½Π° ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π·Π° Π°Π½Π°Π»ΠΈΠ· Π½Π° Π΄Π°Π½Π½ΠΈ ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ. ΠΠΎ-ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ, Π·Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½Π°ΡΠ° ΠΎΡΡΠ΅ΡΠ½ΠΎΡΡ ΡΠ΅ΡΠΈΡ
ΠΌΠ΅ Π΄Π° βΡΠ΅ ΠΏΡΠ°Π²ΠΈΠΌβ, ΡΠ΅ ΠΈΠΌΠ°ΠΌΠ΅ ΠΌΠΎΠ½ΠΎΠ»ΠΈΡ ΠΈ Π΄Π° Π΄Π°Π΄Π΅ΠΌ Π½Π° Π°Π½Π°Π»ΠΈΡΠΈΡΠΈΡΠ΅ Π΅Π΄Π½Π° Π±Π°Π·Π°, Π² ΠΊΠΎΡΡΠΎ ΡΠ΅ ΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ°Ρ Π²ΡΠΈΡΠΊΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈ ΠΈΠΌ Π΄Π°Π½Π½ΠΈ.
ΠΡΠ² Π²ΡΠ΅ΠΊΠΈ ΡΠ»ΡΡΠ°ΠΉ, ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π°Ρ ΠΌΠ΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΎΠΏΡΠΈΠΈ. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·Π³ΡΠ°Π΄ΠΈΠΌ ΠΏΡΠ»Π½ΠΎΡΠ΅Π½Π½ΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ β Π΄ΠΎΡΠΈ ΠΎΠΏΠΈΡΠ°Ρ ΠΌΠ΅, Π½ΠΎ, ΡΠ΅ΡΡΠ½ΠΎ ΠΊΠ°Π·Π°Π½ΠΎ, Π½Π΅ ΡΡΠΏΡΡ ΠΌΠ΅ Π΄Π° ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ ΡΠ΅ΡΡΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² Π»ΠΎΠ³ΠΈΠΊΠ°ΡΠ° Ρ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»Π½ΠΎ Π±Π°Π²Π½ΠΈΡ ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ ΠΈ Π²Π½Π°ΡΡΠ½Π΅ΡΠΎ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² Π½Π΅Π³ΠΎ (Π°ΠΊΠΎ Π½Π° Π½ΡΠΊΠΎΠ³ΠΎ Π΅ ΡΡΠΏΡΠ»ΠΎ, ΠΌΠΎΠ»Ρ, Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ Π² ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ΅ ΠΊΠ°ΠΊ). ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΊΠ°ΠΆΠ΅ΠΌ Π½Π° Π°Π½Π°Π»ΠΈΡΠΈΡΠΈΡΠ΅: βΠ₯Π΅ΠΉ, Π½Π°ΡΡΠ΅ΡΠ΅ python ΠΈ ΡΠ°Π±ΠΎΡΠ΅ΡΠ΅ Ρ Π°Π½Π°Π»ΠΈΡΠΈΡΠ½ΠΈ ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈβ, Π½ΠΎ ΡΠΎΠ²Π° Π΅ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΎ ΠΈΠ·ΠΈΡΠΊΠ²Π°Π½Π΅ Π·Π° ΠΏΠΎΠ΄Π±ΠΎΡ Π½Π° ΠΏΠ΅ΡΡΠΎΠ½Π°Π», ΠΈ Π½ΠΈ ΡΠ΅ ΡΡΡΡΠ²Π°ΡΠ΅, ΡΠ΅ Π΅ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ΅ Π΄Π° Π³ΠΎ ΠΈΠ·Π±Π΅Π³Π½Π΅ΠΌ, Π°ΠΊΠΎ ΠΌΠΎΠΆΠ΅ΠΌ. Π Π΅ΡΠΈΡ ΠΌΠ΅ Π΄Π° ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡΡΠ° FDW (Foreign Data Wrapper): Π²ΡΡΡΠ½ΠΎΡΡ, ΡΠΎΠ²Π° Π΅ ΡΡΠ°Π½Π΄Π°ΡΡΠ΅Π½ dblink, ΠΊΠΎΠΉΡΠΎ Π΅ Π²ΠΊΠ»ΡΡΠ΅Π½ Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ° SQL, Π½ΠΎ Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-ΡΠ΄ΠΎΠ±Π΅Π½ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ. ΠΠ° Π±Π°Π·Π°ΡΠ° Π½Π° Π½Π΅Ρ Π½Π°ΠΏΡΠ°Π²ΠΈΡ ΠΌΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅ΡΠΎ Π² ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ° ΡΡΠ°Π½Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΎ ΠΈ Π½Π° Π½Π΅Π³ΠΎ ΡΠ΅ ΡΠΏΡΡΡ ΠΌΠ΅. ΠΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈΡΠ΅ ΠΌΡ ΡΠ° ΡΠ΅ΠΌΠ° Π½Π° ΠΎΡΠ΄Π΅Π»Π½Π° ΡΡΠ°ΡΠΈΡ, Π° ΠΌΠΎΠΆΠ΅ Π±ΠΈ ΠΈ Π½Π° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ Π΅Π΄Π½Π°, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΡΠ°Π·ΠΊΠ°ΠΆΠ΅ΠΌ Π·Π° ΠΌΠ½ΠΎΠ³ΠΎ Π½Π΅ΡΠ°: ΠΎΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° ΡΡ Π΅ΠΌΠΈΡΠ΅ Π½Π° Π±Π°Π·ΠΈΡΠ΅ Π΄ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π΄ΠΎΡΡΡΠΏΠ° ΠΈ Π°Π½ΠΎΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° Π»ΠΈΡΠ½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ. Π’ΡΡΠ±Π²Π° ΡΡΡΠΎ Π΄Π° ΡΠ΅ ΡΡΠΎΡΠ½ΠΈ, ΡΠ΅ ΡΠΎΠ²Π° ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π΅ Π΅ Π·Π°ΠΌΠ΅ΡΡΠΈΡΠ΅Π» Π½Π° ΡΠ΅Π°Π»Π½ΠΈΡΠ΅ Π°Π½Π°Π»ΠΈΡΠΈΡΠ½ΠΈ Π±Π°Π·ΠΈ ΠΈ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°, ΡΠΎ ΡΠ΅ΡΠ°Π²Π° ΡΠ°ΠΌΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π° Π·Π°Π΄Π°ΡΠ°.
ΠΠ° Π²ΠΈΡΠΎΠΊΠΎ Π½ΠΈΠ²ΠΎ, ΡΠΎΠ²Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ°ΠΊΠ°:

ΠΠΌΠ°ΠΌΠ΅ Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ PostgreSQL, ΠΊΡΠ΄Π΅ΡΠΎ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΡΡ
ΡΠ°Π½ΡΠ²Π°Ρ ΡΠ²ΠΎΠΈΡΠ΅ ΡΠ°Π±ΠΎΡΠ½ΠΈ Π΄Π°Π½Π½ΠΈ, Π° Π½Π°ΠΉ-Π²Π°ΠΆΠ½ΠΎΡΠΎ Π΅, ΡΠ΅ ΠΊΡΠΌ ΡΠ°Π·ΠΈ Π±Π°Π·Π° ΡΡΠ΅Π· FDW ΡΠ° ΡΠ²ΡΡΠ·Π°Π½ΠΈ Π°Π½Π°Π»ΠΈΡΠΈΡΠ½ΠΈ ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΡΡΠ»ΡΠ³ΠΈ. Π’ΠΎΠ²Π° Π΄Π°Π²Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° ΡΠ΅ Π½Π°ΠΏΠΈΡΠ΅ Π·Π°ΡΠ²ΠΊΠ° ΠΊΡΠΌ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π±Π°Π·ΠΈ, Π±Π΅Π· Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊΠ²ΠΈ ΡΠ° ΡΠ΅: PostgreSQL, MySQL, MongoDB ΠΈΠ»ΠΈ Π½Π΅ΡΠΎ Π΄ΡΡΠ³ΠΎ (ΡΠ°ΠΉΠ», API, Π°ΠΊΠΎ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ Π½ΡΠΌΠ° ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΡΡ Π²ΡΠ°ΠΏΠ΅Ρ, ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΠΈΡΠ΅ ΡΠ²ΠΎΠΉ). ΠΠΌΠΈ, ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Π²ΡΠΈΡΠΊΠΎ Π΅ Π½Π°ΡΠ΅Π΄! Π Π°Π·ΠΎΡΠΈΠ²Π°ΠΌΠ΅ ΡΠ΅?
ΠΠΊΠΎ Π²ΡΠΈΡΠΊΠΎ Π·Π°Π²ΡΡΡΠ²Π°ΡΠ΅ ΡΠΎΠ»ΠΊΠΎΠ²Π° Π±ΡΡΠ·ΠΎ ΠΈ Π»Π΅ΡΠ½ΠΎ, Π²Π΅ΡΠΎΡΡΠ½ΠΎ Π½ΡΠΌΠ°ΡΠ΅ Π΄Π° ΠΈΠΌΠ° ΠΈ ΡΡΠ°ΡΠΈΡ.
ΠΠ°ΠΆΠ½ΠΎ Π΅ ΡΡΠ½ΠΎ Π΄Π° ΠΎΡΡΠ·Π½Π°Π²Π°ΠΌΠ΅ ΠΊΠ°ΠΊ PostgreSQL ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π° Π·Π°ΡΠ²ΠΊΠΈΡΠ΅ ΠΊΡΠΌ ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ΠΈ ΡΡΡΠ²ΡΡΠΈ. Π’ΠΎΠ²Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Π»ΠΎΠ³ΠΈΡΠ½ΠΎ, Π½ΠΎ ΡΠ΅ΡΡΠΎ Π½Π΅ ΠΌΡ ΡΠ΅ ΠΎΠ±ΡΡΡΠ° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: PostgreSQL ΡΠ°Π·Π΄Π΅Π»Ρ Π·Π°ΡΠ²ΠΊΠ°ΡΠ° Π½Π° ΡΠ°ΡΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ Π½Π° ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ΠΈΡΠ΅ ΡΡΡΠ²ΡΡΠΈ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ, ΡΡΠ±ΠΈΡΠ° ΡΠ΅Π·ΠΈ Π΄Π°Π½Π½ΠΈ, Π° ΡΠΈΠ½Π°Π»Π½ΠΈΡΠ΅ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΈΠ·Π²ΡΡΡΠ²Π° ΡΠ°ΠΌ, ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ ΡΠΊΠΎΡΠΎΡΡΡΠ° Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ° ΡΠ΅ Π·Π°Π²ΠΈΡΠΈ Π² Π·Π½Π°ΡΠΈΡΠ΅Π»Π½Π° ΡΡΠ΅ΠΏΠ΅Π½ ΠΎΡ ΡΠΎΠ²Π° ΠΊΠ°ΠΊ Π΅ Π½Π°ΠΏΠΈΡΠ°Π½Π°. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΎΡΠ±Π΅Π»Π΅ΠΆΠΈ: ΠΊΠΎΠ³Π°ΡΠΎ Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΏΠΎΡΡΡΠΏΠ²Π°Ρ ΠΎΡ ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ ΡΡΡΠ²ΡΡ, ΡΠ΅ Π²Π΅ΡΠ΅ Π½ΡΠΌΠ°Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ, Π½ΡΠΌΠ°Ρ Π½ΠΈΡΠΎ, ΠΊΠΎΠ΅ΡΠΎ Π΄Π° ΠΏΠΎΠ΄ΠΏΠΎΠΌΠΎΠ³Π½Π΅ ΠΏΠ»Π°Π½ΠΈΡΠ°ΡΠ°, ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΠΎΠΌΠΎΠ³Π½Π΅ΠΌ ΠΈ Π΄Π° ΠΌΡ ΠΏΠΎΠ΄ΡΠΊΠ°Π·Π²Π°ΠΌΠ΅ ΡΠ°ΠΌΠΎ Π½ΠΈΠ΅ ΡΠ°ΠΌΠΈΡΠ΅. Π ΡΠΎΡΠ½ΠΎ Π·Π° ΡΠΎΠ²Π° ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΡΠ°Π·ΠΊΠ°ΠΆΠ΅ΠΌ ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ.
ΠΡΠΎΡΡ Π·Π°ΠΏΠΈΡ ΠΈ ΠΏΠ»Π°Π½ Ρ Π½Π΅Π³ΠΎ
ΠΠ° Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ ΠΊΠ°ΠΊ PostgreSQL ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Π·Π°ΠΏΠΈΡ ΠΊΡΠΌ ΡΠ°Π±Π»ΠΈΡΠ° Ρ 6 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΡΠ΅Π΄Π° Π½Π° ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ ΡΡΡΠ²ΡΡ, Π½Π΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΡΠΎΡΡΠΈΡ ΠΏΠ»Π°Π½.
explain analyze verbose
SELECT count(1)
FROM fdw_schema.table;
ΠΠ³ΡΠ΅Π³Π°Ρ (cost=418383.23..418383.24 rows=1 width=8) (actual time=3857.198..3857.198 rows=1 loops=1)
ΠΠ·Ρ
ΠΎΠ΄: count(1)
-> ΠΡΠ½ΡΠ½ΠΎ ΡΠΊΠ°Π½ΠΈΡΠ°Π½Π΅ Π½Π° fdw_schema."table" (cost=100.00..402376.14 rows=6402838 width=0) (actual time=4.874..3256.511 rows=6406868 loops=1)
ΠΠ·Ρ
ΠΎΠ΄: "table".id, "table".is_active, "table".meta, "table".created_dt
ΠΡΠ΄Π°Π»Π΅ΡΠ΅Π½ SQL: SELECT NULL FROM fdw_schema.table
ΠΡΠ΅ΠΌΠ΅ Π·Π° ΠΏΠ»Π°Π½ΠΈΡΠ°Π½Π΅: 0.986 ms
ΠΡΠ΅ΠΌΠ΅ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅: 3857.436 msΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΈΠ½ΡΡΡΡΠΊΡΡΡΠ° VERBOSE ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ Π·Π°ΠΏΠΈΡΠ°, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΈΠ·ΠΏΡΠ°ΡΠ΅Π½ Π½Π° ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ΠΈΡ ΡΡΡΠ²ΡΡ ΠΈ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠΌ Π·Π° ΠΏΠΎ-Π½Π°ΡΠ°ΡΡΡΠ½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° (ΡΠ΅Π΄ΠΈΡΠ° RemoteSQL).
ΠΠ΅ΠΊΠ° ΠΎΡΠΈΠ΄Π΅ΠΌ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-Π΄Π°Π»Π΅Ρ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² Π½Π°ΡΠΈΡ Π·Π°ΠΏΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΈΠ»ΡΡΠΈ: Π΅Π΄ΠΈΠ½ ΠΏΠΎ Π±ΡΠ»Π΅Π² ΠΏΠΎΠ»Π΅ΡΠΎ, Π΅Π΄ΠΈΠ½ ΠΏΠΎ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ timestamp Π² ΠΈΠ½ΡΠ΅ΡΠ²Π°Π» ΠΈ Π΅Π΄ΠΈΠ½ ΠΏΠΎ 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';
ΠΠ³ΡΠ΅Π³Π°Ρ (cost=577487.69..577487.70 rows=1 width=8) (actual time=27473.818..25473.819 rows=1 loops=1)
ΠΠ·Ρ
ΠΎΠ΄: count(1)
-> ΠΡΠ½ΡΠ½ΠΎ ΡΠΊΠ°Π½ΠΈΡΠ°Π½Π΅ Π½Π° fdw_schema."table" (cost=100.00..577469.21 rows=7390 width=0) (actual time=31.369..25372.466 rows=1360025 loops=1)
ΠΠ·Ρ
ΠΎΠ΄: "table".id, "table".is_active, "table".meta, "table".created_dt
Π€ΠΈΠ»ΡΡΡ: (("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)))
Π Π΅Π΄ΠΎΠ²Π΅ ΠΎΡΡΡΡΠ°Π½Π΅Π½ΠΈ ΠΎΡ ΡΠΈΠ»ΡΡΡΠ°: 5046843
ΠΡΠ΄Π°Π»Π΅ΡΠ΅Π½ SQL: SELECT created_dt, is_active, meta FROM fdw_schema.table
ΠΡΠ΅ΠΌΠ΅ Π·Π° ΠΏΠ»Π°Π½ΠΈΡΠ°Π½Π΅: 0.665 ms
ΠΡΠ΅ΠΌΠ΅ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅: 27474.118 msΠ’ΡΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ΅ ΠΊΡΠΈΠ΅ ΠΌΠΎΠΌΠ΅Π½ΡΡΡ, Π½Π° ΠΊΠΎΠΉΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΎΠ±ΡΡΠ½Π΅ΠΌ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΏΡΠΈ Π½Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π·Π°ΠΏΡΠΎΡΠΈ. Π€ΠΈΠ»ΡΡΠΈΡΠ΅ Π½Π΅ Π±ΡΡ Π° ΠΏΡΠ΅Π΄Π°Π΄Π΅Π½ΠΈ Π½Π° ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ΠΈΡ ΡΡΡΠ²ΡΡ, ΠΊΠΎΠ΅ΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ PostgreSQL ΠΈΠ·Π²Π»ΠΈΡΠ° Π²ΡΠΈΡΠΊΠΈΡΠ΅ 6 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΡΠ΅Π΄Π°, Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π»ΠΎΠΊΠ°Π»Π½ΠΎ Π΄Π° Π³ΠΈ ΡΠΈΠ»ΡΡΠΈΡΠ° (ΡΠ΅Π΄ΠΈΡΠ° Filter) ΠΈ Π΄Π° ΠΈΠ·Π²ΡΡΡΠΈ Π°Π³ΡΠ΅Π³Π°ΡΠΈΡ. Π£ΡΠΏΠ΅Ρ ΡΡ Π·Π°Π²ΠΈΡΠΈ ΠΎΡ ΡΠΎΠ²Π° Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΠΌ Π·Π°ΠΏΠΈΡ ΡΠ°ΠΊΠ°, ΡΠ΅ ΡΠΈΠ»ΡΡΠΈΡΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠ΅Π΄Π°Π²Π°Ρ Π½Π° ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π°, Π° Π½ΠΈΠ΅ Π΄Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ ΠΈ Π°Π³ΡΠ΅Π³ΠΈΡΠΈΡΠ°ΠΌΠ΅ ΡΠ°ΠΌΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΡΠ΅Π΄ΠΎΠ²Π΅.
Π’ΠΎΠ²Π° Π΅ Π½ΡΠΊΠ°ΠΊΠ²Π° Π³Π»ΡΠΏΠΎΡΡ
Π‘ boolean ΠΏΠΎΠ»Π΅ΡΠ° β Π²ΡΠΈΡΠΊΠΎ Π΅ ΠΏΡΠΎΡΡΠΎ. ΠΡΠΎΠ±Π»Π΅ΠΌΡΡ Π² ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΈΡ Π·Π°ΠΏΠΈΡ Π²ΡΠ·Π½ΠΈΠΊΠ½Π° ΠΏΠΎΡΠ°Π΄ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° ΠΈ. ΠΠΊΠΎ Π³ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΠΌ Ρ =, ΡΠΎΠ³Π°Π²Π° ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠ»Π΅Π΄Π½ΠΈΡ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ:
ΠΎΠ±ΡΡΡΠ½ΠΈΡΠ΅ Π°Π½Π°Π»ΠΈΠ· Π² ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΡΡ
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';
ΠΠ³ΡΠ΅Π³Π°Ρ (ΡΡΠΎΠΈΠΌΠΎΡΡΡ=508010.14..508010.15 ΡΡΡΠΎΠΊΠΈ=1 ΡΠΈΡΠΈΠ½Π°=8) (ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π²ΡΠ΅ΠΌΡ=19064.314..19064.314 ΡΡΡΠΎΠΊΠΈ=1 ΡΠΈΠΊΠ»Ρ=1)
ΠΡΠ²ΠΎΠ΄: count(1)
-> ΠΠ½ΠΎΡΡΡΠ°Π½Π½ΠΎΠ΅ ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° fdw_schema."table" (ΡΡΠΎΠΈΠΌΠΎΡΡΡ=100.00..507988.44 ΡΡΡΠΎΠΊΠΈ=8679 ΡΠΈΡΠΈΠ½Π°=0) (ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π²ΡΠ΅ΠΌΡ=33.035..18951.278 ΡΡΡΠΎΠΊΠΈ=1360025 ΡΠΈΠΊΠ»Ρ=1)
ΠΡΠ²ΠΎΠ΄: "table".id, "table".is_active, "table".meta, "table".created_dt
Π€ΠΈΠ»ΡΡΡ: ((("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)))
Π£Π΄Π°Π»Π΅Π½Π½ΡΠ΅ ΡΡΡΠΎΠΊΠΈ ΡΠΈΠ»ΡΡΡΠΎΠΌ: 3567989
Π£Π΄Π°Π»Π΅Π½Π½ΡΠΉ SQL: SELECT created_dt, meta FROM fdw_schema.table WHERE (is_active)
ΠΡΠ΅ΠΌΡ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ: 0.834 ΠΌΡ
ΠΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ: 19064.534 ΠΌΡΠΠ°ΠΊ Π²ΠΈΠ΄ΠΈΡΠ΅, ΡΠΈΠ»ΡΡΡ Π±ΡΠ» ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½ Π½Π° ΡΠ΄Π°Π»ΡΠ½Π½ΡΠΉ ΡΠ΅ΡΠ²Π΅Ρ, Π° Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠΎΠΊΡΠ°ΡΠΈΠ»ΠΎΡΡ Ρ 27 Π΄ΠΎ 19 ΡΠ΅ΠΊΡΠ½Π΄.
Π‘ΡΠΎΠΈΡ ΠΎΡΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΈ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° = ΡΠ΅ΠΌ, ΡΡΠΎ ΡΠΌΠ΅Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ Null. ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ is not True Π² ΡΠΈΠ»ΡΡΡΠ΅ ΠΎΡΡΠ°Π²ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ False ΠΈ Null, ΡΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ != True ΠΎΡΡΠ°Π²ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ False. ΠΠΎΡΡΠΎΠΌΡ ΠΏΡΠΈ Π·Π°ΠΌΠ΅Π½Π΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° is not ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π² ΡΠΈΠ»ΡΡΡ Π΄Π²Π° ΡΡΠ»ΠΎΠ²ΠΈΡ Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠΌ OR, ΠΊ ΠΏΡΠΈΠΌΠ΅ΡΡ, WHERE (col != True) OR (col is null).
Π‘ boolean ΡΠ°Π·ΠΎΠ±ΡΠ°Π»ΠΈΡΡ, Π΄Π²ΠΈΠ³Π°Π΅ΠΌΡΡ Π΄Π°Π»ΡΡΠ΅. Π ΠΏΠΎΠΊΠ° Π²Π΅ΡΠ½Π΅ΠΌ ΡΠΈΠ»ΡΡΡ ΠΏΠΎ Π±ΡΠ»Π΅Π²ΠΎΠΌΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΡΠΉ Π²ΠΈΠ΄, ΡΡΠΎΠ±Ρ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅ΡΡ ΡΡΡΠ΅ΠΊΡ ΠΎΡ Π΄ΡΡΠ³ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.
timestamptz? hz
ΠΠΎΠΎΠ±ΡΠ΅, ΡΠ°ΡΡΠΎ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°ΡΡ Ρ ΡΠ΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°ΡΡ Π·Π°ΠΏΡΠΎΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΡΠ°ΡΡΠ²ΡΡΡ ΡΠ΄Π°Π»Π΅Π½Π½ΡΠ΅ ΡΠ΅ΡΠ²Π΅ΡΡ, Π° ΡΠΆΠ΅ ΠΏΠΎΡΠΎΠΌ ΠΈΡΠΊΠ°ΡΡ ΠΎΠ±ΡΡΡΠ½Π΅Π½ΠΈΠ΅, ΠΏΠΎΡΠ΅ΠΌΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΠΊ. ΠΡΠ΅Π½Ρ ΠΌΠ°Π»ΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΏΠΎ ΡΡΠΎΠΌΡ ΠΏΠΎΠ²ΠΎΠ΄Ρ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π² ΠΠ½ΡΠ΅ΡΠ½Π΅ΡΠ΅. Π’Π°ΠΊ, Π² ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Ρ ΠΌΡ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ»ΠΈ, ΡΡΠΎ ΡΠΈΠ»ΡΡΡ ΠΏΠΎ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ Π΄Π°ΡΠ΅ ΡΠ»Π΅ΡΠ°Π΅Ρ Π½Π° ΡΠ΄Π°Π»Π΅Π½Π½ΡΠΉ ΡΠ΅ΡΠ²Π΅Ρ Π½Π° ΡΡΠ°, Π° Π²ΠΎΡ ΠΊΠΎΠ³Π΄Π° ΠΌΡ Ρ ΠΎΡΠΈΠΌ Π·Π°Π΄Π°ΡΡ Π΄Π°ΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, now() ΠΈΠ»ΠΈ CURRENT_DATE, ΡΠ°ΠΊΠΎΠ³ΠΎ Π½Π΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ. Π Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅, ΠΌΡ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΡΠ°ΠΊΠΎΠΉ ΡΠΈΠ»ΡΡΡ, ΡΡΠΎΠ±Ρ ΡΡΠΎΠ»Π±Π΅Ρ created_at ΡΠΎΠ΄Π΅ΡΠΆΠ°Π» Π² ΡΠ΅Π±Π΅ Π΄Π°Π½Π½ΡΠ΅ ΡΠΎΠ²Π½ΠΎ Π·Π° 1 ΠΌΠ΅ΡΡΡ Π² ΠΏΡΠΎΡΠ»ΠΎΠΌ (BETWEEN CURRENT_DATE - INTERVAL β7 monthβ AND CURRENT_DATE - INTERVAL β6 monthβ). Π§ΡΠΎ ΠΆΠ΅ ΠΌΡ ΠΏΡΠ΅Π΄ΠΏΡΠΈΠ½ΡΠ»ΠΈ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅?
ΠΎΠ±ΡΡΡΠ½ΠΈΡΡ Π°Π½Π°Π»ΠΈΠ· ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΡΠΉ
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 >'source' = 'test';
ΠΠ³ΡΠ΅Π³Π°Ρ (cost=306875.17..306875.18 rows=1 width=8) (ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π²ΡΠ΅ΠΌΡ=4789.114..4789.115 rows=1 loops=1)
ΠΡΠ²ΠΎΠ΄: count(1)
InitPlan 1 (Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ $0)
-> Π Π΅Π·ΡΠ»ΡΡΠ°Ρ (cost=0.00..0.02 rows=1 width=8) (ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π²ΡΠ΅ΠΌΡ=0.007..0.008 rows=1 loops=1)
ΠΡΠ²ΠΎΠ΄: ((('now'::cstring)::date)::timestamp with time zone - '7 mons'::interval)
InitPlan 2 (Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ $1)
-> Π Π΅Π·ΡΠ»ΡΡΠ°Ρ (cost=0.00..0.02 rows=1 width=8) (ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π²ΡΠ΅ΠΌΡ=0.002..0.002 rows=1 loops=1)
ΠΡΠ²ΠΎΠ΄: ((('now'::cstring)::date)::timestamp with time zone - '6 mons'::interval)
-> ΠΠ½ΠΎΡΡΡΠ°Π½Π½ΠΎΠ΅ ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° fdw_schema."table" (cost=100.02..306874.86 rows=105 width=0) (ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π²ΡΠ΅ΠΌΡ=23.475..4681.419 rows=1360025 loops=1)
ΠΡΠ²ΠΎΠ΄: "table".id, "table".is_active, "table".meta, "table".created_dt
Π€ΠΈΠ»ΡΡΡ: (("table".is_active IS TRUE) Π (("table".meta ->> 'source'::text) = 'test'::text))
Π£Π΄Π°Π»Π΅Π½Π½ΡΠ΅ ΡΡΡΠΎΠΊΠΈ ΡΠΈΠ»ΡΡΡΠΎΠΌ: 76934
Π£Π΄Π°Π»Π΅Π½Π½ΡΠΉ SQL: SELECT is_active, meta FROM fdw_schema.table WHERE ((created_dt >= $1::timestamp with time zone)) Π ((created_dt < $2::timestamp with time zone))
ΠΡΠ΅ΠΌΡ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ: 0.703 ms
ΠΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ: 4789.379 msΠΠ°ΠΌ ΡΠ΄Π°Π»ΠΎΡΡ ΠΏΠΎΠ΄ΡΠΊΠ°Π·Π°ΡΡ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊΡ Π·Π°ΡΠ°Π½Π΅Π΅ Π²ΡΡΠΈΡΠ»ΠΈΡΡ Π΄Π°ΡΡ Π² ΠΏΠΎΠ΄Π·Π°ΠΏΡΠΎΡΠ΅ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΠΆΠ΅ Π³ΠΎΡΠΎΠ²ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π² ΡΠΈΠ»ΡΡΡ. ΠΡΠ° ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠ° Π΄Π°Π»Π° Π½Π°ΠΌ ΠΎΡΠ»ΠΈΡΠ½ΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ, Π·Π°ΠΏΡΠΎΡ ΡΡΠ°Π» Π±ΡΡΡΡΠ΅Π΅ ΠΏΠΎΡΡΠΈ Π² 6 ΡΠ°Π·!
ΠΠ°ΠΆΠ½ΠΎ Π±ΡΡΡ Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»ΡΠ½ΡΠΌ: ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ Π² ΠΏΠΎΠ΄Π·Π°ΠΏΡΠΎΡΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°ΡΡ ΠΏΠΎΠ»Ρ, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΠΌΡ ΡΠΈΠ»ΡΡΡΡΠ΅ΠΌ, ΠΈΠ½Π°ΡΠ΅ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊ ΡΠ΅ΡΠΈΡ, ΡΡΠΎ ΡΠΈΠΏΡ ΡΠ°Π·Π½ΡΠ΅, ΠΈ Π±ΡΠ΄Π΅Ρ ΡΠ½Π°ΡΠ°Π»Π° ΠΏΠΎΠ»ΡΡΠ°ΡΡ Π²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, Π° Π·Π°ΡΠ΅ΠΌ ΡΠΈΠ»ΡΡΡΠΎΠ²Π°ΡΡ ΠΈΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ.
ΠΠ΅ΡΠ½Π΅ΠΌ ΡΠΈΠ»ΡΡΡ ΠΏΠΎ Π΄Π°ΡΠ΅ ΠΊ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΌΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ.
Freddy ΠΏΡΠΎΡΠΈΠ² Jsonb
Π ΠΎΠ±ΡΠ΅ΠΌ, Π±ΡΠ»Π΅Π²Ρ ΠΏΠΎΠ»Ρ ΠΈ Π΄Π°ΡΡ ΡΠΆΠ΅ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΡΠΊΠΎΡΠΈΠ»ΠΈ Π½Π°Ρ Π·Π°ΠΏΡΠΎΡ, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΡΡΠ°Π²Π°Π»ΡΡ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ . ΠΠΈΡΠ²Π° Ρ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΠ΅ΠΉ ΠΏΠΎ Π½Π΅ΠΌΡ, ΡΠ΅ΡΡΠ½ΠΎ Π³ΠΎΠ²ΠΎΡΡ, Π΄ΠΎ ΡΠΈΡ ΠΏΠΎΡ Π½Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½Π°, Ρ ΠΎΡΡ ΠΌΡ Π·Π΄Π΅ΡΡ Π΄ΠΎΠ±ΠΈΠ»ΠΈΡΡ ΡΡΠΏΠ΅Ρ Π°. ΠΡΠ°ΠΊ, Π²ΠΎΡ ΠΊΠ°ΠΊ ΡΠ΄Π°Π»ΠΎΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΠΈΠ»ΡΡΡ ΠΏΠΎ jsonb ΠΏΠΎΠ»Ρ Π½Π° ΡΠ΄Π°Π»Π΅Π½Π½ΡΠΉ ΡΠ΅ΡΠ²Π΅Ρ.
ΠΎΠ±ΡΡΡΠ½ΠΈΡΡ Π°Π½Π°Π»ΠΈΠ· ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΡΠΉ
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;
ΠΠ³ΡΠ΅Π³Π°Ρ (cost=245463.60..245463.61 rows=1 width=8) (ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π²ΡΠ΅ΠΌΡ=6727.589..6727.590 rows=1 loops=1)
ΠΡΠ²ΠΎΠ΄: count(1)
-> ΠΠ½ΠΎΡΡΡΠ°Π½Π½ΠΎΠ΅ ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° fdw_schema."table" (cost=1100.00..245459.90 rows=1478 width=0) (ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π²ΡΠ΅ΠΌΡ=16.213..6634.794 rows=1360025 loops=1)
ΠΡΠ²ΠΎΠ΄: "table".id, "table".is_active, "table".meta, "table".created_dt
Π€ΠΈΠ»ΡΡΡ: (("table".is_active IS TRUE) Π ("table".created_dt >= (('now'::cstring)::date - '7 mons'::interval)) Π ("table".created_dt '{"source": "test"}'::jsonb))
ΠΡΠ΅ΠΌΡ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ: 0.747 ms
ΠΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ: 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 '{"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 '{"source": "test"}'::jsonb))
Planning time: 0.820 ms
Execution time: 2279.087 msΠΠ°, Π·Π°ΡΠ²ΠΊΠ°ΡΠ° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΠΎ-ΡΠ»ΠΎΠΆΠ½Π°, ΡΠΎΠ²Π° Π΅ Π½Π°Π»ΠΎΠΆΠ΅Π½Π° ΡΠ΅Π½Π°, Π½ΠΎ ΡΠΊΠΎΡΠΎΡΡΡΠ° Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π΅ 2 ΡΠ΅ΠΊΡΠ½Π΄ΠΈ, ΠΊΠΎΠ΅ΡΠΎ Π΅ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ Π΄Π΅ΡΠ΅Ρ ΠΏΡΡΠΈ ΠΏΠΎ-Π±ΡΡΠ·ΠΎ! Π Π³ΠΎΠ²ΠΎΡΠΈΠΌ Π·Π° ΠΏΡΠΎΡΡΠ° Π·Π°ΡΠ²ΠΊΠ° ΠΊΡΠΌ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»Π½ΠΎ ΠΌΠ°Π»ΡΠΊ Π½Π°Π±ΠΎΡ ΠΎΡ Π΄Π°Π½Π½ΠΈ. ΠΡΠΈ ΡΠ΅Π°Π»Π½ΠΈ Π·Π°ΡΠ²ΠΊΠΈ ΠΏΠΎΠ»ΡΡΠ°Π²Π°Ρ ΠΌΠ΅ ΠΏΠ΅ΡΠ°Π»Π±Π° ΠΎΡ ΡΡΠΎΡΠΈΡΠΈ ΠΏΡΡΠΈ.
ΠΠ° ΠΎΠ±ΠΎΠ±ΡΠΈΠΌ: Π°ΠΊΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ PostgreSQL Ρ FDW, Π²ΠΈΠ½Π°Π³ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°ΠΉΡΠ΅ Π΄Π°Π»ΠΈ Π²ΡΠΈΡΠΊΠΈΡΠ΅ ΡΠΈΠ»ΡΡΠΈ ΠΎΡΠΈΠ²Π°Ρ Π½Π° ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ΠΈΡ ΡΡΡΠ²ΡΡ, ΠΈ ΡΠ΅ Π±ΡΠ΄Π΅ΡΠ΅ ΡΠ°ΡΡΠ»ΠΈΠ²ΠΈβ¦ ΠΠ°ΠΉ-ΠΌΠ°Π»ΠΊΠΎΡΠΎ, Π΄ΠΎΠΊΠ°ΡΠΎ Π½Π΅ ΡΡΠΈΠ³Π½Π΅ΡΠ΅ Π΄ΠΎ Π΄ΠΆΠΎΠΉΠ½Π΅ΡΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°Π±Π»ΠΈΡΠΈ ΠΎΡ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΡΡΠ²ΡΡΠΈ. ΠΠΎ ΡΠΎΠ²Π° Π΅ ΠΈΡΡΠΎΡΠΈΡ Π·Π° Π΄ΡΡΠ³Π° ΡΡΠ°ΡΠΈΡ.
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ΡΠΎ! Π©Π΅ ΡΠ΅ ΡΠ°Π΄Π²Π°ΠΌ Π΄Π° ΡΡΡ Π²ΡΠΏΡΠΎΡΠΈ, ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈ, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΠΈΡΡΠΎΡΠΈΠΈ Π·Π° Π²Π°ΡΠΈΡ ΠΎΠΏΠΈΡ Π² ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ΅.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
