рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ, рдХрд┐рд╕реА рдХреЛ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ рдЬрдм рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдЕрдиреБрд░реЛрдз рд▓рд┐рдЦрддрд╛ рд╣реИ рдФрд░ рд╕реЛрдЪрддрд╛ рд╣реИ рдХрд┐ "
рдЖрдзрд╛рд░ рд╕реНрдорд╛рд░реНрдЯ рд╣реИ, рдпрд╣ рд╕рдм рдХреБрдЫ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ! "
рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ (рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреНрд╖рдорддрд╛рдУрдВ рдХреА рдЕрдЬреНрдЮрд╛рдирддрд╛ рд╕реЗ, рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рдЕрдиреБрдХреВрд▓рди рд╕реЗ), рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг "рдлреНрд░реЗрдВрдХрд╕реНрдЯреАрди" рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред
рдкрд╣рд▓реЗ рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛:
рдЕрдиреБрд░реЛрдз рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдХрд╛ рдирд┐рд╖реНрдкрдХреНрд╖ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдХреБрдЫ рдордирдорд╛рдирд╛ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдмрдирд╛рдПрдВ:
CREATE TABLE tbl AS SELECT (random() * 1000)::integer key_a , (random() * 1000)::integer key_b , (random() * 10000)::integer fld1 , (random() * 10000)::integer fld2 FROM generate_series(1, 10000); CREATE INDEX ON tbl(key_a, key_b);
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐
рдбреЗрдЯрд╛ рдХреЛ рдкрдврд╝рдирд╛ рдХреБрд▓ рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрди
рд╕рдордп рдХреЗ рдПрдХ рдЪреМрдерд╛рдИ рд╕реЗ рднреА рдХрдо рд╕рдордп рдореЗрдВ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ :
[рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдкрд░ рджреЗрдЦреЗрдВ редensor.ru]рд╣рдбреНрдбрд┐рдпреЛрдВ рд╕реЗ рдЬреБрджрд╛
рд╣рдо рдЕрдиреБрд░реЛрдз рдХреЛ рдХрд░реАрдм рд╕реЗ рджреЗрдЦреЗрдВрдЧреЗ, рдФрд░ рд╣рдо рд╣реИрд░рд╛рди рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ:
- рдпрд╣рд╛рдБ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЗ рд╕рд╛рде рдХреНрдпреЛрдВ рд╣реИ, рдЕрдЧрд░ рдХреЛрдИ рдкреБрдирд░рд╛рд╡рд░реНрддреА CTE рдирд╣реАрдВ рд╣реИрдВ?
- рдПрдХ рдЕрд▓рдЧ рд╕реАрдЯреАрдИ рдореЗрдВ рд╕рдореВрд╣ рдорд┐рдирдЯ / рдЕрдзрд┐рдХрддрдо рдорд╛рди рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рд╡реЗ рдЕрднреА рднреА рдореВрд▓ рдирдореВрдиреЗ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ?
+ 25% рд╕рдордп - рдЕрдВрдд рдореЗрдВ рдмрд┐рдирд╛ рд╢рд░реНрдд 'рд╕реЗрд▓реЗрдХреНрдЯ * FROM' рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд┐рдЫрд▓реЗ CTE рд╕реЗ рд░реА-рд░реАрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░реЗрдВ?
+ 14% рд╕рдордп
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдмрд╣реБрдд рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рдереЗ рдХрд┐ рд╣реИрд╢ рдЬреЙрдЗрди рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдиреЗрд╕реНрдЯреЗрдб рд▓реВрдк рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рддрдм рд╣рдореЗрдВ рдПрдХ рднреА рд╕реАрдЯреАрдИ рд╕реНрдХреИрди рдкрд╛рд╕ рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛, рд▓реЗрдХрд┐рди 10K!
рд╕реАрдЯреАрдИ рд╕реНрдХреИрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕реАрдЯреАрдИ рд╕реНрдХреИрди рд╕реАрдХ рд╕реНрдХреИрди рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИ - рдЕрд░реНрдерд╛рдд, рдХреЛрдИ рдЕрдиреБрдХреНрд░рдордг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рд╕рдВрдкреВрд░реНрдг рдЦреЛрдЬ рд╣реИ, рдЬрд┐рд╕реЗ cte_mind рдЪрдХреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП 10K x 0.3ms = 3000ms рдпрд╛ cK_bind рдЪрдХреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП 1500ms / 1K x 1.5ms / 1500ms рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА !
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдк рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ?
рд╣рд╛рдБ, рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╕рд╡рд╛рд▓ рд╣реИ рдХрд┐ рд╡рд╣ "рддреАрди-рдХрд╣рд╛рдиреА" рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ 5 рд╡реЗрдВ рдорд┐рдирдЯ рдореЗрдВ рдХрд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИредрд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдЕрджреНрд╡рд┐рддреАрдп рдХреБрдВрдЬреА рдЬреЛрдбрд╝реА рдХреЗ рд▓рд┐рдП
рд╕рдореВрд╣ рд╕реЗ key / a рд╕реЗ рдорд┐рдирдЯ / рдЕрдзрд┐рдХрддрдо рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред
рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП
рд╡рд┐рдВрдбреЛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
SELECT DISTINCT ON(key_a, key_b) key_a a , key_b b , max(fld1) OVER(w) bind_fld1 , min(fld2) OVER(w) bind_fld2 FROM tbl WINDOW w AS (PARTITION BY key_a);
[рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдкрд░ рджреЗрдЦреЗрдВ редensor.ru]рдЪреВрдВрдХрд┐ рджреЛрдиреЛрдВ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рдореЗрдВ рд▓рдЧрднрдЧ 4-5ms рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд▓рдЧрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░рд╛
-32% рдХрд╛ рд╕рдВрдкреВрд░реНрдг рд▓рд╛рдн рд╢реБрджреНрдз
рд╕реАрдкреАрдпреВ рдмреЗрд╕ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рдЕрдЧрд░ рдРрд╕рд╛ рдЕрдиреБрд░реЛрдз рдЕрдХреНрд╕рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЖрдкрдХреЛ рдЖрдзрд╛рд░ рдХреЛ "рд░рд╛рдЙрдВрдб - рд╡рд┐рдпрд░, рд╕реНрдХреНрд╡рд╛рдпрд░ - рд░реЛрд▓" рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред