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

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

ΠΠΌΠ° Π±Π°Π·Π° PostgreSQL, Π² ΠΊΠΎΡΡΠΎ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΡΡ
ΡΠ°Π½ΡΠ²Π°Ρ ΡΠ²ΠΎΠΈΡΠ΅ ΡΠ°Π±ΠΎΡΠ½ΠΈ Π΄Π°Π½Π½ΠΈ, Π° Π½Π°ΠΉ-Π²Π°ΠΆΠ½ΠΎΡΠΎ β ΡΠ°Π·ΠΈ Π±Π°Π·Π° Π΅ ΡΠ²ΡΡΠ·Π°Π½Π° ΡΡΠ΅Π· FDW Ρ Π°Π½Π°Π»ΠΈΡΠΈΡΠ½ΠΈ ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΡΡΠ»ΡΠ³ΠΈ. Π’ΠΎΠ²Π° Π΄Π°Π²Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΠΌ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ ΠΊΡΠΌ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π±Π°Π·ΠΈ, Π±Π΅Π· Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊΠ²ΠΈ ΡΠ°: PostgreSQL, MySQL, MongoDB ΠΈΠ»ΠΈ Π½Π΅ΡΠΎ Π΄ΡΡΠ³ΠΎ (ΡΠ°ΠΉΠ», API; Π°ΠΊΠΎ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ Π½ΡΠΌΠ° ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΡΡΠ° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΡΠ²ΠΎΡ). ΠΠΌΠΈ, ΡΠΎΠ²Π° Π΅ Π²ΡΠΈΡΠΊΠΎ, ΡΡΠΏΠ΅Ρ! Π Π°Π·ΠΎΡΠΈΠ²Π°ΠΌΠ΅ Π»ΠΈ ΡΠ΅?
ΠΠΊΠΎ Π²ΡΠΈΡΠΊΠΎ ΠΏΡΠΈΠΊΠ»ΡΡΠ²Π°ΡΠ΅ ΡΠΎΠ»ΠΊΠΎΠ²Π° Π±ΡΡΠ·ΠΎ ΠΈ Π»Π΅ΡΠ½ΠΎ, Π²Π΅ΡΠΎΡΡΠ½ΠΎ Π½ΡΠΌΠ°ΡΠ΅ Π΄Π° ΠΈΠΌΠ° ΡΡΠ°ΡΠΈΡ.
ΠΠ°ΠΆΠ½ΠΎ Π΅ ΡΡΠ½ΠΎ Π΄Π° ΠΎΡΡΠ·Π½Π°Π²Π°ΠΌΠ΅ ΠΊΠ°ΠΊ PostgreSQL ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π° Π·Π°ΡΠ²ΠΊΠΈΡΠ΅ ΠΊΡΠΌ ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ΠΈ ΡΡΡΠ²ΡΡΠΈ. Π’ΠΎΠ²Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Π»ΠΎΠ³ΠΈΡΠ½ΠΎ, ΠΎΠ±Π°ΡΠ΅ ΡΠ΅ΡΡΠΎ Π½Π΅ ΡΠ΅ ΠΎΠ±ΡΡΡΠ° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΎΠ²Π°: PostgreSQL ΡΠ°Π·Π΄Π΅Π»Ρ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ°ΡΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ Π½Π° ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ΠΈΡΠ΅ ΡΡΡΠ²ΡΡΠΈ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ, ΡΡΠ±ΠΈΡΠ° ΡΠ΅Π·ΠΈ Π΄Π°Π½Π½ΠΈ, Π° ΡΠΈΠ½Π°Π»Π½ΠΈΡΠ΅ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΈΠ·Π²ΡΡΡΠ²Π° ΡΠ°ΠΌ, Π·Π°ΡΠΎΠ²Π° ΡΠΊΠΎΡΠΎΡΡΡΠ° Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ ΡΠ΅ Π·Π°Π²ΠΈΡΠΈ ΡΠΈΠ»Π½ΠΎ ΠΎΡ Π½Π°ΡΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΠΉΡΠΎ Π΅ Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ. Π’ΡΡΠ±Π²Π° ΡΡΡΠΎ Π΄Π° ΠΎΡΠ±Π΅Π»Π΅ΠΆΠΈΠΌ: ΠΊΠΎΠ³Π°ΡΠΎ Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΈΠ΄Π²Π°Ρ ΠΎΡ ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ ΡΡΡΠ²ΡΡ, ΡΠ΅ Π²Π΅ΡΠ΅ Π½ΡΠΌΠ°Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ, Π½ΡΠΌΠ° Π½ΠΈΡΠΎ, ΠΊΠΎΠ΅ΡΠΎ Π΄Π° ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π½Π° ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊΠ°, ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΠΎΠΌΠΎΠ³Π½Π΅ΠΌ ΠΈ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΡΡΡΠ²Π°ΠΌΠ΅ ΡΠ°ΠΌΠΎ Π½ΠΈΠ΅ ΡΠ°ΠΌΠΈΡΠ΅. Π ΠΈΠΌΠ΅Π½Π½ΠΎ Π·Π° ΡΠΎΠ²Π° ΠΈΡΠΊΠ°ΠΌ Π΄Π° ΡΠ°Π·ΠΊΠ°ΠΆΠ° ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ.
ΠΡΠΎΡΡ Π·Π°ΡΠ²ΠΊΠ° ΠΈ ΠΏΠ»Π°Π½ Ρ Π½Π΅Π³ΠΎ
ΠΠ° Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ ΠΊΠ°ΠΊ 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).
ΠΠ΅ΠΊΠ° ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈΠΌ ΠΌΠ°Π»ΠΊΠΎ Π½Π°ΠΏΡΠ΅Π΄ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊΡΠΌ Π½Π°ΡΠ°ΡΠ° Π·Π°ΡΠ²ΠΊΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠΈΠ»ΡΡΡΠ°: Π΅Π΄ΠΈΠ½ ΠΏΠΎ boolean ΠΏΠΎΠ»Π΅, Π΅Π΄ΠΈΠ½ ΠΏΠΎ Π²Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ΡΠΎ 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';
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) ΠΈ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈ Π°Π³ΡΠ΅Π³Π°ΡΠΈΡ. ΠΠ»ΡΡΡΡ ΠΊΡΠΌ ΡΡΠΏΠ΅Ρ Π° Π΅ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΠΌ Π·Π°ΡΠ²ΠΊΠ°ΡΠ° ΡΠ°ΠΊΠ°, ΡΠ΅ ΡΠΈΠ»ΡΡΠΈΡΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠ΅Π΄Π°Π²Π°Ρ Π½Π° ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ΠΎΡΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ, Π° Π½ΠΈΠ΅ Π΄Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ ΠΈ Π°Π³ΡΠ΅Π³Π°ΡΠΈΡΠ°ΠΌΠ΅ ΡΠ°ΠΌΠΎ Π½ΡΠΆΠ½ΠΈΡΠ΅ ΡΠ΅Π΄ΠΎΠ²Π΅.
Thatβs some booleanshit
Π‘ boolean ΠΏΠΎΠ»Π΅ΡΠ°ΡΠ° β Π²ΡΠΈΡΠΊΠΎ Π΅ ΠΏΡΠΎΡΡΠΎ. Π ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½Π°ΡΠ° Π·Π°ΡΠ²ΠΊΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΡΡ Π²ΡΠ·Π½ΠΈΠΊΠ½Π° Π·Π°ΡΠ°Π΄ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° is. ΠΠΊΠΎ Π³ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΠΌ Ρ =, ΡΠΎ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠ»Π΅Π΄Π½ΠΈΡ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ:
ΠΎΠ±ΡΡΠ½ΠΈ Π°Π½Π°Π»ΠΈΠ· ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ
ΠΠΠΠΠ Π count(1)
ΠΠ fdw_schema.table
ΠΠΠ is_active = True
Π created_dt ΠΠΠΠΠ£ Π’ΠΠΠ£Π©ΠΠ―_ΠΠΠ’Π - ΠΠΠ’ΠΠ ΠΠΠ '7 ΠΌΠ΅Ρ'
Π Π’ΠΠΠ£Π©ΠΠ―_ΠΠΠ’Π - ΠΠΠ’ΠΠ ΠΠΠ '6 ΠΌΠ΅Ρ'
Π 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) Π ("table".created_dt >= (('now'::cstring)::date - '7 ΠΌΠ΅Ρ'::ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»)) Π ("table".created_dt <= ((('now'::cstring)::date)::timestamp Ρ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π·ΠΎΠ½ΠΎΠΉ - '6 ΠΌΠ΅Ρ'::ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»)))
Π£Π΄Π°Π»Π΅Π½Π½ΡΠ΅ ΡΡΡΠΎΠΊΠΈ: 3567989
Π£Π΄Π°Π»Π΅Π½Π½ΡΠΉ SQL: ΠΠΠΠΠ Π created_dt, meta ΠΠ fdw_schema.table ΠΠΠ (is_active)
ΠΡΠ΅ΠΌΡ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ: 0.834 ΠΌΡ
ΠΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ: 19064.534 ΠΌΡΠΠ°ΠΊ Π²ΠΈΠ΄ΠΈΡΠ΅, ΡΠΈΠ»ΡΡΡ ΡΡΠ΅Π» Π½Π° ΡΠ΄Π°Π»Π΅Π½Π½ΡΠΉ ΡΠ΅ΡΠ²Π΅Ρ, Π° Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠΎΠΊΡΠ°ΡΠΈΠ»ΠΎΡΡ Ρ 27 Π΄ΠΎ 19 ΡΠ΅ΠΊΡΠ½Π΄.
Π‘ΡΠΎΠΈΡ ΠΎΡΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ is ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° = ΡΠ΅ΠΌ, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ Null. ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ is not True Π² ΡΠΈΠ»ΡΡΡΠ΅ ΠΎΡΡΠ°Π²ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ False ΠΈ Null, ΡΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ != True ΠΎΡΡΠ°Π²ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ False. ΠΠΎΡΡΠΎΠΌΡ ΠΏΡΠΈ Π·Π°ΠΌΠ΅Π½Π΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° is not ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π² ΡΠΈΠ»ΡΡΡ Π΄Π²Π° ΡΡΠ»ΠΎΠ²ΠΈΡ Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠΌ OR, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΠΠ (col != True) ΠΠΠ (col is null).
Π‘ boolean ΡΠ°Π·ΠΎΠ±ΡΠ°Π»ΠΈΡΡ, Π΄Π²ΠΈΠ³Π°Π΅ΠΌΡΡ Π΄Π°Π»ΡΡΠ΅. Π ΠΏΠΎΠΊΠ° Π²Π΅ΡΠ½Π΅ΠΌ ΡΠΈΠ»ΡΡΡ ΠΏΠΎ Π±ΡΠ»Π΅Π²ΠΎΠΌΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΡΠΉ Π²ΠΈΠ΄, ΡΡΠΎΠ±Ρ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅ΡΡ ΡΡΡΠ΅ΠΊΡ ΠΎΡ Π΄ΡΡΠ³ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.
timestamptz? hz
ΠΠΎΠΎΠ±ΡΠ΅, ΡΠ°ΡΡΠΎ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°ΡΡ Ρ ΡΠ΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°ΡΡ Π·Π°ΠΏΡΠΎΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΡΠ°ΡΡΠ²ΡΡΡ ΡΠ΄Π°Π»Π΅Π½Π½ΡΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠ°, Π° ΠΏΠΎΡΠΎΠΌ ΠΈΡΠΊΠ°ΡΡ ΠΎΠ±ΡΡΡΠ½Π΅Π½ΠΈΠ΅, ΠΏΠΎΡΠ΅ΠΌΡ ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΠΊ. ΠΡΠ΅Π½Ρ ΠΌΠ°Π»ΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΏΠΎ ΡΡΠΎΠΌΡ ΠΏΠΎΠ²ΠΎΠ΄Ρ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π² ΠΠ½ΡΠ΅ΡΠ½Π΅ΡΠ΅. Π Ρ ΠΎΠ΄Π΅ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ² ΠΌΡ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ»ΠΈ, ΡΡΠΎ ΡΠΈΠ»ΡΡΡ ΠΏΠΎ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ Π΄Π°ΡΠ΅ ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡ Π½Π° ΡΠ΄Π°Π»Π΅Π½Π½ΡΠΉ ΡΠ΅ΡΠ²Π΅Ρ Π±Π΅Π· ΠΏΡΠΎΠ±Π»Π΅ΠΌ, Π½ΠΎ ΠΊΠΎΠ³Π΄Π° ΠΌΡ ΠΏΡΡΠ°Π΅ΠΌΡΡ Π·Π°Π΄Π°ΡΡ Π΄Π°ΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, now() ΠΈΠ»ΠΈ CURRENT_DATE, ΡΡΠΎΠ³ΠΎ Π½Π΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ. Π Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΌΡ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΡΠ°ΠΊΠΎΠΉ ΡΠΈΠ»ΡΡΡ, ΡΡΠΎΠ±Ρ ΡΡΠΎΠ»Π±Π΅Ρ created_at ΡΠΎΠ΄Π΅ΡΠΆΠ°Π» Π΄Π°Π½Π½ΡΠ΅ ΡΠΎΠ²Π½ΠΎ Π·Π° 1 ΠΌΠ΅ΡΡΡ Π½Π°Π·Π°Π΄ (ΠΠΠΠΠ£ Π’ΠΠΠ£Π©ΠΠ―_ΠΠΠ’Π β ΠΠΠ’ΠΠ ΠΠΠ '7 ΠΌΠ΅Ρ' Π Π’ΠΠΠ£Π©ΠΠ―_ΠΠΠ’Π β ΠΠΠ’ΠΠ ΠΠΠ '6 ΠΌΠ΅Ρ'). Π§ΡΠΎ ΠΆΠ΅ ΠΌΡ ΠΏΡΠ΅Π΄ΠΏΡΠΈΠ½ΡΠ»ΠΈ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅?
ΠΎΠ±ΡΡΡΠ½ΠΈΡΡ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ
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';
ΠΠ³ΡΠ΅Π³Π°Ρ (ΡΡΠΎΠΈΠΌΠΎΡΡΡ=306875.17..306875.18 ΡΡΡΠΎΠΊΠΈ=1 ΡΠΈΡΠΈΠ½Π°=8) (ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π²ΡΠ΅ΠΌΡ=4789.114..4789.115 ΡΡΡΠΎΠΊΠΈ=1 ΡΠΈΠΊΠ»Ρ=1)
ΠΡΠ²ΠΎΠ΄: count(1)
InitPlan 1 (Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ $0)
-> Π Π΅Π·ΡΠ»ΡΡΠ°Ρ (ΡΡΠΎΠΈΠΌΠΎΡΡΡ=0.00..0.02 ΡΡΡΠΎΠΊΠΈ=1 ΡΠΈΡΠΈΠ½Π°=8) (ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π²ΡΠ΅ΠΌΡ=0.007..0.008 ΡΡΡΠΎΠΊΠΈ=1 ΡΠΈΠΊΠ»Ρ=1)
ΠΡΠ²ΠΎΠ΄: ((('ΡΠ΅ΠΉΡΠ°Ρ'::cstring)::date)::timestamp with time zone - '7 ΠΌΠ΅Ρ'::interval)
InitPlan 2 (Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ $1)
-> Π Π΅Π·ΡΠ»ΡΡΠ°Ρ (ΡΡΠΎΠΈΠΌΠΎΡΡΡ=0.00..0.02 ΡΡΡΠΎΠΊΠΈ=1 ΡΠΈΡΠΈΠ½Π°=8) (ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π²ΡΠ΅ΠΌΡ=0.002..0.002 ΡΡΡΠΎΠΊΠΈ=1 ΡΠΈΠΊΠ»Ρ=1)
ΠΡΠ²ΠΎΠ΄: ((('ΡΠ΅ΠΉΡΠ°Ρ'::cstring)::date)::timestamp with time zone - '6 ΠΌΠ΅Ρ'::interval)
-> ΠΠ½ΠΎΡΡΡΠ°Π½Π½ΡΠΉ ΡΠΊΠ°Π½ Π½Π° fdw_schema."table" (ΡΡΠΎΠΈΠΌΠΎΡΡΡ=100.02..306874.86 ΡΡΡΠΎΠΊΠΈ=105 ΡΠΈΡΠΈΠ½Π°=0) (ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π²ΡΠ΅ΠΌΡ=23.475..4681.419 ΡΡΡΠΎΠΊΠΈ=1360025 ΡΠΈΠΊΠ»Ρ=1)
ΠΡΠ²ΠΎΠ΄: "table".id, "table".is_active, "table".meta, "table".created_dt
Π€ΠΈΠ»ΡΡΡ: (("table".is_active IS TRUE) AND (("table".meta ->> 'source'::text) = 'test'::text))
Π‘ΡΡΠΎΠΊΠΈ, ΡΠ΄Π°Π»Π΅Π½Π½ΡΠ΅ ΡΠΈΠ»ΡΡΡΠΎΠΌ: 76934
Π£Π΄Π°Π»Π΅Π½Π½ΡΠΉ 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))
ΠΡΠ΅ΠΌΡ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ: 0.703 ΠΌΡ
ΠΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ: 4789.379 ΠΌΡΠΠΈΠ΅ ΠΏΠΎΠ΄ΡΠΊΠ°Π·Π°Ρ ΠΌΠ΅ Π½Π° ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊΠ° ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ Π΄Π° ΠΈΠ·ΡΠΈΡΠ»ΠΈ Π΄Π°ΡΠ°ΡΠ° Π² ΠΏΠΎΠ΄Π·Π°ΠΏΡΠΎΡΠ° ΠΈ Π΄Π° ΠΏΡΠ΅Π΄Π°Π΄Π΅ Π³ΠΎΡΠΎΠ²Π°ΡΠ° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° Π² ΡΠΈΠ»ΡΡΡΡΠ°. Π ΡΠ°Π·ΠΈ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠ° Π½ΠΈ Π΄Π°Π΄Π΅ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ΅Π½ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ, Π·Π°ΡΠ²ΠΊΠ°ΡΠ° ΡΡΠ°Π½Π° ΠΏΠΎΡΡΠΈ 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;
ΠΠ³ΡΠ΅Π³Π°Ρ (ΡΡΠΎΠΈΠΌΠΎΡΡΡ=245463.60..245463.61 ΡΡΡΠΎΠΊΠΈ=1 ΡΠΈΡΠΈΠ½Π°=8) (ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π²ΡΠ΅ΠΌΡ=6727.589..6727.590 ΡΡΡΠΎΠΊΠΈ=1 ΡΠΈΠΊΠ»Ρ=1)
ΠΡΠ²ΠΎΠ΄: count(1)
-> ΠΠ½ΠΎΡΡΡΠ°Π½Π΅Π½ ΡΠΊΠ°Π½ Π½Π° fdw_schema."table" (ΡΡΠΎΠΈΠΌΠΎΡΡΡ=1100.00..245459.90 ΡΡΡΠΎΠΊΠΈ=1478 ΡΠΈΡΠΈΠ½Π°=0) (ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π²ΡΠ΅ΠΌΠ΅=16.213..6634.794 ΡΡΡΠΎΠΊΠΈ=1360025 ΡΠΈΠΊΠ»ΠΈ=1)
ΠΡΠ²ΠΎΠ΄: "table".id, "table".is_active, "table".meta, "table".created_dt
Π€ΠΈΠ»ΡΡΡ: (("table".is_active IS TRUE) AND ("table".created_dt >= (('ΡΠ΅Π³Π°'::cstring)::date - '7 ΠΌΠ΅ΡΠ΅ΡΠ°'::ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»)) AND ("table".created_dt '{"source": "test"}'::jsonb))
ΠΡΠ΅ΠΌΠ΅ Π·Π° ΠΏΠ»Π°Π½ΠΈΡΠ°Π½Π΅: 0.747 ΠΌΡ
ΠΡΠ΅ΠΌΠ΅ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅: 6727.815 ΠΌΡΠΠΌΠ΅ΡΡΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΈΡΠ΅ Π·Π° ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ Π½Π° Π½Π°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° Π΅Π΄ΠΈΠ½ 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 months')
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 months'::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 months'::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 ΡΠ΅ΠΊΡΠ½Π΄ΠΈ, ΠΊΠΎΠ΅ΡΠΎ Π΅ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ 10 ΠΏΡΡΠΈ ΠΏΠΎ-Π±ΡΡΠ·ΠΎ! Π ΡΡΠΊ Π³ΠΎΠ²ΠΎΡΠΈΠΌ Π·Π° ΠΏΡΠΎΡΡΠΎ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ ΠΊΡΠΌ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»Π½ΠΎ ΠΌΠ°Π»ΡΠΊ Π½Π°Π±ΠΎΡ ΠΎΡ Π΄Π°Π½Π½ΠΈ. ΠΡΠΈ ΡΠ΅Π°Π»Π½ΠΈ Π·Π°ΠΏΠΈΡΠ²Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡΡΠ°Π²Π°Ρ ΠΌΠ΅ ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π°Π½Π΅ Π΄ΠΎ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΡΠΎΡΠΈΠ½ ΠΏΡΡΠΈ.
ΠΠ΅ΠΊΠ° ΠΎΠ±ΠΎΠ±ΡΠΈΠΌ: Π°ΠΊΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ PostgreSQL Ρ FDW, Π²ΠΈΠ½Π°Π³ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°ΠΉΡΠ΅ Π΄Π°Π»ΠΈ Π²ΡΠΈΡΠΊΠΈ ΡΠΈΠ»ΡΡΠΈ ΡΠ΅ ΠΈΠ·ΠΏΡΠ°ΡΠ°Ρ Π½Π° ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ΠΈΡ ΡΡΡΠ²ΡΡ, ΠΈ ΡΠ΅ Π±ΡΠ΄Π΅ΡΠ΅ ΡΠ°ΡΡΠ»ΠΈΠ²ΠΈ... ΠΠΎΠ½Π΅ Π΄ΠΎΠΊΠ°ΡΠΎ Π½Π΅ ΡΡΠΈΠ³Π½Π΅ΡΠ΅ Π΄ΠΎ join ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°Π±Π»ΠΈΡΠΈ ΠΎΡ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΡΡΠ²ΡΡΠΈ. ΠΠΎ ΡΠΎΠ²Π° Π²Π΅ΡΠ΅ Π΅ ΠΈΡΡΠΎΡΠΈΡ Π·Π° ΠΎΡΠ΅ Π΅Π΄Π½Π° ΡΡΠ°ΡΠΈΡ.
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ΡΠΎ! Π©Π΅ ΡΠ΅ ΡΠ°Π΄Π²Π°ΠΌ Π΄Π° ΡΡΡ Π²ΡΠΏΡΠΎΡΠΈ, ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈ, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΠΈΡΡΠΎΡΠΈΠΈ Π·Π° Π²Π°ΡΠΈΡ ΠΎΠΏΠΈΡ Π² ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ΅.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
