рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрднрд┐рд╕ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рдорд╛ рдЕрдкрд░реЗрд╢рдирд▓ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕: рдорджреНрджрдд рд░ рдкреНрд░рдореНрдкреНрдЯ Postgres FDW

рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрднрд┐рд╕ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░, рдпрд╕ рд╕рдВрд╕рд╛рд░рдХрд╛ рд╕рдмреИ рдЪреАрдЬрд╣рд░реВ рдЬрд╕реНрддреИ, рдпрд╕рдХреЛ рдлрд╛рдЗрджрд╛ рд░ рдмреЗрдлрд╛рдЗрджрд╛рд╣рд░реВ рдЫрдиреНред рдХреЗрд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВ рдпрд╕рд╕рдБрдЧ рд╕рдЬрд┐рд▓реЛ рд╣реБрдиреНрдЫ, рдЕрд░реВрд╣рд░реВ рдЕрдЭ рдЧрд╛рд╣реНрд░реЛ рд╣реБрдиреНрдЫрдиреНред рд░ рдкрд░рд┐рд╡рд░реНрддрдирдХреЛ рдЧрддрд┐ рд░ рд░рд╛рдореНрд░реЛ рд╕реНрдХреЗрд▓реЗрдмрд┐рд▓рд┐рдЯреАрдХреЛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдИрдВрд▓реЗ рдмрд▓рд┐рджрд╛рдирд╣рд░реВ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рддреА рдордзреНрдпреЗ рдПрдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХреЛ рдмрдвреНрджреЛ рдЬрдЯрд┐рд▓рддрд╛ рд╣реЛред рдпрджрд┐ рдПрдХ рдореЛрдиреЛрд▓рд┐рдердорд╛ рд╕рдмреИ рдЕрдкрд░реЗрд╢рдирд▓ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕рд╣рд░реВрд▓рд╛рдИ SQL рдХреНрд╡реЗрд░реАрд╣рд░реВрдорд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреГрддрд┐рдорд╛ рдШрдЯрд╛рдЙрди рд╕рдХрд┐рдиреНрдЫ, рддреНрдпрд╕рдкрдЫрд┐ рдмрд╣реБ-рд╕реЗрд╡рд╛ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛рдорд╛ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд╡рд╛рдХреЛ рдЖрдлреНрдиреИ рдбрд╛рдЯрд╛рдмреЗрд╕ рд╣реБрдиреНрдЫ рд░ рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ рдХрд┐ рдПрдЙрдЯрд╛ рдХреНрд╡реЗрд░реА рдЧрд░реНрди рд╕рдХрд┐рдБрджреИрди (рд╡рд╛ рд╣реБрди рд╕рдХреНрдЫ?)ред рд╣рд╛рдореАрд▓реЗ рд╣рд╛рдореНрд░реЛ рдХрдореНрдкрдиреАрдорд╛ рдЕрдкрд░реЗрд╢рдирд▓ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕рдХреЛ рд╕рдорд╕реНрдпрд╛ рдХрд╕рд░реА рд╕рдорд╛рдзрд╛рди рдЧрд░реНрдпреМрдВ рд░ рд╣рд╛рдореАрд▓реЗ рдпрд╕ рд╕рдорд╛рдзрд╛рдирд╕рдБрдЧ рдХрд╕рд░реА рдмрд╛рдБрдЪреНрди рд╕рд┐рдХреНрдпреМрдВ рднрдиреНрдиреЗ рдХреБрд░рд╛рдорд╛ рд░реБрдЪрд┐ рд░рд╛рдЦреНрдиреЗрд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ - рд╕реНрд╡рд╛рдЧрдд рдЫред

рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрднрд┐рд╕ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рдорд╛ рдЕрдкрд░реЗрд╢рдирд▓ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕: рдорджреНрджрдд рд░ рдкреНрд░рдореНрдкреНрдЯ Postgres FDW
рдореЗрд░реЛ рдирд╛рдо Pavel Sivash рд╣реЛ, DomClick рдорд╛ рдо рдПрдХ рдЯреЛрд▓реАрдорд╛ рдХрд╛рдо рдЧрд░реНрдЫреБ рдЬреБрди рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рдбрд╛рдЯрд╛ рдЧреЛрджрд╛рдо рдХрд╛рдпрдо рд░рд╛рдЦреНрди рдЬрд┐рдореНрдореЗрд╡рд╛рд░ рдЫред рдкрд░рдореНрдкрд░рд╛рдЧрдд рд░реВрдкрдорд╛, рд╣рд╛рдореНрд░рд╛ рдЧрддрд┐рд╡рд┐рдзрд┐рд╣рд░реВрд▓рд╛рдИ рдбреЗрдЯрд╛ рдЗрдиреНрдЬрд┐рдирд┐рдпрд░рд┐рдЩрдХреЛ рд░реВрдкрдорд╛ рд╡рд░реНрдЧреАрдХреГрдд рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рддрд░, рд╡рд╛рд╕реНрддрд╡рдорд╛, рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рджрд╛рдпрд░рд╛ рдзреЗрд░реИ рдлрд░рд╛рдХрд┐рд▓реЛ рдЫред рддреНрдпрд╣рд╛рдБ рдбрд╛рдЯрд╛ рдЗрдиреНрдЬрд┐рдирд┐рдпрд░рд┐рдЩреНрдХреЛ рд▓рд╛рдЧрд┐ ETL/ELT рдорд╛рдирдХрд╣рд░реВ рдЫрдиреН, рдбрд╛рдЯрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд░ рддрдкрд╛рдИрдВрдХреЛ рдЖрдлреНрдиреИ рдЙрдкрдХрд░рдгрд╣рд░реВрдХреЛ рд╡рд┐рдХрд╛рд╕рдХреЛ рд▓рд╛рдЧрд┐ рдЙрдкрдХрд░рдгрд╣рд░реВрдХреЛ рд╕рдорд░реНрдерди рд░ рдЕрдиреБрдХреВрд▓рдиред рд╡рд┐рд╢реЗрд╖ рдЧрд░реА, рдкрд░рд┐рдЪрд╛рд▓рди рд░рд┐рдкреЛрд░реНрдЯрд┐рдЩрдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореАрд▓реЗ "рдмрддрд╛рдЙрдиреЗ" рдирд┐рд░реНрдгрдп рдЧрд░реНрдпреМрдВ рдХрд┐ рд╣рд╛рдореАрд╕рдБрдЧ рдПрдХ рдореЛрдиреЛрд▓рд┐рде рдЫ рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХрд╣рд░реВрд▓рд╛рдИ рдПрдЙрдЯрд╛ рдбрд╛рдЯрд╛рдмреЗрд╕ рджрд┐рдиреЗрдЫ рдЬрд╕рдорд╛ рдЙрдиреАрд╣рд░реВрд▓рд╛рдИ рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрдиреЗ рд╕рдмреИ рдбрд╛рдЯрд╛ рд╕рдорд╛рд╡реЗрд╢ рд╣реБрдиреЗрдЫред

рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рд╣рд╛рдореАрд▓реЗ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рд╡рд┐рдЪрд╛рд░ рдЧрд░реНрдпреМрдВред рдпреЛ рдПрдХ рдкреВрд░реНрдг рднрдгреНрдбрд╛рд░ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рд╕рдореНрднрд╡ рдерд┐рдпреЛ - рд╣рд╛рдореАрд▓реЗ рдкреНрд░рдпрд╛рд╕ рдкрдирд┐ рдЧрд░реНрдпреМрдВ, рддрд░, рдЗрдорд╛рдирджрд╛рд░реАрдкреВрд░реНрд╡рдХ рднрдиреНрдиреБрдкрд░реНрджрд╛, рд╣рд╛рдореАрд▓реЗ рднрдгреНрдбрд╛рд░ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреЗ рд░ рддреНрдпрд╕рдорд╛ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдЧрд░реНрдиреЗ рдмрд░реБ рдврд┐рд▓реЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╕рдБрдЧ рддрд░реНрдХрдорд╛ рдмрд╛рд░рдореНрдмрд╛рд░ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рд╕рдВрдпреЛрдЬрди рдЧрд░реНрди рд╕рдХреЗрдиреМрдВ (рдпрджрд┐ рдХрд╕реИрд▓реЗ рд╕рдлрд▓ рднрдпреЛ рднрдиреЗред , рдХрд╕рд░реА рдХрдореЗрдиреНрдЯрдорд╛ рд▓реЗрдЦреНрдиреБрд╣реЛрд╕реН)ред рд╡рд┐рд╢реНрд▓реЗрд╖рдХрд╣рд░реВрд▓рд╛рдИ рднрдиреНрди рд╕рдореНрднрд╡ рдерд┐рдпреЛ: "рд╕рд╛рдереАрд╣рд░реВ, рдкрд╛рдЗрдерди рд╕рд┐рдХреНрдиреБрд╣реЛрд╕реН рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреГрддрд┐рд╣рд░реВрдорд╛ рдЬрд╛рдиреБрд╣реЛрд╕реН," рддрд░ рдпреЛ рднрд░реНрддреАрдХреЛ рд▓рд╛рдЧрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ, рд░ рд╕рдореНрднрд╡ рднрдПрдорд╛ рдпрд╕рд▓рд╛рдИ рдмреЗрд╡рд╛рд╕реНрддрд╛ рдЧрд░реНрдиреБрдкрд░реНрдЫ рдЬрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫред рд╣рд╛рдореАрд▓реЗ FDW (рд╡рд┐рджреЗрд╢реА рдбрд╛рдЯрд╛ рд░реНрдпрд╛рдкрд░) рдкреНрд░рд╡рд┐рдзрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реНрдпреМрдВ: рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдкрдорд╛, рдпреЛ рдПрдХ рдорд╛рдирдХ dblink рд╣реЛ, рдЬреБрди SQL рдорд╛рдирдХрдорд╛ рдЫ, рддрд░ рдпрд╕рдХреЛ рдЖрдлреНрдиреИ рдзреЗрд░реИ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЗрдиреНрдЯрд░рдлреЗрд╕рдХреЛ рд╕рд╛рдеред рддреНрдпрд╕реИрдХреЛ рдЖрдзрд╛рд░рдорд╛ рд╣рд╛рдореАрд▓реЗ рд╕рдорд╛рдзрд╛рди рдЧрд░реНтАНрдпреМрдВ, рдЬреБрди рдЕрдиреНрддрддрдГ рд╕рдорд╛рддреНтАНрдпреЛ рд░ рд╣рд╛рдореА рддреНрдпрд╕рдорд╛ рдмрд╕реНрдпреМрдВред рдпрд╕рдХреЛ рд╡рд┐рд╡рд░рдгрд╣рд░реВ рдЫреБрдЯреНрдЯреИ рд▓реЗрдЦрдХреЛ рд╡рд┐рд╖рдп рд╣реБрдиреН, рд░ рд╣реБрдирд╕рдХреНрдЫ рдПрдХ рднрдиреНрджрд╛ рдмрдвреА, рдХрд┐рдирдХрд┐ рдо рдзреЗрд░реИ рдХреБрд░рд╛ рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреБ: рдбрд╛рдЯрд╛рдмреЗрд╕ рд╕реНрдХреАрдорд╛рд╣рд░реВ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬ рдЧрд░реНрдирджреЗрдЦрд┐ рдкрд╣реБрдБрдЪ рдирд┐рдпрдиреНрддреНрд░рдг рд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдбрд╛рдЯрд╛рдХреЛ рдирд┐рдЬреАрдХрд░рдгрд╕рдореНрдоред рдпреЛ рд░рд┐рдЬрд░реНрднреЗрд╕рди рдЧрд░реНрди рдкрдирд┐ рдЖрд╡рд╢реНрдпрдХ рдЫ рдХрд┐ рдпреЛ рд╕рдорд╛рдзрд╛рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рдбрд╛рдЯрд╛рдмреЗрд╕ рд░ рднрдгреНрдбрд╛рд░рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╣реЛрдЗрди; рдпрд╕рд▓реЗ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрджрдЫред

рд╢реАрд░реНрд╖ рд╕реНрддрд░рдорд╛ рдпреЛ рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ:

рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрднрд┐рд╕ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рдорд╛ рдЕрдкрд░реЗрд╢рдирд▓ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕: рдорджреНрджрдд рд░ рдкреНрд░рдореНрдкреНрдЯ Postgres FDW
рддреНрдпрд╣рд╛рдБ рдПрдХ PostgreSQL рдбрд╛рдЯрд╛рдмреЗрд╕ рдЫ рдЬрд╣рд╛рдБ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрд▓реЗ рдЖрдлреНрдиреЛ рдХрд╛рдордХреЛ рдбрд╛рдЯрд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрди рд╕рдХреНрдЫрдиреН, рд░ рд╕рдмреИрднрдиреНрджрд╛ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдХреБрд░рд╛, FDW рдорд╛рд░реНрдлрдд рд╕рдмреИ рд╕реЗрд╡рд╛рд╣рд░реВрдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреГрддрд┐рд╣рд░реВ рдпрд╕ рдбрд╛рдЯрд╛рдмреЗрд╕рдорд╛ рдЬреЛрдбрд┐рдПрдХрд╛ рдЫрдиреНред рдпрд╕рд▓реЗ рдзреЗрд░реИ рдбрд╛рдЯрд╛рдмреЗрд╕рд╣рд░реВрдорд╛ рдХреНрд╡реЗрд░реА рд▓реЗрдЦреНрди рд╕рдореНрднрд╡ рдмрдирд╛рдЙрдБрдЫ, рд░ рдпреЛ рдХреЗ рд╣реЛ рднрдиреНрдиреЗ рдХреБрд░рд╛рд▓реЗ рдлрд░рдХ рдкрд╛рд░реНрджреИрди: PostgreSQL, MySQL, MongoDB рд╡рд╛ рдЕрд░реВ рдХреЗрд╣рд┐ (рдлрд╛рдЗрд▓, API, рдпрджрд┐ рдЕрдЪрд╛рдирдХ рдХреБрдиреИ рдЙрдкрдпреБрдХреНрдд рд░реНрдпрд╛рдкрд░ рдЫреИрди рднрдиреЗ, рддрдкрд╛рдЗрдБ рдЖрдлреНрдиреЛ рд▓реЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ)ред рдЦреИрд░, рд╕рдмреИ рд░рд╛рдореНрд░реЛ рджреЗрдЦрд┐рдиреНрдЫ! рдХреЗ рд╣рд╛рдореА рдмреНрд░реЗрдХрдЕрдк рдЧрд░реНрджреИрдЫреМрдВ?

рдпрджрд┐ рд╕рдмреИ рдХреБрд░рд╛ рдпрддрд┐ рдЫрд┐рдЯреЛ рд░ рд╕рд░рд▓ рд░реВрдкрдорд╛ рд╕рдорд╛рдкреНрдд рднрдпреЛ рднрдиреЗ, рд╕рд╛рдпрдж, рддреНрдпрд╣рд╛рдБ рдПрдХ рд▓реЗрдЦ рд╣реБрдиреЗрдЫреИрдиред

рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕рд▓реЗ рд░рд┐рдореЛрдЯ рд╕рд░реНрднрд░рд╣рд░реВрдорд╛ рдЕрдиреБрд░реЛрдзрд╣рд░реВ рдХрд╕рд░реА рдкреНрд░рд╢реЛрдзрди рдЧрд░реНрдЫ рднрдиреНрдиреЗ рдмрд╛рд░реЗ рд╕реНрдкрд╖реНрдЯ рд╣реБрди рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЫред рдпреЛ рддрд╛рд░реНрдХрд┐рдХ рджреЗрдЦрд┐рдиреНрдЫ, рддрд░ рдкреНрд░рд╛рдп: рдорд╛рдирд┐рд╕рд╣рд░реВрд▓реЗ рдпрд╕рдорд╛ рдзреНрдпрд╛рди рджрд┐рдБрджреИрдирдиреН: рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕рд▓реЗ рдЕрдиреБрд░реЛрдзрд▓рд╛рдИ рднрд╛рдЧрд╣рд░реВрдорд╛ рд╡рд┐рднрд╛рдЬрди рдЧрд░реНрджрдЫ рдЬреБрди рд░рд┐рдореЛрдЯ рд╕рд░реНрднрд░рд╣рд░реВрдорд╛ рд╕реНрд╡рддрдиреНрддреНрд░ рд░реВрдкрдорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░рд┐рдиреНрдЫ, рдпреЛ рдбрд╛рдЯрд╛ рд╕рдЩреНрдХрд▓рди рдЧрд░реНрджрдЫ, рд░ рдЕрдиреНрддрд┐рдо рдЧрдгрдирд╛рд╣рд░реВ рдЖрдлреИрдВ рдЧрд░реНрджрдЫ, рддреНрдпрд╕реИрд▓реЗ рдХреНрд╡реЗрд░реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХреЛ рдЧрддрд┐ рдзреЗрд░реИ рдирд┐рд░реНрднрд░ рд╣реБрдиреЗрдЫред рдпреЛ рдХрд╕рд░реА рд▓реЗрдЦрд┐рдПрдХреЛ рдЫред рдпреЛ рдкрдирд┐ рдзреНрдпрд╛рди рджрд┐рдиреБрдкрд░реНрдЫ: рдЬрдм рдбреЗрдЯрд╛ рд░рд┐рдореЛрдЯ рд╕рд░реНрднрд░рдмрд╛рдЯ рдЖрдЙрдБрдЫ, рдпрд╕рдорд╛ рдЕрдм рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рд╣рд░реВ рдЫреИрдирдиреН, рддреНрдпрд╣рд╛рдБ рдХреЗрд╣рд┐ рдкрдирд┐ рдЫреИрди рдЬрд╕рд▓реЗ рдЕрдиреБрд╕реВрдЪрдХрд▓рд╛рдИ рдорджреНрджрдд рдЧрд░реНрджрдЫ, рддреНрдпрд╕реИрд▓реЗ, рдХреЗрд╡рд▓ рд╣рд╛рдореА рдЖрдлреИрд▓реЗ рдЙрд╣рд╛рдБрд▓рд╛рдИ рдорджреНрджрдд рдЧрд░реНрди рд░ рд╕рд▓реНрд▓рд╛рд╣ рджрд┐рди рд╕рдХреНрдЫреМрдВред рд░ рдпреЛ рдареНрдпрд╛рдХреНрдХреИ рдХреЗ рд╣реЛ рдо рдердк рд╡рд┐рд╕реНрддрд╛рд░рдорд╛ рдХреБрд░рд╛ рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреБред

рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рд╢реНрди рд░ рдпрд╕рдХреЛ рд╕рд╛рде рдПрдХ рдпреЛрдЬрдирд╛

рдкреЛрд╖реНрдЯрдЧреНрд░реЗрд╕рд▓реЗ рд░рд┐рдореЛрдЯ рд╕рд░реНрднрд░рдорд╛ 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

рдкреНрд░рд╢реНрдирд╣рд░реВ рд▓реЗрдЦреНрджрд╛ рддрдкрд╛рдИрдВрд▓реЗ рдзреНрдпрд╛рди рджрд┐рдиреБ рдкрд░реНрдиреЗ рдмрд┐рдиреНрджреБ рдпрд╣реА рд╣реЛред рдлрд┐рд▓реНрдЯрд░рд╣рд░реВ рд░рд┐рдореЛрдЯ рд╕рд░реНрднрд░рдорд╛ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░рд┐рдПрдХрд╛ рдерд┐рдПрдирдиреН, рдЬрд╕рдХреЛ рдЕрд░реНрде рдпреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрди, рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕рд▓реЗ рд╕реНрдерд╛рдиреАрдп рд░реВрдкрдорд╛ рдлрд┐рд▓реНрдЯрд░ рдЧрд░реНрди (рдлрд┐рд▓реНрдЯрд░ рдкрдЩреНрдХреНрддрд┐) рд░ рдПрдЧреНрд░реАрдЧреЗрд╕рди рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рд╕рдмреИ 6 рдорд┐рд▓рд┐рдпрди рдкрдЩреНрдХреНрддрд┐рд╣рд░реВ рдмрд╛рд╣рд┐рд░ рдирд┐рдХрд╛рд▓реНрдЫред рд╕рдлрд▓рддрд╛рдХреЛ рдХреБрдЮреНрдЬреА рднрдиреЗрдХреЛ рдХреНрд╡реЗрд░реА рд▓реЗрдЦреНрдиреБ рд╣реЛ рддрд╛рдХрд┐ рдлрд┐рд▓реНрдЯрд░рд╣рд░реВ рд░рд┐рдореЛрдЯ рдореЗрд╕рд┐рдирдорд╛ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рд╣реБрдиреНрдЫрдиреН, рд░ рд╣рд╛рдореАрд▓реЗ рдЖрд╡рд╢реНрдпрдХ рдкрдЩреНрдХреНрддрд┐рд╣рд░реВ рдорд╛рддреНрд░ рдкреНрд░рд╛рдкреНрдд рд░ рдЬрдореНрдорд╛ рдЧрд░реНрдЫреМрдВред

рддреНрдпреЛ рдХреЗрд╣реА рдмреБрд▓реЗрдиреНрд╕рд┐рдЯ рд╣реЛ

рдмреБрд▓рд┐рдпрди рдХреНрд╖реЗрддреНрд░рд╣рд░реБ рд╕рдВрдЧ рд╕рдмреИ рд╕рд░рд▓ рдЫред рдореВрд▓ рдЕрдиреБрд░реЛрдзрдорд╛, рд╕рдорд╕реНрдпрд╛ рдЕрдкрд░реЗрдЯрд░рдХреЛ рдХрд╛рд░рдг рдерд┐рдпреЛ 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 рдЫреЛрдбреНрдиреЗрдЫ, рдЬрдмрдХрд┐ ! = рд╕рд╛рдБрдЪреЛ рдХреЗрд╡рд▓ рдЧрд▓рдд рдорд╛рдирд╣рд░реВ рдЫреЛрдбреНрдиреЗрдЫред рддреНрдпрд╕реИрд▓реЗ, рдЕрдкрд░реЗрдЯрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЧрд░реНрджрд╛ рдЫреИрди OR рдЕрдкрд░реЗрдЯрд░рд╕рдБрдЧ рджреБрдИ рд╕рд░реНрддрд╣рд░реВ рдлрд┐рд▓реНрдЯрд░рдорд╛ рдкрд╛рд╕ рдЧрд░рд┐рдиреБрдкрд░реНрдЫ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдХрд╣рд╛рдБ (col != True) OR (col null рдЫ).

рд╣рд╛рдореАрд▓реЗ рдмреБрд▓рд┐рдпрдирд╕рдБрдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдЧрд░реЗрдХрд╛ рдЫреМрдВ, рдЕрдЧрд╛рдбрд┐ рдмрдвреМрдВред рдЕрд╣рд┐рд▓реЗрдХреЛ рд▓рд╛рдЧрд┐, рдЕрдиреНрдп рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВрдХреЛ рдкреНрд░рднрд╛рд╡рд▓рд╛рдИ рд╕реНрд╡рддрдиреНрддреНрд░ рд░реВрдкрдорд╛ рд╡рд┐рдЪрд╛рд░ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдмреБрд▓рд┐рдпрди рдлрд┐рд▓реНрдЯрд░рд▓рд╛рдИ рдпрд╕рдХреЛ рдореВрд▓ рд░реВрдкрдорд╛ рдлрд┐рд░реНрддрд╛ рдЧрд░реМрдВред

timestamptz? hz

рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рддрдкрд╛рдЗрдБрд▓реЗ рдкреНрд░рд╛рдп: рд░рд┐рдореЛрдЯ рд╕рд░реНрднрд░рд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрдиреЗ рдЕрдиреБрд░реЛрдз рдХрд╕рд░реА рд╕рд╣реА рд░реВрдкрдорд╛ рд▓реЗрдЦреНрдиреЗ рднрдиреЗрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрдкрд░реНрдЫ, рд░ рддреНрдпрд╕рдкрдЫрд┐ рдорд╛рддреНрд░ рдпреЛ рдХрд┐рди рд╣реБрдиреНрдЫ рднрдиреНрдиреЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЦреЛрдЬреНрдиреБрд╣реЛрд╕реНред рдпрд╕рдХреЛ рдмрд╛рд░реЗрдорд╛ рдзреЗрд░реИ рдереЛрд░реИ рдЬрд╛рдирдХрд╛рд░реА рдЗрдиреНрдЯрд░рдиреЗрдЯрдорд╛ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХрд┐рдиреНрдЫред рддреНрдпрд╕реЛрднрдП, рдкреНрд░рдпреЛрдЧрд╣рд░реВрдорд╛ рд╣рд╛рдореАрд▓реЗ рдкрддреНрддрд╛ рд▓рдЧрд╛рдпреМрдВ рдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдорд┐рддрд┐ рдлрд┐рд▓реНрдЯрд░рд▓реЗ рд░рд┐рдореЛрдЯ рд╕рд░реНрднрд░рдорд╛ рдмреНрдпрд╛рдВрдЧрдХреЛ рд╕рд╛рде рдЙрдбреНрдЫ, рддрд░ рдЬрдм рд╣рд╛рдореА рдЧрддрд┐рд╢реАрд▓ рд░реВрдкрдорд╛ рдорд┐рддрд┐ рд╕реЗрдЯ рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреМрдВ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, now() рд╡рд╛ CURRENT_DATE, рдпреЛ рд╣реБрдБрджреИрдиред рд╣рд╛рдореНрд░реЛ рдЙрджрд╛рд╣рд░рдгрдорд╛, рд╣рд╛рдореАрд▓реЗ рдПрдЙрдЯрд╛ рдлрд┐рд▓реНрдЯрд░ рдердкреНрдпреМрдВ рдЬрд╕рд▓реЗ рдЧрд░реНрджрд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ_рдПрдЯ рд╕реНрддрдореНрднрдорд╛ рдареНрдпрд╛рдХреНрдХреИ рез рдорд╣рд┐рдирд╛рдХреЛ рдбреЗрдЯрд╛ рд╕рдорд╛рд╡реЗрд╢ рдерд┐рдпреЛ (рдмрд┐рдЪрдорд╛ CURRENT_DATE - INTERVAL 'рен рдорд╣рд┐рдирд╛' рд░ CURRENT_DATE - INTERVAL '1 рдорд╣рд┐рдирд╛')ред рдпреЛ рдорд╛рдорд▓рд╛ рдорд╛ рд╣рд╛рдореАрд▓реЗ рдХреЗ рдЧрд░реНрдпреМрдВ?

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 рд╡реНрдпрд╡рд╣рд╛рд░, рдкреБрд╢ рдбрд╛рдЙрди (рд╕рдВрд╕реНрдХрд░рдг 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 рдЧреБрдгрд╛ рднрдиреНрджрд╛ рдЫрд┐рдЯреЛ рдЫ! рд░ рд╣рд╛рдореА рддреБрд▓рдирд╛рддреНрдордХ рд░реВрдкрдорд╛ рд╕рд╛рдиреЛ рдбрд╛рдЯрд╛ рд╕реЗрдЯ рд╡рд┐рд░реБрджреНрдз рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рд╢реНрдирдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреБрд░рд╛ рдЧрд░реНрджреИрдЫреМрдВред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрд░реЛрдзрд╣рд░реВрдорд╛, рд╣рд╛рдореАрд▓реЗ рдзреЗрд░реИ рд╕рдп рдЧреБрдгрд╛ рд╕рдореНрдордХреЛ рд╡реГрджреНрдзрд┐ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдпреМрдВред

рд╕рдВрдХреНрд╖реЗрдкрдорд╛: рдпрджрд┐ рддрдкрд╛рдЗрдБ FDW рд╕рдБрдЧ PostgreSQL рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рд╕рдзреИрдБ рдЬрд╛рдБрдЪ рдЧрд░реНрдиреБрд╣реЛрд╕реН рдХрд┐ рд╕рдмреИ рдлрд┐рд▓реНрдЯрд░рд╣рд░реВ рд░рд┐рдореЛрдЯ рд╕рд░реНрднрд░рдорд╛ рдкрдард╛рдЗрдПрдХрд╛ рдЫрдиреН, рд░ рддрдкрд╛рдЗрдБ рдЦреБрд╕реА рд╣реБрдиреБрд╣реБрдиреЗрдЫ... рдХрдореНрддрд┐рдорд╛ рддрдкрд╛рдЗрдБ рд╡рд┐рднрд┐рдиреНрди рд╕рд░реНрднрд░рд╣рд░реВрдмрд╛рдЯ рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВ рдмреАрдЪ рдЬреЛрдбрд┐рди рдирдкрд╛рдЙрдБрджрд╛рд╕рдореНрдоред рддрд░ рддреНрдпреЛ рдЕрд░реНрдХреЛ рд▓реЗрдЦрдХреЛ рд▓рд╛рдЧрд┐ рдХрдерд╛ рд╣реЛред

рддрдкрд╛рдИрдХреЛ рдзреНрдпрд╛рдирд╛рдХрд░реНрд╕рдирдХреЛ рд▓рд╛рдЧрд┐ рдзрдиреНрдпрд╡рд╛рдж! рдо рдЯрд┐рдкреНрдкрдгреАрд╣рд░реВрдорд╛ рддрдкрд╛рдИрдВрдХреЛ рдЕрдиреБрднрд╡рд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рдкреНрд░рд╢реНрдирд╣рд░реВ, рдЯрд┐рдкреНрдкрдгреАрд╣рд░реВ, рд░ рдХрдерд╛рд╣рд░реВ рд╕реБрдиреНрди рдЪрд╛рд╣рдиреНрдЫреБред

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди