PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдЖрдгрд┐ рдХреНрд╡реЗрд░реА рдХрд╢реА рдЬреБрд│рд╡рд╛рдпрдЪреА

рдЕрдиреЗрдХ рдЬреЗ рдЖрдзреАрдЪ рд╡рд╛рдкрд░рдд рдЖрд╣реЗрдд explain.tensor.ru - рдЖрдордЪреНрдпрд╛ PostgreSQL рдпреЛрдЬрдирд╛ рд╡реНрд╣рд┐рдЬреНрдпреБрдЕрд▓рд╛рдпрдЭреЗрд╢рди рд╕реЗрд╡реЗрд▓рд╛ рдХрджрд╛рдЪрд┐рдд рддреНрдпрд╛рдЪреНрдпрд╛ рдПрдХрд╛ рдорд╣рд╛рд╕рддреНрддреЗрдмрджреНрджрд▓ рдорд╛рд╣рд┐рддреА рдирд╕реЗрд▓ - рд╕рд░реНрд╡реНрд╣рд░ рд▓реЙрдЧрдЪрд╛ рд╡рд╛рдЪрд╛рдпрд▓рд╛ рдХрдареАрдг рднрд╛рдЧ рдмрджрд▓рдгреЗ...

PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдЖрдгрд┐ рдХреНрд╡реЗрд░реА рдХрд╢реА рдЬреБрд│рд╡рд╛рдпрдЪреА
... рд╕рдВрдмрдВрдзрд┐рдд рдпреЛрдЬрдирд╛ рдиреЛрдбреНрд╕рд╕рд╛рдареА рд╕рдВрджрд░реНрднрд┐рдд рд╕реВрдЪрдирд╛рдВрд╕рд╣ рд╕реБрдВрджрд░ рдбрд┐рдЭрд╛рдЗрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рдХреНрд╡реЗрд░реАрдордзреНрдпреЗ:

PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдЖрдгрд┐ рдХреНрд╡реЗрд░реА рдХрд╢реА рдЬреБрд│рд╡рд╛рдпрдЪреА
рддреНрдпрд╛рдЪреНрдпрд╛ рджреБрд╕рд▒реНрдпрд╛ рднрд╛рдЧрд╛рдЪреНрдпрд╛ рдпрд╛ рдЙрддрд╛рд░реНтАНрдпрд╛рдд PGConf.Russia 2020 рдпреЗрдереЗ рдЕрд╣рд╡рд╛рд▓ рдЖрдореНрд╣реА рд╣реЗ рдХрд╕реЗ рдХреЗрд▓реЗ рддреЗ рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рд╕рд╛рдВрдЧреЗрди.

рдкрд╣рд┐рд▓реНрдпрд╛ рднрд╛рдЧрд╛рдЪрд╛ рдЙрддрд╛рд░рд╛, рд╕рд╛рдорд╛рдиреНрдп рдХреНрд╡реЗрд░реА рдХрд╛рд░реНрдпрдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛ рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕рдорд░реНрдкрд┐рдд, рд▓реЗрдЦрд╛рдд рдЖрдврд│реВ рд╢рдХрддреЗ "рдЖрдЬрд╛рд░ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ SQL рдкреНрд░рд╢реНрдирд╛рдВрд╕рд╛рдареА рдкрд╛рдХрдХреГрддреА".



рдкреНрд░рдердо, рдЪрд▓рд╛ рд░рдВрдЧ рджреЗрдгреЗ рд╕реБрд░реВ рдХрд░реВрдпрд╛ - рдЖрдгрд┐ рдЖрдореНрд╣реА рдпрд╛рдкреБрдвреЗ рдпреЛрдЬрдиреЗрд▓рд╛ рд░рдВрдЧ рджреЗрдгрд╛рд░ рдирд╛рд╣реА, рдЖрдореНрд╣реА рддреЗ рдЖрдзреАрдЪ рд░рдВрдЧрд╡рд┐рд▓реЗ рдЖрд╣реЗ, рдЖрдордЪреНрдпрд╛рдХрдбреЗ рддреЗ рдЖрдзреАрдкрд╛рд╕реВрдирдЪ рд╕реБрдВрджрд░ рдЖрдгрд┐ рд╕рдордЬрдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдЖрд╣реЗ, рдкрд░рдВрддреБ рдПрдХ рд╡рд┐рдирдВрддреА.

рдЖрдореНрд╣рд╛рд▓рд╛ рдЕрд╕реЗ рд╡рд╛рдЯрд▓реЗ рдХреА рдЕрд╢рд╛ рд╕реНрд╡рд░реВрдкрд┐рдд рдирд╕рд▓реЗрд▓реНрдпрд╛ "рд╢реАрдЯ" рд╕рд╣ рд▓реЙрдЧрдордзреВрди рдЦреЗрдЪрд▓реЗрд▓реА рд╡рд┐рдирдВрддреА рдЦреВрдк рдХреБрд░реВрдк рджрд┐рд╕рддреЗ рдЖрдгрд┐ рдореНрд╣рдгреВрди рдЧреИрд░рд╕реЛрдпреАрдЪреА рдЖрд╣реЗ.
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдЖрдгрд┐ рдХреНрд╡реЗрд░реА рдХрд╢реА рдЬреБрд│рд╡рд╛рдпрдЪреА

рд╡рд┐рд╢реЗрд╖рдд: рдЬреЗрд╡реНрд╣рд╛ рд╡рд┐рдХрд╕рдХ рдХреЛрдбрдордзреАрд▓ рд╡рд┐рдирдВрддреАрдЪреНрдпрд╛ рдореБрдЦреНрдп рднрд╛рдЧрд╛рд▓рд╛ рдПрдХрд╛ рдУрд│реАрдд тАЬрдЧреЛрдВрджтАЭ рдХрд░рддрд╛рдд (рд╣реЗ рдЕрд░реНрдерд╛рддрдЪ рдЕрдБрдЯреАрдкреЕрдЯрд░реНрди рдЖрд╣реЗ, рдкрд░рдВрддреБ рдЕрд╕реЗ рдШрдбрддреЗ). рднрдпрд╛рдирдХ!

рдЪрд▓рд╛ рд╣реЗ рдЖрдгрдЦреА рд╕реБрдВрджрд░ рдЪрд┐рддреНрд░ рдХрд╛рдвреВрдпрд╛.
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдЖрдгрд┐ рдХреНрд╡реЗрд░реА рдХрд╢реА рдЬреБрд│рд╡рд╛рдпрдЪреА

рдЖрдгрд┐ рдЬрд░ рдЖрдкрдг рд╣реЗ рд╕реБрдВрджрд░рдкрдгреЗ рдХрд╛рдвреВ рд╢рдХрддреЛ, рдореНрд╣рдгрдЬреЗ, рд╡рд┐рдирдВрддреАрдЪрд╛ рдореБрдЦреНрдп рднрд╛рдЧ рд╡реЗрдЧрд│реЗ рдХрд░реВ рд╢рдХрддреЛ рдЖрдгрд┐ рдкрд░рдд рдПрдХрддреНрд░ рдареЗрд╡реВ рд╢рдХрддреЛ, рддрд░ рдЖрдкрдг рдпрд╛ рд╡рд┐рдирдВрддреАрдЪреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯрд▓рд╛ рдПрдХ рдЗрд╢рд╛рд░рд╛ "рд╕рдВрд▓рдЧреНрди" рдХрд░реВ рд╢рдХрддреЛ - рдпреЛрдЬрдиреЗрддреАрд▓ рд╕рдВрдмрдВрдзрд┐рдд рдмрд┐рдВрджреВрд╡рд░ рдХрд╛рдп рдШрдбрд▓реЗ.

рд╡рд╛рдХреНрдпрд░рдЪрдирд╛ рдЯреНрд░реА рдХреНрд╡реЗрд░реА рдХрд░рд╛

рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рд╡рд┐рдирдВрддреА рдкреНрд░рдердо рд╡рд┐рд╢реНрд▓реЗрд╖рд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдЖрдгрд┐ рдХреНрд╡реЗрд░реА рдХрд╢реА рдЬреБрд│рд╡рд╛рдпрдЪреА

рдХрд╛рд░рдг рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдЖрд╣реЗ рдкреНрд░рдгрд╛рд▓реАрдЪрд╛ рдХреЛрд░ NodeJS рд╡рд░ рдЪрд╛рд▓рддреЛ, рдордЧ рдЖрдореНрд╣реА рддреНрдпрд╛рд╕рд╛рдареА рдПрдХ рдореЙрдбреНрдпреВрд▓ рдмрдирд╡рд▓реЗ, рддреБрдореНрд╣реА рдХрд░реВ рд╢рдХрддрд╛ GitHub рд╡рд░ рд╢реЛрдзрд╛. рдЦрд░рдВ рддрд░, рд╣реЗ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдПрд╕рдХреНрдпреВрдПрд▓ рдкрд╛рд░реНрд╕рд░рдЪреНрдпрд╛ рдЕрдВрддрд░реНрдЧрдд рднрд╛рдЧрд╛рдВрд╕рд╛рдареА рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд "рдмрд╛рдЗрдВрдбрд┐рдВрдЧреНрдЬ" рдЖрд╣реЗрдд. рдореНрд╣рдгрдЬреЗрдЪ, рд╡реНрдпрд╛рдХрд░рдг рдлрдХреНрдд рдмрд╛рдпрдирд░реА рд╕рдВрдХрд▓рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ рдЖрдгрд┐ рддреНрдпрд╛рд╕ рдиреЛрдбрдЬреЗрдПрд╕ рд╡рд░реВрди рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗрд▓реЗ рдЬрд╛рддреЗ. рдЖрдореНрд╣реА рдЗрддрд░ рд▓реЛрдХрд╛рдВрдЪреЗ рдореЙрдбреНрдпреВрд▓ рдПрдХ рдЖрдзрд╛рд░ рдореНрд╣рдгреВрди рдШреЗрддрд▓реЗ - рдпреЗрдереЗ рдХреЛрдгрддреЗрд╣реА рдореЛрдареЗ рд░рд╣рд╕реНрдп рдирд╛рд╣реА.

рдЖрдореНрд╣реА рд╡рд┐рдирдВрддреАрдЪрд╛ рдореБрдЦреНрдп рднрд╛рдЧ рдЖрдордЪреНрдпрд╛ рдлрдВрдХреНрд╢рдирдордзреНрдпреЗ рдЗрдирдкреБрдЯ рдореНрд╣рдгреВрди рдлреАрдб рдХрд░рддреЛ - рдЖрдЙрдЯрдкреБрдЯрд╡рд░ рдЖрдореНрд╣рд╛рд▓рд╛ JSON рдСрдмреНрдЬреЗрдХреНрдЯрдЪреНрдпрд╛ рд░реВрдкрд╛рдд рдПрдХ рдкрд╛рд░реНрд╕ рдХреЗрд▓реЗрд▓реЗ рд╡рд╛рдХреНрдпрд░рдЪрдирд╛ рдЯреНрд░реА рдорд┐рд│рддреЗ.
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдЖрдгрд┐ рдХреНрд╡реЗрд░реА рдХрд╢реА рдЬреБрд│рд╡рд╛рдпрдЪреА

рдЖрддрд╛ рдЖрдкрдг рдпрд╛ рдЭрд╛рдбрд╛рдордзреВрди рдЙрд▓рдЯ рджрд┐рд╢реЗрдиреЗ рдзрд╛рд╡реВ рд╢рдХрддреЛ рдЖрдгрд┐ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рд╣рд╡реЗ рдЕрд╕рд▓реЗрд▓реЗ рдЗрдВрдбреЗрдВрдЯ, рд░рдВрдЧ рдЖрдгрд┐ рд╕реНрд╡рд░реВрдкрдирд╛рд╕рд╣ рд╡рд┐рдирдВрддреА рдПрдХрддреНрд░ рдХрд░реВ рд╢рдХрддреЛ. рдирд╛рд╣реА, рд╣реЗ рд╕рд╛рдиреБрдХреВрд▓ рдХрд░рдгреНрдпрд╛рдпреЛрдЧреНрдп рдирд╛рд╣реА, рдкрд░рдВрддреБ рдЖрдореНрд╣рд╛рд▓рд╛ рдЕрд╕реЗ рд╡рд╛рдЯрд▓реЗ рдХреА рд╣реЗ рд╕реЛрдпреАрдЪреЗ рдЕрд╕реЗрд▓.
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдЖрдгрд┐ рдХреНрд╡реЗрд░реА рдХрд╢реА рдЬреБрд│рд╡рд╛рдпрдЪреА

рдореЕрдкрд┐рдВрдЧ рдХреНрд╡реЗрд░реА рдЖрдгрд┐ рдпреЛрдЬрдирд╛ рдиреЛрдбреНрд╕

рдЖрддрд╛ рдЖрдкрдг рдкрд╣рд┐рд▓реНрдпрд╛ рдЪрд░рдгрд╛рдд рд╡рд┐рд╢реНтАНрд▓реЗрд╖рд┐рдд рдХреЗрд▓реЗрд▓реА рдпреЛрдЬрдирд╛ рдЖрдгрд┐ рджреБрд╕рд▒реНрдпрд╛ рдЪрд░рдгрд╛рдд рд╡рд┐рд╢реНтАНрд▓реЗрд╖рд┐рдд рдХреЗрд▓реЗрд▓реА рдХреНрд╡реЗрд░реА рдпрд╛рдВрдЪреА рд╕рд╛рдВрдЧрдб рдХрд╢реА рдШрд╛рд▓рддрд╛ рдпреЗрдИрд▓ рддреЗ рдкрд╛рд╣реВ.

рдПрдХ рд╕рд╛рдзреЗ рдЙрджрд╛рд╣рд░рдг рдШреЗрдК - рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдПрдХ рдХреНрд╡реЗрд░реА рдЖрд╣реЗ рдЬреА CTE рдЬрдирд░реЗрдЯ рдХрд░рддреЗ рдЖрдгрд┐ рддреНрдпрд╛рддреВрди рджреЛрдирджрд╛ рд╡рд╛рдЪрддреЗ. рддреЛ рдЕрд╢реА рдпреЛрдЬрдирд╛ рддрдпрд╛рд░ рдХрд░рддреЛ.
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдЖрдгрд┐ рдХреНрд╡реЗрд░реА рдХрд╢реА рдЬреБрд│рд╡рд╛рдпрдЪреА

рдЯреЗ рджреЗ

рддреБрдореНрд╣реА рдиреАрдЯ рдкрд╛рд╣рд┐рд▓реНрдпрд╛рд╕, рдЖрд╡реГрддреНрддреА резреи рдкрд░реНрдпрдВрдд (рдХрд┐рдВрд╡рд╛ рддреНрдпрд╛рддреВрди рдХреАрд╡рд░реНрдбрд╕рд╣ рдкреНрд░рд╛рд░рдВрдн рдХрд░рд╛ MATERIALIZED) рдирд┐рд░реНрдорд┐рддреА рд╕реАрдЯреАрдИ рд╣рд╛ рдирд┐рдпреЛрдЬрдХрд╛рд╕рд╛рдареА рдкреВрд░реНрдг рдЕрдбрдерд│рд╛ рдЖрд╣реЗ.
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдЖрдгрд┐ рдХреНрд╡реЗрд░реА рдХрд╢реА рдЬреБрд│рд╡рд╛рдпрдЪреА

рдпрд╛рдЪрд╛ рдЕрд░реНрде рдЕрд╕рд╛ рдХреА рдЖрдореНрд╣рд╛рд▓рд╛ рд╡рд┐рдирдВрддреАрдордзреНрдпреЗ рдХреБрдареЗрддрд░реА CTE рдЬрдирд░реЗрд╢рди рдЖрдгрд┐ рдкреНрд▓реЕрдирдордзреНрдпреЗ рдХреБрдареЗрддрд░реА рдиреЛрдб рджрд┐рд╕рд▓рд╛ CTE, рдордЧ рд╣реЗ рдиреЛрдбреНрд╕ рдирд┐рд╢реНрдЪрд┐рддрдкрдгреЗ рдПрдХрдореЗрдХрд╛рдВрд╢реА тАЬрд▓рдврд╛тАЭ рдХрд░рддрд╛рдд, рдЖрдореНрд╣реА рддреНрдпрд╛рдВрдирд╛ рддреНрд╡рд░рд┐рдд рдПрдХрддреНрд░ рдХрд░реВ рд╢рдХрддреЛ.

рддрд╛рд░рдХрд╛рд╕рд╣ рд╕рдорд╕реНрдпрд╛: CTEs рдиреЗрд╕реНрдЯреЗрдб рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ.
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдЖрдгрд┐ рдХреНрд╡реЗрд░реА рдХрд╢реА рдЬреБрд│рд╡рд╛рдпрдЪреА
рдЦреВрдк рдЦрд░рд╛рдм рдШрд░рдЯреЗ рдЖрд╣реЗрдд рдЖрдгрд┐ рдЕрдЧрджреА рддреНрдпрд╛рдЪ рдирд╛рд╡рд╛рдЪреЗ рдЖрд╣реЗрдд. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЖрдкрдг рдЖрдд рдХрд░реВ рд╢рдХрддрд╛ CTE A рдмрдирд╡рд╛ CTE X, рдЖрдгрд┐ рдЖрдд рд╕рдорд╛рди рдкрд╛рддрд│реАрд╡рд░ CTE B рддреЗ рдкреБрдиреНрд╣рд╛ рдХрд░рд╛ CTE X:

WITH A AS (
  WITH X AS (...)
  SELECT ...
)
, B AS (
  WITH X AS (...)
  SELECT ...
)
...

рддреБрд▓рдирд╛ рдХрд░рддрд╛рдирд╛, рдЖрдкрдг рд╣реЗ рд╕рдордЬреВрди рдШреЗрддрд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ. рд╣реЗ тАЬрддреБрдордЪреНрдпрд╛ рдбреЛрд│реНрдпрд╛рдВрдиреАтАЭ рд╕рдордЬреВрди рдШреЗрдгреЗ - рдЕрдЧрджреА рдпреЛрдЬрдирд╛ рдкрд╛рд╣рдгреЗ, рдЕрдЧрджреА рд╡рд┐рдирдВрддреАрдЪреЗ рд╢рд░реАрд░ рдкрд╛рд╣рдгреЗ - рдЦреВрдк рдХрдареАрдг рдЖрд╣реЗ. рдЬрд░ рддреБрдордЪреА CTE рдЬрдирд░реЗрд╢рди рдЧреБрдВрддрд╛рдЧреБрдВрддреАрдЪреА рдЕрд╕реЗрд▓, рдиреЗрд╕реНрдЯреЗрдб рдЕрд╕реЗрд▓ рдЖрдгрд┐ рд╡рд┐рдирдВрддреНрдпрд╛ рдореЛрдареНрдпрд╛ рдЕрд╕рддреАрд▓, рддрд░ рддреЗ рдкреВрд░реНрдгрдкрдгреЗ рдмреЗрд╢реБрджреНрдз рдЖрд╣реЗ.

рдпреБрдирд┐рдпрди

рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдХреНрд╡реЗрд░реАрдордзреНрдпреЗ рдХреАрд╡рд░реНрдб рдЕрд╕рд▓реНрдпрд╛рд╕ UNION [ALL] (рджреЛрди рдирдореБрдиреЗ рдЬреЛрдбрдгреНрдпрд╛рдЪрд╛ рдСрдкрд░реЗрдЯрд░), рдирдВрддрд░ рдпреЛрдЬрдиреЗрдд рддреЗ рдПрдХрддрд░ рдиреЛрдбрд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдЖрд╣реЗ Append, рдХрд┐рдВрд╡рд╛ рдХрд╛рд╣реА Recursive Union.
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдЖрдгрд┐ рдХреНрд╡реЗрд░реА рдХрд╢реА рдЬреБрд│рд╡рд╛рдпрдЪреА

рдЬреЗ рд╡рд░ "рд╡рд░" рдЖрд╣реЗ UNION - рд╣рд╛ рдЖрдордЪреНрдпрд╛ рдиреЛрдбрдЪрд╛ рдкрд╣рд┐рд▓рд╛ рд╡рдВрд╢рдЬ рдЖрд╣реЗ, рдЬреЛ "рдЦрд╛рд▓реА" рдЖрд╣реЗ - рджреБрд╕рд░рд╛. рдЬрд░ рдорд╛рдзреНрдпрдорд╛рддреВрди UNION рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдПрдХрд╛рдЪ рд╡реЗрд│реА рдЕрдиреЗрдХ рдмреНрд▓реЙрдХреНрд╕ "рдЧреЛрдВрджрд▓реЗрд▓реЗ" рдЖрд╣реЗрдд Append-рдЕрдЬреВрдирд╣реА рдлрдХреНрдд рдПрдХрдЪ рдиреЛрдб рдЕрд╕реЗрд▓, рдкрдг рддреНрдпрд╛рдд рджреЛрди рдирд╛рд╣реА рддрд░ рдмрд░реАрдЪ рдореБрд▓реЗ рдЕрд╕рддреАрд▓ - рдХреНрд░рдорд╢рдГ рддреЗ рдЬрд╛рддрд╛рдд:

  (...) -- #1
UNION ALL
  (...) -- #2
UNION ALL
  (...) -- #3

Append
  -> ... #1
  -> ... #2
  -> ... #3

рддрд╛рд░рдХрд╛рд╕рд╣ рд╕рдорд╕реНрдпрд╛: рдЖрд╡рд░реНрддреА рд╕реЕрдореНрдкрд▓рд┐рдВрдЧ рдЬрдирд░реЗрд╢рдирдЪреНрдпрд╛ рдЖрдд (WITH RECURSIVE) рджреЗрдЦреАрд▓ рдПрдХрд╛рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдЕрд╕реВ рд╢рдХрддрд╛рдд UNION. рдкрд░рдВрддреБ рд╢реЗрд╡рдЯрдЪреНрдпрд╛ рдирдВрддрд░рдЪрд╛ рдлрдХреНрдд рд╢реЗрд╡рдЯрдЪрд╛ рдмреНрд▓реЙрдХ рдиреЗрд╣рдореА рдкреБрдирд░рд╛рд╡реГрддреНрддреА рдХрд░рдгрд╛рд░рд╛ рдЕрд╕рддреЛ UNION. рд╡рд░реАрд▓ рд╕рд░реНрд╡ рдХрд╛рд╣реА рдПрдХ рдЖрд╣реЗ, рдкрд░рдВрддреБ рднрд┐рдиреНрди рдЖрд╣реЗ UNION:

WITH RECURSIVE T AS(
  (...) -- #1
UNION ALL
  (...) -- #2, ╤В╤Г╤В ╨║╨╛╨╜╤З╨░╨╡╤В╤Б╤П ╨│╨╡╨╜╨╡╤А╨░╤Ж╨╕╤П ╤Б╤В╨░╤А╤В╨╛╨▓╨╛╨│╨╛ ╤Б╨╛╤Б╤В╨╛╤П╨╜╨╕╤П ╤А╨╡╨║╤Г╤А╤Б╨╕╨╕
UNION ALL
  (...) -- #3, ╤В╨╛╨╗╤М╨║╨╛ ╤Н╤В╨╛╤В ╨▒╨╗╨╛╨║ ╤А╨╡╨║╤Г╤А╤Б╨╕╨▓╨╜╤Л╨╣ ╨╕ ╨╝╨╛╨╢╨╡╤В ╤Б╨╛╨┤╨╡╤А╨╢╨░╤В╤М ╨╛╨▒╤А╨░╤Й╨╡╨╜╨╕╨╡ ╨║ T
)
...

рддреБрдореНрд╣рд╛рд▓рд╛ рдЕрд╢реА рдЙрджрд╛рд╣рд░рдгреЗ "рдЖрдКрдЯ" рдХрд░рдгреНрдпрд╛рдд рд╕рдХреНрд╖рдо рдЕрд╕рдгреЗ рджреЗрдЦреАрд▓ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдд рдЖрдкрдг рддреЗ рдкрд╛рд╣рддреЛ UNION-рдЖрдордЪреНрдпрд╛ рд╡рд┐рдирдВрддреАрдордзреНрдпреЗ 3 рд╡рд┐рднрд╛рдЧ рд╣реЛрддреЗ. рддреНрдпрд╛рдиреБрд╕рд╛рд░, рдПрдХ UNION рдЪреНрдпрд╛рд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдЖрд╣реЗ Append-рдиреЛрдб, рдЖрдгрд┐ рдЗрддрд░ - Recursive Union.
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдЖрдгрд┐ рдХреНрд╡реЗрд░реА рдХрд╢реА рдЬреБрд│рд╡рд╛рдпрдЪреА

рдбреЗрдЯрд╛ рд╡рд╛рдЪрд╛-рд▓рд┐рд╣рд╛

рд╕рд░реНрд╡ рдХрд╛рд╣реА рдорд╛рдВрдбрд▓реЗ рдЖрд╣реЗ, рдЖрддрд╛ рдЖрдореНрд╣рд╛рд▓рд╛ рдорд╛рд╣рд┐рдд рдЖрд╣реЗ рдХреА рд╡рд┐рдирдВрддреАрдЪрд╛ рдХреЛрдгрддрд╛ рднрд╛рдЧ рдпреЛрдЬрдиреЗрдЪреНрдпрд╛ рдХреЛрдгрддреНрдпрд╛ рднрд╛рдЧрд╛рд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдЖрд╣реЗ. рдЖрдгрд┐ рдпрд╛ рддреБрдХрдбреНрдпрд╛рдВрдордзреНрдпреЗ рдЖрдкрдг рд╕рд╣рдЬрдкрдгреЗ рдЖрдгрд┐ рдиреИрд╕рд░реНрдЧрд┐рдХрд░рд┐рддреНрдпрд╛ "рд╡рд╛рдЪрдгреНрдпрд╛рдпреЛрдЧреНрдп" рд╡рд╕реНрддреВ рд╢реЛрдзреВ рд╢рдХрддреЛ.

рдХреНрд╡реЗрд░реАрдЪреНрдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рддреВрди, рдЖрдореНрд╣рд╛рд▓рд╛ рдорд╛рд╣рд┐рдд рдирд╛рд╣реА рдХреА рддреЗ рдЯреЗрдмрд▓ рдЖрд╣реЗ рдХреА CTE, рдкрд░рдВрддреБ рддреЗ рд╕рдорд╛рди рдиреЛрдбрджреНрд╡рд╛рд░реЗ рдирд┐рдпреБрдХреНрдд рдХреЗрд▓реЗ рдЖрд╣реЗрдд RangeVar. рдЖрдгрд┐ "рд╡рд╛рдЪрдиреАрдпрддрд╛" рдЪреНрдпрд╛ рджреГрд╖реНрдЯреАрдиреЗ, рд╣реЗ рдиреЛрдбреНрд╕рдЪрд╛ рдПрдХ рдорд░реНрдпрд╛рджрд┐рдд рд╕рдВрдЪ рджреЗрдЦреАрд▓ рдЖрд╣реЗ:

  • Seq Scan on [tbl]
  • Bitmap Heap Scan on [tbl]
  • Index [Only] Scan [Backward] using [idx] on [tbl]
  • CTE Scan on [cte]
  • Insert/Update/Delete on [tbl]

рдЖрдореНрд╣рд╛рд▓рд╛ рдпреЛрдЬрдирд╛ рдЖрдгрд┐ рдХреНрд╡реЗрд░реАрдЪреА рд░рдЪрдирд╛ рдорд╛рд╣рд┐рдд рдЖрд╣реЗ, рдЖрдореНрд╣рд╛рд▓рд╛ рдмреНрд▓реЙрдХреНрд╕рдЪрд╛ рдкрддреНрд░рд╡реНрдпрд╡рд╣рд╛рд░ рдорд╛рд╣рд┐рдд рдЖрд╣реЗ, рдЖрдореНрд╣рд╛рд▓рд╛ рд╡рд╕реНрддреВрдВрдЪреА рдирд╛рд╡реЗ рдорд╛рд╣рд┐рдд рдЖрд╣реЗрдд - рдЖрдореНрд╣реА рдПрдХ-рдПрдХ рддреБрд▓рдирд╛ рдХрд░рддреЛ.
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдЖрдгрд┐ рдХреНрд╡реЗрд░реА рдХрд╢реА рдЬреБрд│рд╡рд╛рдпрдЪреА

рдкреБрдиреНрд╣рд╛ "рддрд╛рд░рдХрд╛рд╕рд╣" рдХрд╛рд░реНрдп. рдЖрдореНрд╣реА рд╡рд┐рдирдВрддреА рд╕реНрд╡реАрдХрд╛рд░рддреЛ, рддреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддреЛ, рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдХреЛрдгрддреЗрд╣реА рдЙрдкрдирд╛рд╡ рдирд╛рд╣реАрдд - рдЖрдореНрд╣реА рддреА рдПрдХрд╛рдЪ CTE рд╡рд░реВрди рдлрдХреНрдд рджреЛрдирджрд╛ рд╡рд╛рдЪрддреЛ.
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдЖрдгрд┐ рдХреНрд╡реЗрд░реА рдХрд╢реА рдЬреБрд│рд╡рд╛рдпрдЪреА

рдЖрдореНрд╣реА рдпреЛрдЬрдирд╛ рдкрд╛рд╣рддреЛ - рдХрд╛рдп рд╕рдорд╕реНрдпрд╛ рдЖрд╣реЗ? рдЖрдореНрд╣рд╛рд▓рд╛ рдЙрдкрдирд╛рд╡ рдХрд╛ рдЭрд╛рд▓рд╛? рдЖрдореНрд╣реА рддреЗ рдСрд░реНрдбрд░ рдХреЗрд▓реЗ рдирд╛рд╣реА. рддреНрдпрд╛рд▓рд╛ рдЕрд╕рд╛ "рдирдВрдмрд░ рдирдВрдмрд░" рдХреБрдареЗ рдорд┐рд│реЗрд▓?

PostgreSQL рддреЗ рд╕реНрд╡рддрдГ рдЬреЛрдбрддреЗ. рдЖрдкрдг рдлрдХреНрдд рддреЗ рд╕рдордЬреВрди рдШреЗрдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдлрдХреНрдд рдЕрд╕реЗ рдЙрдкрдирд╛рдо рдЖрдордЪреНрдпрд╛рд╕рд╛рдареА, рдпреЛрдЬрдиреЗрд╢реА рддреБрд▓рдирд╛ рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рд╣реЗрддреВрдиреЗ, рддреНрдпрд╛рд╕ рдХрд╛рд╣реА рдЕрд░реНрде рдирд╛рд╣реА, рддреЗ рдпреЗрдереЗ рдЬреЛрдбрд▓реЗ рдЖрд╣реЗ. рдЪрд▓рд╛ рддреНрдпрд╛рдЪреНрдпрд╛рдХрдбреЗ рд▓рдХреНрд╖ рджреЗрдК рдирдХрд╛.

рджреБрд╕рд░рд╛ "рддрд╛рд░рдХрд╛рд╕рд╣" рдХрд╛рд░реНрдп: рдЬрд░ рдЖрдкрдг рд╡рд┐рднрд╛рдЬрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЯреЗрдмрд▓рд╡рд░реВрди рд╡рд╛рдЪрдд рдЕрд╕рд╛рд▓, рддрд░ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдПрдХ рдиреЛрдб рдорд┐рд│реЗрд▓ Append рдХрд┐рдВрд╡рд╛ Merge Append, рдЬреНрдпрд╛рдордзреНрдпреЗ рдореЛрдареНрдпрд╛ рд╕рдВрдЦреНрдпреЗрдиреЗ "рдореБрд▓реЗ" рдЕрд╕рддреАрд▓ рдЖрдгрд┐ рддреНрдпрд╛рдкреИрдХреА рдкреНрд░рддреНрдпреЗрдХ рдХрд╕рд╛ рддрд░реА рдЕрд╕реЗрд▓ ScanрдЯреЗрдмрд▓-рд╡рд┐рднрд╛рдЧрд╛рддреВрди 'om: Seq Scan, Bitmap Heap Scan рдХрд┐рдВрд╡рд╛ Index Scan. рдкрд░рдВрддреБ, рдХреЛрдгрддреНрдпрд╛рд╣реА рдкрд░рд┐рд╕реНрдерд┐рддреАрдд, рд╣реА "рдореБрд▓реЗ" рдЬрдЯрд┐рд▓ рдкреНрд░рд╢реНрди рдирд╕рддреАрд▓ - рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ рдпрд╛ рдиреЛрдбреНрд╕рдкрд╛рд╕реВрди рд╡реЗрдЧрд│реЗ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ. Append рдпреЗрдереЗ UNION.
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдЖрдгрд┐ рдХреНрд╡реЗрд░реА рдХрд╢реА рдЬреБрд│рд╡рд╛рдпрдЪреА

рдЖрдореНрд╣рд╛рд▓рд╛ рдЕрд╢рд╛ рдЧрд╛рдареА рджреЗрдЦреАрд▓ рд╕рдордЬрддрд╛рдд, рддреНрдпрд╛ тАЬрдПрдХрд╛ рдврд┐рдЧрд╛рд▒реНрдпрд╛рддтАЭ рдЧреЛрд│рд╛ рдХрд░рд╛ рдЖрдгрд┐ рдореНрд╣рдгрд╛: тАЬрддреБрдореНрд╣реА megatable рд╡рд░реВрди рд╡рд╛рдЪрд▓реЗрд▓реЗ рд╕рд░реНрд╡ рдХрд╛рд╣реА рдпреЗрдереЗ рдЖрдгрд┐ рдЭрд╛рдбрд╛рдЪреНрдпрд╛ рдЦрд╛рд▓реА рдЖрд╣реЗ".

"рд╕рд╛рдзреЗ" рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдгрд╛рд░реЗ рдиреЛрдбреНрд╕

PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдЖрдгрд┐ рдХреНрд╡реЗрд░реА рдХрд╢реА рдЬреБрд│рд╡рд╛рдпрдЪреА

Values Scan рдпреЛрдЬрдиреЗрд╢реА рд╕реБрд╕рдВрдЧрдд рдЖрд╣реЗ VALUES рд╡рд┐рдирдВрддреА рдордзреНрдпреЗ.

Result рд╢рд┐рд╡рд╛рдп рд╡рд┐рдирдВрддреА рдЖрд╣реЗ FROM рдЬрд╕реЗ SELECT 1. рдХрд┐рдВрд╡рд╛ рдЬреЗрд╡реНрд╣рд╛ рддреБрдордЪреНрдпрд╛рдордзреНрдпреЗ рдЬрд╛рдгреАрд╡рдкреВрд░реНрд╡рдХ рдЦреЛрдЯреА рдЕрднрд┐рд╡реНрдпрдХреНрддреА рдЕрд╕рддреЗ WHERE-рдмреНрд▓реЙрдХ (рдирдВрддрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рджрд┐рд╕рддреЗ One-Time Filter):

EXPLAIN ANALYZE
SELECT * FROM pg_class WHERE FALSE; -- ╨╕╨╗╨╕ 0 = 1

Result  (cost=0.00..0.00 rows=0 width=230) (actual time=0.000..0.000 rows=0 loops=1)
  One-Time Filter: false

Function Scan рддреНрдпрд╛рдЪ рдирд╛рд╡рд╛рдЪреНрдпрд╛ SRF рдЪрд╛ тАЬрдирдХрд╛рд╢рд╛тАЭ.

рдкрд░рдВрддреБ рдиреЗрд╕реНрдЯреЗрдб рдХреНрд╡реЗрд░реАрдВрд╕рд╣ рд╕рд░реНрд╡рдХрд╛рд╣реА рдЕрдзрд┐рдХ рдХреНрд▓рд┐рд╖реНрдЯ рдЖрд╣реЗ - рджреБрд░реНрджреИрд╡рд╛рдиреЗ, рддреЗ рдиреЗрд╣рдореАрдЪ рдмрджрд▓рдд рдирд╛рд╣реАрдд InitPlan/SubPlan. рдХрдзреАрдХрдзреА рддреЗ рдордзреНрдпреЗ рдмрджрд▓рддрд╛рдд ... Join рдХрд┐рдВрд╡рд╛ ... Anti Join, рд╡рд┐рд╢реЗрд╖рддрдГ рдЬреЗрд╡реНрд╣рд╛ рддреБрдореНрд╣реА рдЕрд╕реЗ рдХрд╛рд╣реАрддрд░реА рд▓рд┐рд╣рд┐рддрд╛ WHERE NOT EXISTS .... рдЖрдгрд┐ рдпреЗрдереЗ рддреНрдпрд╛рдВрдирд╛ рдПрдХрддреНрд░ рдХрд░рдгреЗ рдиреЗрд╣рдореАрдЪ рд╢рдХреНрдп рдирд╕рддреЗ - рдпреЛрдЬрдиреЗрдЪреНрдпрд╛ рдордЬрдХреБрд░рд╛рдд рдпреЛрдЬрдиреЗрдЪреНрдпрд╛ рдиреЛрдбреНрд╕рд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрдгрддреЗрд╣реА рдСрдкрд░реЗрдЯрд░ рдирд╛рд╣реАрдд.

рдкреБрдиреНрд╣рд╛ "рддрд╛рд░рдХрд╛рд╕рд╣" рдХрд╛рд░реНрдп: рдХрд╛рд╣реА VALUES рд╡рд┐рдирдВрддреА рдордзреНрдпреЗ. рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд рдЖрдгрд┐ рдпреЛрдЬрдиреЗрдордзреНрдпреЗ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдЕрдиреЗрдХ рдиреЛрдбреНрд╕ рдорд┐рд│рддреАрд▓ Values Scan.
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдЖрдгрд┐ рдХреНрд╡реЗрд░реА рдХрд╢реА рдЬреБрд│рд╡рд╛рдпрдЪреА

"рдХреНрд░рдорд╛рдВрдХрд┐рдд" рдкреНрд░рддреНрдпрдп рддреНрдпрд╛рдВрдирд╛ рдПрдХрдореЗрдХрд╛рдВрдкрд╛рд╕реВрди рд╡реЗрдЧрд│реЗ рдХрд░рдгреНрдпрд╛рдд рдорджрдд рдХрд░рддреАрд▓ - рддреЗ рдЬреНрдпрд╛ рдХреНрд░рдорд╛рдиреЗ рд╕рдВрдмрдВрдзрд┐рдд рдЖрд╣реЗрдд рддреНрдпрд╛ рдХреНрд░рдорд╛рдиреЗ рдЬреЛрдбрд▓реЗ рдЬрд╛рддрд╛рдд. VALUES- рд╡рд░рдкрд╛рд╕реВрди рдЦрд╛рд▓рдкрд░реНрдпрдВрдд рд╡рд┐рдирдВрддреАрд╕рд╣ рдЕрд╡рд░реЛрдзрд┐рдд рдХрд░рд╛.

рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ

рдЕрд╕реЗ рджрд┐рд╕рддреЗ рдХреА рдЖрдордЪреНрдпрд╛ рд╡рд┐рдирдВрддреАрддреАрд▓ рд╕рд░реНрд╡ рдХрд╛рд╣реА рд╕реЛрдбрд╡рд▓реЗ рдЧреЗрд▓реЗ рдЖрд╣реЗ - рдлрдХреНрдд рдмрд╛рдХреА рдЖрд╣реЗ Limit.
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдЖрдгрд┐ рдХреНрд╡реЗрд░реА рдХрд╢реА рдЬреБрд│рд╡рд╛рдпрдЪреА

рдкрд░рдВрддреБ рдпреЗрдереЗ рд╕рд░реНрд╡рдХрд╛рд╣реА рд╕реЛрдкреЗ рдЖрд╣реЗ - рдЬрд╕реЗ рдХреА рдиреЛрдбреНрд╕ Limit, Sort, Aggregate, WindowAgg, Unique рд╡рд┐рдирдВрддреАрдордзреНрдпреЗ рд╕рдВрдмрдВрдзрд┐рдд рдСрдкрд░реЗрдЯрд░реНрд╕рдирд╛ рдПрдХ рддреЗ рдПрдХ тАЬрдирдХрд╛рд╢рд╛тАЭ рджреНрдпрд╛, рдЬрд░ рддреЗ рддреЗрдереЗ рдЕрд╕рддреАрд▓ рддрд░. рдпреЗрдереЗ рдХреЛрдгрддреЗрд╣реА "рддрд╛рд░реЗ" рдХрд┐рдВрд╡рд╛ рдЕрдбрдЪрдгреА рдирд╛рд╣реАрдд.
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдЖрдгрд┐ рдХреНрд╡реЗрд░реА рдХрд╢реА рдЬреБрд│рд╡рд╛рдпрдЪреА

рд╕рд╛рдореАрд▓ рд╡реНрд╣рд╛

рдЬреЗрд╡реНрд╣рд╛ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдПрдХрддреНрд░ рдХрд░рд╛рдпрдЪреЗ рдЕрд╕рддреЗ рддреЗрд╡реНрд╣рд╛ рдЕрдбрдЪрдгреА рдпреЗрддрд╛рдд JOIN рдЖрдкрд╛рдкрд╕рд╛рдд. рд╣реЗ рдиреЗрд╣рдореАрдЪ рд╢рдХреНрдп рдирд╛рд╣реА, рдкрд░рдВрддреБ рд╣реЗ рд╢рдХреНрдп рдЖрд╣реЗ.
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдЖрдгрд┐ рдХреНрд╡реЗрд░реА рдХрд╢реА рдЬреБрд│рд╡рд╛рдпрдЪреА

рдХреНрд╡реЗрд░реА рдкрд╛рд░реНрд╕рд░рдЪреНрдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рддреВрди, рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдПрдХ рдиреЛрдб рдЖрд╣реЗ JoinExpr, рдЬреНрдпрд╛рд▓рд╛ рдЕрдЧрджреА рджреЛрди рдореБрд▓реЗ рдЖрд╣реЗрдд - рдбрд╛рд╡реЗ рдЖрдгрд┐ рдЙрдЬрд╡реЗ. рд╣реЗ, рддреНрдпрд╛рдиреБрд╕рд╛рд░, рддреБрдордЪреНрдпрд╛ рд╕рд╛рдореАрд▓ рд╣реЛрдгреНрдпрд╛рд╕рд╛рдареА "рд╡рд░" рдХрд╛рдп рдЖрд╣реЗ рдЖрдгрд┐ рд╡рд┐рдирдВрддреАрдордзреНрдпреЗ "рдЦрд╛рд▓реА" рдХрд╛рдп рд▓рд┐рд╣рд┐рд▓реЗ рдЖрд╣реЗ.

рдЖрдгрд┐ рдпреЛрдЬрдиреЗрдЪреНрдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рддреВрди, рд╣реЗ рдХрд╛рд╣реАрдВрдЪреЗ рджреЛрди рд╡рдВрд╢рдЬ рдЖрд╣реЗрдд * Loop/* Join-рдиреЛрдб. Nested Loop, Hash Anti Join,... - рддрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ рдХрд╛рд╣реАрддрд░реА.

рдЪрд▓рд╛ рд╕реЛрдкреНрдпрд╛ рддрд░реНрдХрд╛рдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрдпрд╛: рдЬрд░ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдкреНрд▓реЕрдирдордзреНтАНрдпреЗ рдПрдХрдореЗрдХрд╛рдВрдирд╛ "рд╕рд╛рдореАрд▓" рд╣реЛрдгрд╛рд░реНтАНрдпрд╛ рдЯреЗрдмрд▓реНрд╕ A рдЖрдгрд┐ B рдЕрд╕рддреАрд▓, рддрд░ рд╡рд┐рдирдВрддреАрдиреБрд╕рд╛рд░ рддреЗ рдПрдХрддрд░ рд╢реЛрдзреВ рд╢рдХрддрд╛рдд. A-JOIN-B, рдХрд┐рдВрд╡рд╛ B-JOIN-A. рдЪрд▓рд╛ рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ рдПрдХрддреНрд░ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реВрдпрд╛, рдЗрддрд░ рдорд╛рд░реНрдЧрд╛рдиреЗ рдПрдХрддреНрд░ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реВрдпрд╛ рдЖрдгрд┐ рдЕрд╢рд╛ рдЬреЛрдбреНрдпрд╛ рд╕рдВрдкреЗрдкрд░реНрдпрдВрдд.

рдЪрд▓рд╛ рдЖрдордЪрд╛ рд╕рд┐рдВрдЯреЕрдХреНрд╕ рдЯреНрд░реА рдШреЗрдК, рдЖрдордЪрд╛ рдкреНрд▓реЕрди рдШреЗрдК, рддреНрдпрд╛рдВрдЪреНрдпрд╛рдХрдбреЗ рдкрд╛рд╣реВ... рд╕рд╛рд░рдЦреЗ рдирд╛рд╣реА!
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдЖрдгрд┐ рдХреНрд╡реЗрд░реА рдХрд╢реА рдЬреБрд│рд╡рд╛рдпрдЪреА

рдЪрд▓рд╛ рддреЗ рдЖрд▓реЗрдЦрд╛рдВрдЪреНрдпрд╛ рд░реВрдкрд╛рдд рдкреБрдиреНрд╣рд╛ рдХрд╛рдвреВ - рдЕрд░реЗ, рддреЗ рдЖрдзреАрдЪ рдХрд╛рд╣реАрддрд░реА рджрд┐рд╕рддреЗ рдЖрд╣реЗ!
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдЖрдгрд┐ рдХреНрд╡реЗрд░реА рдХрд╢реА рдЬреБрд│рд╡рд╛рдпрдЪреА

рдЪрд▓рд╛ рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛ рдХреА рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдиреЛрдбреНрд╕ рдЖрд╣реЗрдд рдЬреНрдпрд╛рдд рдПрдХрд╛рдЪ рд╡реЗрд│реА рдмреА рдЖрдгрд┐ рд╕реА рдореБрд▓реЗ рдЖрд╣реЗрдд - рдЖрдореНрд╣рд╛рд▓рд╛ рдХреЛрдгрддреНрдпрд╛ рдХреНрд░рдорд╛рдиреЗ рдХрд╛рд│рдЬреА рдирд╛рд╣реА. рдЪрд▓рд╛ рддреНрдпрд╛рдВрдирд╛ рдПрдХрддреНрд░ рдХрд░реВ рдЖрдгрд┐ рдиреЛрдбрдЪреЗ рдЪрд┐рддреНрд░ рдЙрд▓рдЯ рдХрд░реВ.
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдЖрдгрд┐ рдХреНрд╡реЗрд░реА рдХрд╢реА рдЬреБрд│рд╡рд╛рдпрдЪреА

рдкреБрдиреНрд╣рд╛ рдмрдШреВрдпрд╛. рдЖрддрд╛ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдореБрд▓рд╛рдВрд╕рд╣ рдиреЛрдбреНрд╕ A рдЖрдгрд┐ рдЬреЛрдбреНрдпрд╛ (B + C) рдЖрд╣реЗрдд - рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╢реА рд╕реБрд╕рдВрдЧрдд.
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдЖрдгрд┐ рдХреНрд╡реЗрд░реА рдХрд╢реА рдЬреБрд│рд╡рд╛рдпрдЪреА

рдЫрд╛рди! рд╣реЗ рдЖрдореНрд╣реА рджреЛрдШреЗ рдЖрд╣реЛрдд рд╣реЗ рдХрд│рддреЗ JOIN рд╡рд┐рдирдВрддреАрд╡рд░реВрди рдкреНрд▓реЕрди рдиреЛрдбреНрд╕ рдпрд╢рд╕реНрд╡реАрд░рд┐рддреНрдпрд╛ рдПрдХрддреНрд░ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ.

рдЕрд░реЗрд░реЗ, рд╣реА рд╕рдорд╕реНрдпрд╛ рдиреЗрд╣рдореАрдЪ рд╕реЛрдбрд╡рд▓реА рдЬрд╛рдд рдирд╛рд╣реА.
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдЖрдгрд┐ рдХреНрд╡реЗрд░реА рдХрд╢реА рдЬреБрд│рд╡рд╛рдпрдЪреА

рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рд╡рд┐рдирдВрддреА рдЕрд╕рд▓реНрдпрд╛рд╕ A JOIN B JOIN C, рдЖрдгрд┐ рдпреЛрдЬрдиреЗрдордзреНрдпреЗ, рд╕рд░реНрд╡ рдкреНрд░рдердо, "рдмрд╛рд╣реНрдп" рдиреЛрдбреНрд╕ A рдЖрдгрд┐ C рдЬреЛрдбрд▓реЗрд▓реЗ рд╣реЛрддреЗ. рдкрд░рдВрддреБ рд╡рд┐рдирдВрддреАрдордзреНрдпреЗ рдЕрд╕рд╛ рдХреЛрдгрддрд╛рд╣реА рдСрдкрд░реЗрдЯрд░ рдирд╛рд╣реА, рдЖрдордЪреНрдпрд╛рдХрдбреЗ рд╣рд╛рдпрд▓рд╛рдЗрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрд╛рд╣реАрд╣реА рдирд╛рд╣реА, рдЗрд╢рд╛рд░рд╛ рдЬреЛрдбрдгреНрдпрд╛рд╕рд╛рдареА рдХрд╛рд╣реАрд╣реА рдирд╛рд╣реА. рддреБрдореНрд╣реА рд▓рд┐рд╣рд┐рддрд╛ рддреЗрд╡реНрд╣рд╛ "рд╕реНрд╡рд▓реНрдкрд╡рд┐рд░рд╛рдо" рдмрд░реЛрдмрд░рдЪ рдЖрд╣реЗ A, B.

рдкрд░рдВрддреБ, рдмрд╣реБрддреЗрдХ рдкреНрд░рдХрд░рдгрд╛рдВрдордзреНрдпреЗ, рдЬрд╡рд│рдЬрд╡рд│ рд╕рд░реНрд╡ рдиреЛрдбреНрд╕ "рдЙрдШрдбрд▓реЗрд▓реЗ" рдЕрд╕реВ рд╢рдХрддрд╛рдд рдЖрдгрд┐ рдЖрдкрдг рд╡реЗрд│реЗрдд рдбрд╛рд╡реАрдХрдбреЗ рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░рдЪреЗ рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдорд┐рд│рд╡реВ рд╢рдХрддрд╛ - рдЕрдХреНрд╖рд░рд╢рдГ, рдЬрд╕реЗ рдХреА Google Chrome рдордзреНрдпреЗ рдЖрдкрдг JavaScript рдХреЛрдбрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛. рдкреНрд░рддреНрдпреЗрдХ рдУрд│ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд╛рди тАЬрдХрд╛рд░реНрдпрд╛рдиреНрд╡реАрддтАЭ рд╣реЛрдгреНрдпрд╛рд╕рд╛рдареА рдХрд┐рддреА рд╡реЗрд│ рд▓рд╛рдЧрд▓рд╛ рддреЗ рддреБрдореНрд╣реА рдкрд╛рд╣реВ рд╢рдХрддрд╛.
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдЖрдгрд┐ рдХреНрд╡реЗрд░реА рдХрд╢реА рдЬреБрд│рд╡рд╛рдпрдЪреА

рдЖрдгрд┐ рд╣реЗ рд╕рд░реНрд╡ рд╡рд╛рдкрд░рдгреЗ рддреБрдордЪреНрдпрд╛рд╕рд╛рдареА рдЕрдзрд┐рдХ рд╕реЛрдпреАрдЪреЗ рд╡реНрд╣рд╛рд╡реЗ рдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣реА рд╕реНрдЯреЛрд░реЗрдЬ рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЖрд╣реЗ рд╕рдВрдЧреНрд░рд╣, рдЬрд┐рдереЗ рддреБрдореНрд╣реА рдЬрддрди рдХрд░реВ рд╢рдХрддрд╛ рдЖрдгрд┐ рдирдВрддрд░ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рдирдВрддреНрдпрд╛рдВрд╕рд╣ рддреБрдордЪреНрдпрд╛ рдпреЛрдЬрдирд╛ рд╢реЛрдзреВ рд╢рдХрддрд╛ рдХрд┐рдВрд╡рд╛ рдПрдЦрд╛рджреНрдпрд╛рд╕реЛрдмрдд рд▓рд┐рдВрдХ рд╢реЗрдЕрд░ рдХрд░реВ рд╢рдХрддрд╛.

рддреБрдореНрд╣рд╛рд▓рд╛ рди рд╡рд╛рдЪрддрд╛ рдпреЗрдгрд╛рд░реА рдХреНрд╡реЗрд░реА рдкреБрд░реЗрд╢рд╛ рд╕реНрд╡рд░реВрдкрд╛рдд рдЖрдгрд╛рдпрдЪреА рдЕрд╕рд▓реНрдпрд╛рд╕, рд╡рд╛рдкрд░рд╛ рдЖрдордЪреЗ "рдиреЙрд░реНрдорд▓рд╛рдпрдЭрд░".

PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдЖрдгрд┐ рдХреНрд╡реЗрд░реА рдХрд╢реА рдЬреБрд│рд╡рд╛рдпрдЪреА

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛