PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдФрд░ рдХреНрд╡реЗрд░реА рдХрд╛ рдорд┐рд▓рд╛рди рдХреИрд╕реЗ рдХрд░реЗрдВ

рдХрдИ рд▓реЛрдЧ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛.рдЯреЗрдВрд╕рд░.рдЖрд░рдпреВ - рд╣рдорд╛рд░реА PostgreSQL рдпреЛрдЬрдирд╛ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╕реЗрд╡рд╛ рдХреЛ рдЗрд╕рдХреА рдорд╣рд╛рд╢рдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рд╕рд░реНрд╡рд░ рд▓реЙрдЧ рдХреЗ рдПрдХ рдХрдард┐рди-рд╕реЗ-рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдореЛрдбрд╝рдирд╛ ...

PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдФрд░ рдХреНрд╡реЗрд░реА рдХрд╛ рдорд┐рд▓рд╛рди рдХреИрд╕реЗ рдХрд░реЗрдВ
... рд╕рдВрдмрдВрдзрд┐рдд рдпреЛрдЬрдирд╛ рдиреЛрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рдХреНрд╡реЗрд░реА рдореЗрдВ:

PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдФрд░ рдХреНрд╡реЗрд░реА рдХрд╛ рдорд┐рд▓рд╛рди рдХреИрд╕реЗ рдХрд░реЗрдВ
рдЙрдирдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдХреА рдЗрд╕ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдореЗрдВ PGConf.Russia 2020 рдкрд░ рд░рд┐рдкреЛрд░реНрдЯ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рд╣рдо рдпрд╣ рдХреИрд╕реЗ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗред

рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреНрд╡реЗрд░реА рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдФрд░ рдЙрдирдХреЗ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдкрд╣рд▓реЗ рднрд╛рдЧ рдХреА рдкреНрд░рддрд┐рд▓реЗрдЦ, рд▓реЗрдЦ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ "рдЦрд░рд╛рдм рдПрд╕рдХреНрдпреВрдПрд▓ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╡реНрдпрдВрдЬрди рд╡рд┐рдзрд┐".



рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рд░рдВрдЧ рднрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ - рдФрд░ рд╣рдо рдЕрдм рдпреЛрдЬрдирд╛ рдХреЛ рд░рдВрдЧ рдирд╣реАрдВ рджреЗрдВрдЧреЗ, рд╣рдордиреЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╣реА рд░рдВрдЧ рджрд┐рдпрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпрд╣ рд╕реБрдВрджрд░ рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрдиреБрд░реЛрдз рд╣реИред

рд╣рдореЗрдВ рдРрд╕рд╛ рд▓рдЧрд╛ рдХрд┐ рдмрд┐рдирд╛ рд╕реНрд╡рд░реВрдкрд┐рдд "рд╢реАрдЯ" рдХреЗ рд╕рд╛рде рд▓реЙрдЧ рд╕реЗ рдирд┐рдХрд╛рд▓рд╛ рдЧрдпрд╛ рдЕрдиреБрд░реЛрдз рдмрд╣реБрдд рдмрджрд╕реВрд░рдд рдФрд░ рдЗрд╕рд▓рд┐рдП рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд▓рдЧ рд░рд╣рд╛ рд╣реИред
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдФрд░ рдХреНрд╡реЗрд░реА рдХрд╛ рдорд┐рд▓рд╛рди рдХреИрд╕реЗ рдХрд░реЗрдВ

рдЦрд╛рд╕рдХрд░ рдЬрдм рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛрдб рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдХреЛ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ "рдЪрд┐рдкрдХрд╛" рджреЗрддреЗ рд╣реИрдВ (рдпрд╣, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдПрдХ рдПрдВрдЯреАрдкреИрдЯрд░реНрди рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ)ред рднрдпрдВрдХрд░!

рдЖрдЗрдП рдЗрд╕реЗ рдХрд┐рд╕реА рддрд░рд╣ рдФрд░ рдЕрдзрд┐рдХ рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рдмрдирд╛рдПрдВред
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдФрд░ рдХреНрд╡реЗрд░реА рдХрд╛ рдорд┐рд▓рд╛рди рдХреИрд╕реЗ рдХрд░реЗрдВ

рдФрд░ рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рдЪрд┐рддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛рдиреА рдЕрдиреБрд░реЛрдз рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдХреЛ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╛рдкрд╕ рдПрдХ рд╕рд╛рде рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕ рдЕрдиреБрд░реЛрдз рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрдд "рд╕рдВрд▓рдЧреНрди" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдмрд┐рдВрджреБ рдкрд░ рдХреНрдпрд╛ рд╣реБрдЖред

рдХреНрд╡реЗрд░реА рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдиреБрд░реЛрдз рдХреЛ рдкрд╣рд▓реЗ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдФрд░ рдХреНрд╡реЗрд░реА рдХрд╛ рдорд┐рд▓рд╛рди рдХреИрд╕реЗ рдХрд░реЗрдВ

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

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

рдЕрдм рд╣рдо рдЗрд╕ рдкреЗрдбрд╝ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ рдЪрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрдВрдбреЗрдВрдЯ, рд░рдВрдЧ рдФрд░ рдлрд╝реЙрд░реНрдореЗрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдиреБрд░реЛрдз рдЗрдХрдЯреНрдард╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдирд╣реАрдВ, рдпрд╣ рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдРрд╕рд╛ рд▓рдЧрд╛ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ред
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдФрд░ рдХреНрд╡реЗрд░реА рдХрд╛ рдорд┐рд▓рд╛рди рдХреИрд╕реЗ рдХрд░реЗрдВ

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

рдЕрдм рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдо рдЙрд╕ рдпреЛрдЬрдирд╛ рдХреЛ рдХреИрд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рдерд╛ рдФрд░ рдЬрд┐рд╕ рдХреНрд╡реЗрд░реА рдХрд╛ рд╣рдордиреЗ рджреВрд╕рд░реЗ рдЪрд░рдг рдореЗрдВ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рдерд╛ред

рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд▓реЗрдВ - рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдХреНрд╡реЗрд░реА рд╣реИ рдЬреЛ рд╕реАрдЯреАрдИ рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рджреЛ рдмрд╛рд░ рдкрдврд╝рддреА рд╣реИред рд╡рд╣ рдРрд╕реА рдпреЛрдЬрдирд╛ рдмрдирд╛рддрд╛ рд╣реИред
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдФрд░ рдХреНрд╡реЗрд░реА рдХрд╛ рдорд┐рд▓рд╛рди рдХреИрд╕реЗ рдХрд░реЗрдВ

рд╕реАрдЯреАрдИ

рдЕрдЧрд░ рдЖрдк рдЗрд╕реЗ рдзреНрдпрд╛рди рд╕реЗ рджреЗрдЦреЗрдВ рддреЛ рд╕рдВрд╕реНрдХрд░рдг 12 рддрдХ (рдпрд╛ рдХреАрд╡рд░реНрдб рд╕реЗ рд╢реБрд░реВ рдХрд░рдХреЗ)ред MATERIALIZED) рдЧрдарди рд╕реАрдЯреАрдИ рдпреЛрдЬрдирд╛рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг рдмрд╛рдзрд╛ рд╣реИ.
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдФрд░ рдХреНрд╡реЗрд░реА рдХрд╛ рдорд┐рд▓рд╛рди рдХреИрд╕реЗ рдХрд░реЗрдВ

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдЕрдиреБрд░реЛрдз рдореЗрдВ рдХрд╣реАрдВ рд╕реАрдЯреАрдИ рдкреАрдврд╝реА рдФрд░ рдпреЛрдЬрдирд╛ рдореЗрдВ рдХрд╣реАрдВ рдиреЛрдб рджреЗрдЦрддреЗ рд╣реИрдВ CTE, рддреЛ рдпреЗ рдиреЛрдбреНрд╕ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде "рд▓рдбрд╝рд╛рдИ" рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдЙрдиреНрд╣реЗрдВ рддреБрд░рдВрдд рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рддрд╛рд░рд╛рдВрдХрди рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛: рд╕реАрдЯреАрдИ рдХреЛ рдиреЗрд╕реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдФрд░ рдХреНрд╡реЗрд░реА рдХрд╛ рдорд┐рд▓рд╛рди рдХреИрд╕реЗ рдХрд░реЗрдВ
рдмрд╣реБрдд рд╣реА рдЦрд░рд╛рдм рдиреЗрд╕реНрдЯреЗрдб рд╣реИрдВ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рднреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрдВрджрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ CTE A рдмрдирд╛рдирд╛ CTE X, рдФрд░ рдЕрдВрджрд░ рд╕рдорд╛рди рд╕реНрддрд░ рдкрд░ CTE B рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдХрд░реЗрдВ CTE X:

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

рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдпрд╣ рдЕрд╡рд╢реНрдп рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕реЗ "рдЕрдкрдиреА рдЖрдБрдЦреЛрдВ рд╕реЗ" рд╕рдордЭрдирд╛ - рдпрд╣рд╛рдБ рддрдХ рдХрд┐ рдпреЛрдЬрдирд╛ рдХреЛ рджреЗрдЦрдирд╛, рдпрд╣рд╛рдБ рддрдХ рдХрд┐ рдЕрдиреБрд░реЛрдз рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдХреЛ рджреЗрдЦрдирд╛ - рдмрд╣реБрдд рдХрдард┐рди рд╣реИред рдпрджрд┐ рдЖрдкрдХреА рд╕реАрдЯреАрдИ рдкреАрдврд╝реА рдЬрдЯрд┐рд▓, рдиреЗрд╕реНрдЯреЗрдб рд╣реИ рдФрд░ рдЕрдиреБрд░реЛрдз рдмрдбрд╝реЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдЪреЗрддрди рд╣реИред

рд╕рдВрдШ

рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрд╡реЗрд░реА рдореЗрдВ рдХреЛрдИ рдХреАрд╡рд░реНрдб рд╣реИ 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 рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдФрд░ рдХреНрд╡реЗрд░реА рдХрд╛ рдорд┐рд▓рд╛рди рдХреИрд╕реЗ рдХрд░реЗрдВ

рдлрд┐рд░ рдХрд╛рд░реНрдп "рддрд╛рд░рд╛рдВрдХрди рдХреЗ рд╕рд╛рде". рд╣рдо рдЕрдиреБрд░реЛрдз рд▓реЗрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдИ рдЙрдкрдирд╛рдо рдирд╣реАрдВ рд╣реИ - рд╣рдо рдЗрд╕реЗ рдПрдХ рд╣реА рд╕реАрдЯреАрдИ рд╕реЗ рджреЛ рдмрд╛рд░ рдкрдврд╝рддреЗ рд╣реИрдВред
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдФрд░ рдХреНрд╡реЗрд░реА рдХрд╛ рдорд┐рд▓рд╛рди рдХреИрд╕реЗ рдХрд░реЗрдВ

рд╣рдо рдпреЛрдЬрдирд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ - рд╕рдорд╕реНрдпрд╛ рдХреНрдпрд╛ рд╣реИ? рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрдкрдирд╛рдо рдХреНрдпреЛрдВ рдерд╛? рд╣рдордиреЗ рдЗрд╕рдХрд╛ рдСрд░реНрдбрд░ рдирд╣реАрдВ рджрд┐рдпрд╛. рдЙрд╕реЗ рдРрд╕рд╛ "рдирдВрдмрд░ рдирдВрдмрд░" рдХрд╣рд╛рдВ рд╕реЗ рдорд┐рд▓рддрд╛ рд╣реИ?

PostgreSQL рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдмрд╕ рдЗрд╕реЗ рд╕рдордЭрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдРрд╕рд╛ рд╣реА рдПрдХ рдЙрдкрдирд╛рдо рд╣рдорд╛рд░реЗ рд▓рд┐рдП, рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ, рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рдЗрд╕реЗ рдмрд╕ рдпрд╣рд╛рдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред рдЖрдЗрдП рдЙрд╕ рдкрд░ рдзреНрдпрд╛рди рди рджреЗрдВ.

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

рд╣рдо рдРрд╕реА рдЧрд╛рдВрдареЛрдВ рдХреЛ рднреА рд╕рдордЭрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ "рдПрдХ рдвреЗрд░ рдореЗрдВ" рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХрд╣рддреЗ рд╣реИрдВ: "рдореЗрдЧрд╛рдЯреЗрдмрд▓ рд╕реЗ рдЖрдк рдЬреЛ рдХреБрдЫ рднреА рдкрдврд╝рддреЗ рд╣реИрдВ рд╡рд╣ рдпрд╣рд╛рдВ рдФрд░ рдкреЗрдбрд╝ рдХреЗ рдиреАрдЪреЗ рд╣реИ".

"рд╕рд░рд▓" рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдиреЛрдб

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 рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рдПрд╕рдЖрд░рдПрдл рдХреЗ рд▓рд┐рдП "рдорд╛рдирдЪрд┐рддреНрд░"ред

рд▓реЗрдХрд┐рди рдиреЗрд╕реНрдЯреЗрдб рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ - рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╡реЗ рд╣рдореЗрд╢рд╛ рдЗрд╕рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ InitPlan/SubPlan. рдХрднреА-рдХрднреА рд╡реЗ рдмрджрд▓ рдЬрд╛рддреЗ рд╣реИрдВ ... Join рдпрд╛ ... Anti Join, рдЦрд╛рд╕рдХрд░ рдЬрдм рдЖрдк рдХреБрдЫ рдРрд╕рд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ WHERE NOT EXISTS .... рдФрд░ рдпрд╣рд╛рдВ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ - рдпреЛрдЬрдирд╛ рдХреЗ рдкрд╛рда рдореЗрдВ рдпреЛрдЬрдирд╛ рдХреЗ рдиреЛрдбреНрд╕ рдХреЗ рдЕрдиреБрд░реВрдк рдХреЛрдИ рдСрдкрд░реЗрдЯрд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред

рдлрд┐рд░ рдХрд╛рд░реНрдп "рддрд╛рд░рд╛рдВрдХрди рдХреЗ рд╕рд╛рде": рдХреБрдЫ VALUES рдЕрдиреБрд░реЛрдз рдореЗрдВ. рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдФрд░ рдкреНрд▓рд╛рди рдореЗрдВ рдЖрдкрдХреЛ рдХрдИ рдиреЛрдб рдорд┐рд▓реЗрдВрдЧреЗ Values Scan.
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдФрд░ рдХреНрд╡реЗрд░реА рдХрд╛ рдорд┐рд▓рд╛рди рдХреИрд╕реЗ рдХрд░реЗрдВ

"рдХреНрд░рдорд╛рдВрдХрд┐рдд" рдкреНрд░рддреНрдпрдп рдЙрдиреНрд╣реЗрдВ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗ - рд╡реЗ рдареАрдХ рдЙрд╕реА рдХреНрд░рдо рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рддреНрдпрдп рдкрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ VALUES-рдЕрдиреБрд░реЛрдз рдХреЛ рдКрдкрд░ рд╕реЗ рдиреАрдЪреЗ рддрдХ рдмреНрд▓реЙрдХ рдХрд░рддрд╛ рд╣реИред

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

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рд╣рдорд╛рд░реЗ рдЕрдиреБрд░реЛрдз рдореЗрдВ рд╕рдм рдХреБрдЫ рд╕реБрд▓рдЭрд╛ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдЬреЛ рдХреБрдЫ рдмрдЪрд╛ рд╣реИ Limit.
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдФрд░ рдХреНрд╡реЗрд░реА рдХрд╛ рдорд┐рд▓рд╛рди рдХреИрд╕реЗ рдХрд░реЗрдВ

рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ - рдЬреИрд╕реЗ рдиреЛрдбреНрд╕ Limit, Sort, Aggregate, WindowAgg, Unique рдЕрдиреБрд░реЛрдз рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдПрдХ-рд╕реЗ-рдПрдХ "рдореИрдк" рдХрд░реЗрдВ, рдпрджрд┐ рд╡реЗ рд╡рд╣рд╛рдВ рд╣реИрдВред рдпрд╣рд╛рдВ рдХреЛрдИ "рд╕рд┐рддрд╛рд░реЗ" рдпрд╛ рдХрдард┐рдирд╛рдЗрдпрд╛рдВ рдирд╣реАрдВ рд╣реИрдВред
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдФрд░ рдХреНрд╡реЗрд░реА рдХрд╛ рдорд┐рд▓рд╛рди рдХреИрд╕реЗ рдХрд░реЗрдВ

рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ

рдХрдард┐рдирд╛рдЗрдпрд╛рдБ рддрдм рдЖрддреА рд╣реИрдВ рдЬрдм рд╣рдо рдЧрдардмрдВрдзрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ JOIN рдЖрдкрд╕ рдореЗрдВ. рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдВрднрд╡ рд╣реИред
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдФрд░ рдХреНрд╡реЗрд░реА рдХрд╛ рдорд┐рд▓рд╛рди рдХреИрд╕реЗ рдХрд░реЗрдВ

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

рдФрд░ рдпреЛрдЬрдирд╛ рдХреА рджреГрд╖реНрдЯрд┐ рд╕реЗ рдпреЗ рдХреБрдЫ рдХреЗ рджреЛ рд╡рдВрд╢рдЬ рд╣реИрдВ * Loop/* Join-рдиреЛрдб. Nested Loop, Hash Anti Join,... - рдРрд╕рд╛ рдХреБрдЫред

рдЖрдЗрдП рд╕рд░рд▓ рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЯреЗрдмрд▓ рдП рдФрд░ рдмреА рд╣реИрдВ рдЬреЛ рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ "рдЬреБрдбрд╝рддреЗ" рд╣реИрдВ, рддреЛ рдЕрдиреБрд░реЛрдз рдореЗрдВ рд╡реЗ рдпрд╛ рддреЛ рд╕реНрдерд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ A-JOIN-Bрдпрд╛ B-JOIN-A. рдЖрдЗрдП рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдВрдпреЛрдЬрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдЖрдЗрдП рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрдпреЛрдЬрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдФрд░ рдЗрд╕реА рддрд░рд╣ рдЬрдм рддрдХ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдРрд╕реЗ рдЬреЛрдбрд╝реЗ рдЦрддреНрдо рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреЗред

рдЖрдЗрдП рдЕрдкрдирд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА рд▓реЗрдВ, рдЕрдкрдиреА рдпреЛрдЬрдирд╛ рд▓реЗрдВ, рдЙрдиреНрд╣реЗрдВ рджреЗрдЦреЗрдВ... рд╕рдорд╛рди рдирд╣реАрдВ!
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдФрд░ рдХреНрд╡реЗрд░реА рдХрд╛ рдорд┐рд▓рд╛рди рдХреИрд╕реЗ рдХрд░реЗрдВ

рдЖрдЗрдП рдЗрд╕реЗ рдЧреНрд░рд╛рдлрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдПрдВ - рдУрд╣, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ!
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдФрд░ рдХреНрд╡реЗрд░реА рдХрд╛ рдорд┐рд▓рд╛рди рдХреИрд╕реЗ рдХрд░реЗрдВ

рдЖрдЗрдП рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдРрд╕реЗ рдиреЛрдб рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдПрдХ рд╕рд╛рде рдмрдЪреНрдЪреЗ рдмреА рдФрд░ рд╕реА рд╣реИрдВ - рд╣рдореЗрдВ рдЗрд╕рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдХреНрд░рдо рдореЗрдВред рдЖрдЗрдП рдЙрдиреНрд╣реЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░реЗрдВ рдФрд░ рдиреЛрдб рдХреА рддрд╕реНрд╡реАрд░ рдХреЛ рдкрд▓рдЯ рджреЗрдВред
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдФрд░ рдХреНрд╡реЗрд░реА рдХрд╛ рдорд┐рд▓рд╛рди рдХреИрд╕реЗ рдХрд░реЗрдВ

рдЖрдЗрдП рдлрд┐рд░ рд╕реЗ рджреЗрдЦреЗрдВ. рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрдЪреНрдЪреЛрдВ рдП рдФрд░ рдЬреЛрдбрд╝реЗ (рдмреА + рд╕реА) рдХреЗ рд╕рд╛рде рдиреЛрдбреНрд╕ рд╣реИрдВ - рдЙрдирдХреЗ рд╕рд╛рде рднреА рд╕рдВрдЧрддред
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдФрд░ рдХреНрд╡реЗрд░реА рдХрд╛ рдорд┐рд▓рд╛рди рдХреИрд╕реЗ рдХрд░реЗрдВ

рдорд╣рд╛рди! рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╣рдо рдпреЗ рджреЛ рд╣реИрдВ JOIN рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рдЕрдиреБрд░реЛрдз рд╕реЗ рдиреЛрдбреНрд╕ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЕрдлрд╝рд╕реЛрд╕, рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣рдореЗрд╢рд╛ рд╣рд▓ рдирд╣реАрдВ рд╣реЛрддреАред
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдФрд░ рдХреНрд╡реЗрд░реА рдХрд╛ рдорд┐рд▓рд╛рди рдХреИрд╕реЗ рдХрд░реЗрдВ

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдХрд┐рд╕реА рдЕрдиреБрд░реЛрдз рдореЗрдВ A JOIN B JOIN C, рдФрд░ рдпреЛрдЬрдирд╛ рдореЗрдВ, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, "рдмрд╛рд╣рд░реА" рдиреЛрдб рдП рдФрд░ рд╕реА рдЬреБрдбрд╝реЗ рд╣реБрдП рдереЗред рд▓реЗрдХрд┐рди рдЕрдиреБрд░реЛрдз рдореЗрдВ рдРрд╕рд╛ рдХреЛрдИ рдСрдкрд░реЗрдЯрд░ рдирд╣реАрдВ рд╣реИ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ, рд╕рдВрдХреЗрдд рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред рдЬрдм рдЖрдк рд▓рд┐рдЦрддреЗ рд╣реИрдВ рддреЛ "рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо" рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рд╣реЛрддрд╛ рд╣реИ A, B.

рд▓реЗрдХрд┐рди, рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд▓рдЧрднрдЧ рд╕рднреА рдиреЛрдбреНрд╕ рдХреЛ "рдЕрдирдЯрд╛рдЗрдб" рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЖрдк рд╕рдордп рдкрд░ рдмрд╛рдИрдВ рдУрд░ рдЗрд╕ рддрд░рд╣ рдХреА рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ, Google Chrome рдХреА рддрд░рд╣ рдЬрдм рдЖрдк рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВред рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХрдерди рдХреЛ "рдирд┐рд╖реНрдкрд╛рджрд┐рдд" рд╣реЛрдиреЗ рдореЗрдВ рдХрд┐рддрдирд╛ рд╕рдордп рд▓рдЧрд╛ред
PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдФрд░ рдХреНрд╡реЗрд░реА рдХрд╛ рдорд┐рд▓рд╛рди рдХреИрд╕реЗ рдХрд░реЗрдВ

рдФрд░ рдЖрдкрдХреЗ рд▓рд┐рдП рдЗрди рд╕рдмрдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рднрдВрдбрд╛рд░рдг рдмрдирд╛рдпрд╛ рд╣реИ рд╕рдВрдЧреНрд░рд╣, рдЬрд╣рд╛рдВ рдЖрдк рд╕рд╣реЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмрд╛рдж рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рдпреЛрдЬрдирд╛рдПрдВ рдвреВрдВрдв рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдХрд┐рд╕реА рдХреЗ рд╕рд╛рде рд▓рд┐рдВрдХ рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрджрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдЕрдкрдардиреАрдп рдкреНрд░рд╢реНрди рдХреЛ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рдореЗрдВ рд▓рд╛рдирд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рд╣рдорд╛рд░рд╛ "рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдгрдХрд░реНрддрд╛".

PostgreSQL рдХреНрд╡реЗрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд░: рдпреЛрдЬрдирд╛ рдФрд░ рдХреНрд╡реЗрд░реА рдХрд╛ рдорд┐рд▓рд╛рди рдХреИрд╕реЗ рдХрд░реЗрдВ

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ