PostgreSQL Antipatterns: Sisyphus JOIN Arrays

рдХрднреА-рдХрднреА рдПрдХ рдХрд╛рд░реНрдп SQL рдХреНрд╡реЗрд░реА рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рд░реИрдЦрд┐рдХ рд╕рд░рдгрд┐рдпреЛрдВ рд╕реЗ рд╕рдорд╛рди рдбреЗрдЯрд╛ "рдХреЙрд▓рдо рдореЗрдВ" рдХреЗ рд╕рд╛рде рдПрдХ рдЕрднрд┐рдиреНрди рдЪрдпрди "рдЧреЛрдВрдж" рдХреЗ рд▓рд┐рдП рдЙрдарддрд╛ рд╣реИред

рдпрд╣ рдХрднреА-рдХрднреА рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

WITH T1 AS ( SELECT row_number() OVER() rn , unnest v1 FROM unnest('{1,2,3,4}'::integer[]) ) , T2 AS ( SELECT row_number() OVER() rn , unnest v2 FROM unnest('{5,6}'::integer[]) ) SELECT T1.v1 , T2.v2 FROM T1 LEFT JOIN T2 USING(rn); 

 v1 | v2 ------- 1 | 5 2 | 6 3 | 4 | 

рдпрд╣реА рд╣реИ, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкреНрд░рддреНрдпреЗрдХ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдирдореВрдиреЗ рдореЗрдВ "рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд" рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЧрд┐рдиреЗ рдЧрдП, рдФрд░ рдлрд┐рд░ рдЗрд╕ рдирдВрдмрд░ рдХреЛ рд╕реАрдЯреАрдИрдЯреА рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ...


[рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдкрд░ рджреЗрдЦреЗрдВ редensor.ru]

рдЖрджреЗрд╢ рдХреЗ рд╕рд╛рде


рд╕рднреА рд╕рдордп рдХрд╛ рдПрдХ рдЪреМрдерд╛рдИ рд╕реЗ рдЕрдзрд┐рдХ WindowAgg рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдкрд░ рдЦрд░реНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛!

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо PG рдХреЗ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ 9.4 рд╕реЗ рдХрдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо ORDINALITY рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА SRF рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдмреЗрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ :

 WITH T1 AS ( SELECT * FROM unnest('{1,2,3,4}'::integer[]) WITH ORDINALITY T(v1, rn) ) , T2 AS ( SELECT * FROM unnest('{5,6}'::integer[]) WITH ORDINALITY T(v2, rn) ) SELECT T1.v1 , T2.v2 FROM T1 LEFT JOIN T2 USING(rn); 

[Expl.t.toror.ru рдкрд░ рджреЗрдЦреЗрдВ] ред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ рд╡рд┐рдВрдбреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд▓рд┐рдпрд╛ред

рдмрд╣реБ-рддрд░реНрдХ UNNEST


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

рдФрд░ рд▓реЗрдЦрдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕ рдзрд╛рд░рдгрд╛ рд╕реЗ рдЖрдЧреЗ рдмрдврд╝реЗ рдХрд┐ рдкрд╣рд▓рд╛ рд╕рд░рдгреА рдмрд┐рд▓реНрдХреБрд▓ рд▓рдВрдмрд╛ рд╣реИ - рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ LEFT JOIN рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдзрд╛рд░рдгрд╛ рд╣рдореЗрд╢рд╛ рд╕рд╣реА рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╕рдорд╕реНрдпрд╛ рдкреИрджрд╛ рдХрд░ рд╕рдХрддреА рд╣реИред

рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрдИ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдПрдХ рд╣реА рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ 9.4:

 SELECT * FROM unnest( '{1,2,3,4}'::integer[] , '{5,6}'::integer[] ) T(v1, v2); 

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд▓рдЧрднрдЧ рдХреБрдЫ рднреА рдЕрдиреБрд░реЛрдз рдХрд╛ рдирд╣реАрдВ рд░рд╣рд╛, рдФрд░ рдпреЛрдЬрдирд╛ рдХрд╛:

 Function Scan on t (cost=0.01..1.00 rows=100 width=8) (actual time=0.006..0.007 rows=4 loops=1) 

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

Source: https://habr.com/ru/post/hi479920/


All Articles