рдЫрд┐рдкрд╛рдиреЗ рдФрд░ рдЕрдиреБрдХреВрд▓рдХ рдХреЗ рд╕рд╛рде рдХреА рддрд▓рд╛рд╢ред рдЧреЗрдо рдУрд╡рд░, рдпрд╣ CTE PostgreSQL 12 рд╣реИ



рдпрд╣ рд▓реЗрдЦ PostgreSQL 12. рдореЗрдВ рдирдП рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣рд╛рдиреА рдХрд╛ рдПрдХ рд╕рд┐рд▓рд╕рд┐рд▓рд╛ рд╣реИред рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рд▓реЗрдЦ рдореЗрдВ SQL / JSON (JSONPath рдкреИрдЪ) рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рдерд╛ "рд╡реЗ рдлреАрдЪрд░ рдлреНрд░реАрдЬ 2019 рдкрд░ рдЬрдо рдЧрдП рдереЗред рднрд╛рдЧ I JSONPath" , рдЕрдм CTE рдХреА рдмрд╛рд░реА рд╣реИред

CTE


CTE рдХреЙрдорди рдЯреЗрдмрд▓ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд╣реИ - рдХреЙрдорди рдЯреЗрдмрд▓ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди, рдЗрдиреНрд╣реЗрдВ рдХрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рдХреЗ рд╕рд╛рде рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ рдХреНрд╡реЗрд░реА рдХреЗ рд▓рд┐рдП рдореМрдЬреВрдж рд╣реИ, рдФрд░ рд╕рддреНрд░ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрдВрджрд░ рдкрд╣реБрдБрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдЕрдиреБрд░реЛрдз рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрдврд╝рд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдпрд╣ рдПрдХ рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рдЪреАрдЬ рд╣реИ, рдФрд░ рдпрд╣ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ PostgreSQL рдореЗрдВ рд╣реИред

рд▓реЗрдХрд┐рди рд╕реБрд╡рд┐рдзрд╛рдПрдВ рдорд╣рдВрдЧреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдЕрдВрджрд░ рдХреЗ рдмрд╛рдж рдХреЗ рд░реВрдк рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рднреМрддрд┐рдХрдХрд░рдг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ ... рдПрдПрд╕ () рдирд┐рд░реНрдорд╛рдгред рдЗрд╕реЗ рдПрдХ рдЖрдВрддрд░рд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдмрд╛рдХреА рдХреА рдЧрдгрдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ; рдЗрд╕реЗ рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рдХреНрд╡реЗрд░реА (рдХреЛрдИ рдЗрдирд▓рд╛рдЗрдирд┐рдВрдЧ) рдореЗрдВ рдПрдореНрдмреЗрдб рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдпреЛрдЬрдирд╛ рдмрд╛рдХреА рдХреНрд╡реЗрд░реА рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрддреА рд╣реИред рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЕрдиреБрдХреВрд▓рди, рдпрд╛ рдмрд╛рдбрд╝ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рдзрд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рднреМрддрд┐рдХрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ work_mem рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдФрд░ рдЕрдЧрд░ рдирдореВрдирд╛ рдмрдбрд╝рд╛ рд╣реИ, рддреЛ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреАрдЬреАрдХреЛрдирдл 2019 рдореЗрдВ рдЗрд╡рд╛рди рдлреНрд░реЛрд▓рдХреЛрд╡ рдХреА рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ рд╣реИ )ред

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

рд╣рдо рдРрд╕реА рдкреНрд▓реЗрдЯ рдкрд░ рд╕реАрдЯреАрдИ рдХреЗ рдХрд╛рдо рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░реЗрдВрдЧреЗ:

CREATE TABLE xytable AS SELECT x, x AS y FROM generate_series(1,10000000) AS x; CREATE INDEX ON xytable(x,y); 

 Table "public.xytable" Column | Type | Collation | Nullable | Default --------------+---------+------------------+----------------+--------- x | integer | | | y | integer | | | Indexes: "xytable_x_y_idx" btree (x, y) 

рдЪрд▓реЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:

 SELECT * FROM xytable WHERE x=2 AND y>1; QUERY PLAN ----------------------------------------------------------------------------- Index Only Scan using xytable_x_y_idx on xytable (cost=0.43..8.46 rows=1 width=8) (actual time=0.016..0.017 rows=1 loops=1) Index Cond: ((x = 2) AND (y > 1)) Heap Fetches: 1 Planning Time: 0.075 ms Execution Time: 0.035 ms (5 rows) 

рд╕рдм рдХреБрдЫ рддреБрд░рдиреНрдд рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдПрдХ рдЙрдкрд╢рдо рдХреЗ рд╕рд╛рде рдПрдХ рдХреНрд╡реЗрд░реА рдЬреЛ рд╕рдорд╛рди рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓:

 SELECT * FROM (SELECT * FROM xytable WHERE y>1) AS t WHERE x=2; QUERY PLAN --------------------------------------------------------------------------------- Index Only Scan using xytable_x_y_idx on xytable (cost=0.43..8.46 rows=1 width=8) (actual time=0.016..0.016 rows=1 loops=1) Index Cond: ((x = 2) AND (y > 1)) Heap Fetches: 1 Planning Time: 0.062 ms Execution Time: 0.029 ms (5 rows) 

рд╕рдм рдХреБрдЫ рдХреНрд░рдо рдореЗрдВ рд╣реИ, рдмрд╣реБрдд рддреЗрдЬ рд╕реВрдЪрдХрд╛рдВрдХ рдЧрдгрдирд╛ред

рдФрд░ рдЕрдм рдПрдХ рдФрд░ рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ рд╕рдордХрдХреНрд╖ рдЕрдиреБрд░реЛрдз, рд▓реЗрдХрд┐рди CTE рдХреЗ рд╕рд╛рде:

 WITH yy AS ( SELECT * FROM xytable WHERE y>1) SELECT * FROM yy WHERE x=2; QUERY PLAN ------------------------------------------ CTE Scan on yy (actual time=0.099..3672.842 rows=1 loops=1) Filter: (x = 2) Rows Removed by Filter: 9999998 CTE yy -> Seq Scan on cte (actual time=0.097..1355.367 rows=9999999 loops=1) Filter: (y > 1) Rows Removed by Filter: 1 Planning Time: 0.088 ms Execution Time: 3735.986 ms (9 rows) 

рдЗрд╕ рддрд░рд╣ рдХреА рджреЗрд░реА рдирдЧреНрди рдЖрдВрдЦреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реА рд╣реИред рдЖрдкрдиреЗ рдХреЙрдлреА рдирд╣реАрдВ рдкреА рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд▓ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рдордп рд╣реИ (рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 11 рд╡рд╛рдВ рд╕рдВрд╕реНрдХрд░рдг рдпрд╛ рдЙрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛ рд╕рдордп рд╣реИ)ред

рдФрд░ рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реБрдЖ: рдЙрдкрд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдиреЗ рддреБрд░рдВрдд рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рд╢рд░реНрддреЛрдВ x = 2 рдФрд░ y> 1 рдХреЛ рдПрдХ рдлрд┐рд▓реНрдЯрд░ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред CTE рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХреЗ рдкрд╛рд╕ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ: рдЙрд╕реЗ рдкрд╣рд▓реЗ рдЕрдВрджрд░ рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рд╣реЛрдЧрд╛ ... AS рдирд┐рд░реНрдорд╛рдг, рдкрд░рд┐рдгрд╛рдо рдХреЛ рднреМрддрд┐рдХ рдмрдирд╛рдирд╛, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдФрд░ рдпрд╣рд╛рдБ рдмрд┐рдВрджреБ рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рднреМрддрд┐рдХреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА: рдпрджрд┐ рд╢рд░реНрдд y <3 рд╣реИ, рддреЛ рд▓рд╛рдЦреЛрдВ рд░рд┐рдХреЙрд░реНрдбреЛрдВ рдХреЛ рднреМрддрд┐рдХ рдирд╣реАрдВ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ 2. рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХреНрд╡реЗрд░реА рдХреЗ рд▓рд┐рдП рд░рд╛рдХреНрд╖рд╕реА рд╕рдордп рдЕрдиреБрдХреНрд░рдорд┐рдХ рдЦреЛрдЬ рдкрд░ рдЦрд░реНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдЦреЛрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рддрд╛рдХрд┐ рдХрдВрдкреЛрдЬрд┐рдЯ рдЗрдВрдбреЗрдХреНрд╕ x рдкрд░ рдмрдирд╛ рд╣реЛ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА y рдкрд░ рд╣реЛ, рдФрд░ рд╡рд╣ рд╢рд░реНрдд x = 2 рдХреЗ рд╕рд╛рде рдХреНрд╡реЗрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдЬрдм рддрдХ рдХрд┐ рд╡рд╣ рдЖрдВрддрд░рд┐рдХ CTE рд╢рд░реНрдд рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ред рдпрд╣ рдмрд╛рдзрд╛ рд╕реЗ рдкрд░реЗ рд╣реИред

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

 WITH yy AS ( SELECT * FROM xytable WHERE y>1) SELECT * FROM yy WHERE x=2; 

 QUERY PLAN ------------------------------------------ Index Only Scan using xytable_x_y_idx1 on xytable (cost=0.43..8.46 rows=1 width=8) (actual time=0.015..0.016 rows=1 loops=1) Index Cond: ((x = 2) AND (y > 1)) Heap Fetches: 1 Planning Time: 0.067 ms Execution Time: 0.029 ms (5 rows) 

рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдиреЗ рддреБрд░рдВрдд рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдЗрд╖реНрдЯрддрдо рдХреНрд░рдо рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рд╕реАрдЦрд╛ - рдЬреИрд╕рд╛ рдХрд┐ рдЙрдкрд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдерд╛ред

рд▓реЗрдХрд┐рди рдЪреВрдХ рдЪреВрдХ рд╣реИрдВ, рдФрд░ рдЕрдм рд╕реНрдерд┐рддрд┐ рдХреЗ рдкреВрд░реНрдг рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП, рд╕рдВрд╕реНрдХрд░рдг 12 рдореЗрдВ рд╕реАрдЯреАрдИ рдХрд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд, рдирд┐рдпрдВрддреНрд░рд┐рдд рднреМрддрд┐рдХрдХрд░рдг рд╣реИ:

 WITH cte_name AS [NOT] MATERIALIZED 

рдЖрдЗрдП рдЕрдорд▓ рдХрд░реЗрдВ:

 EXPLAIN ANALYZE WITH yy AS MATERIALIZED ( SELECT * FROM xytable WHERE y>1) SELECT * FROM yy WHERE x=2; 

 QUERY PLAN --------------------------- CTE Scan on yy (cost=356423.68..581401.19 rows=49995 width=8) (actual time=661.038..3603.292 rows=1 loops=1) Filter: (x = 2) Rows Removed by Filter: 9999998 CTE yy -> Bitmap Heap Scan on cte (cost=187188.18..356423.68 rows=9999000 width=8) (actual time=661.032..2102.040 rows=9999999 loops=1) Recheck Cond: (y > 1) Heap Blocks: exact=44248 -> Bitmap Index Scan on xytable_x_y_idx1 (cost=0.00..184688.43 rows=9999000 width=0) (actual time=655.519..655.519 rows=9999999 loops=1) Index Cond: (y > 1) Planning Time: 0.086 ms Execution Time: 3612.840 ms (11 rows) 

рд╕рдм рдХреБрдЫ 11 рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдкрд╣рд▓реЗ, рдЖрдк рдХреНрд╡реЗрд░реА рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕реНрдЯреИрдВрдбрдмрд╛рдп рдореЛрдб рдореЗрдВ рдореЗрд▓ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдирд┐рд╖реЗрдЪрди рдХреЛ рд░реЛрдХрддреЗ рд╣реИрдВ, рдЕрд╡рд░реЛрдз рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ:

 EXPLAIN ANALYZE WITH yy AS NOT MATERIALIZED ( SELECT * FROM xytable WHERE y>1) SELECT * FROM yy WHERE x=2; QUERY PLAN --------------------------- Index Only Scan using xytable_x_y_idx1 on xytable (cost=0.43..8.46 rows=1 width=8) (actual time=0.070..0.072 rows=1 loops=1) Index Cond: ((x = 2) AND (y > 1)) Heap Fetches: 1 Planning Time: 0.182 ms Execution Time: 0.108 ms (5 rows) 

рдлрд┐рд░ рд╕реЗ, рдХреЛрдИ рд░рд╛рд╣рдд рдирд╣реАрдВ: рдпрд╣ рддреБрд░рдВрдд рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИред
рдХреА рдмрд╛рд░реАрдХрд┐рдпрд╛рдВ рдмрддрд╛рдИред рд▓реЗрдХрд┐рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рд░реАрдХрд┐рдпреЛрдВред

рдпрджрд┐ рдпрд╣ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ CTE рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рднреМрддрд┐рдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред


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

рд╣рдо рджреЛрд╣рд░реЗ рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрдиреБрд░реЛрдз рдХреЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

 WITH yy AS ( SELECT * FROM xytable WHERE y > 1) SELECT ( SELECT count(*) FROM yy WHERE x=2), ( SELECT count(*) FROM yy WHERE x=2); 

 QUERY PLAN --------------------------------------------------------------------------- Result (actual time=3922.274..3922.275 rows=1 loops=1) CTE yy -> Seq Scan on xytable (actual time=0.023..1295.262 rows=9999999 loops=1) Filter: (y > 1) Rows Removed by Filter: 1 InitPlan 2 (returns $1) -> Aggregate (actual time=3109.687..3109.687 rows=1 loops=1) -> CTE Scan on yy (actual time=0.027..3109.682 rows=1 loops=1) Filter: (x = 2) Rows Removed by Filter: 9999998 InitPlan 3 (returns $2) -> Aggregate (actual time=812.580..812.580 rows=1 loops=1) -> CTE Scan on yy yy_1 (actual time=0.016..812.575 rows=1 loops=1) Filter: (x = 2) Rows Removed by Filter: 9999998 Planning Time: 0.136 ms Execution Time: 3939.848 ms (17 rows) 

рдФрд░ рдЕрдм рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рднреМрддрд┐рдХрдХрд░рдг рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рд┐рдЦреЗрдВрдЧреЗ:

 WITH yy AS NOT MATERIALIZED ( SELECT * FROM xytable WHERE y > 1) SELECT ( SELECT count(*) FROM yy WHERE x=2), ( SELECT count(*) FROM yy WHERE x=2); 

 QUERY PLAN --------------------------------------------------------------------------- Result (actual time=0.035..0.035 rows=1 loops=1) InitPlan 1 (returns $0) -> Aggregate (actual time=0.024..0.024 rows=1 loops=1) -> Index Only Scan using xytable_x_y_idx on xytable (actual time=0.019..0.020 rows=1 loops=1) Index Cond: ((x = 2) AND (y > 1)) Heap Fetches: 1 InitPlan 2 (returns $1) -> Aggregate (actual time=0.006..0.006 rows=1 loops=1) -> Index Only Scan using xytable_x_y_idx on xytable cte_1 (actual time=0.004..0.005 rows=1 loops=1) Index Cond: ((x = 2) AND (y > 1)) Heap Fetches: 1 Planning Time: 0.253 ms Execution Time: 0.075 ms (13 rows) 

рд░рд╛рдЗрдЯрд┐рдВрдЧ рд╕реАрдЯреАрдИ рдХреЛ рд╣рдореЗрд╢рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕реАрдЯреАрдИ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдпрд╣ рдпреЛрдЬрдирд╛ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реИ: not_executed рдЗрд╕рдореЗрдВ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдЪ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдпрд╛рдж рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ (рдирд╣реАрдВ) MATERIALIZED рдирд┐рд░реНрдорд╛рдг рд╕рдВрд╕реНрдХрд░рдг 12 рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рд╣реИред

 EXPLAIN (COSTS OFF) WITH yy AS ( SELECT * FROM xytable WHERE y > 1), not_executed AS ( SELECT * FROM xytable), always_executed AS ( INSERT INTO xytable VALUES(2,2) RETURNING *) SELECT FROM yy WHERE x=2; 

 QUERY PLAN ----------------------------- CTE Scan on yy Filter: (x = 2) CTE yy -> Seq Scan on cte Filter: (y > 1) CTE always_executed -> Insert on cte cte_1 -> Result (5 rows) 

рдФрд░ рдПрдХ рдФрд░ рдирд┐рдпрдо:

рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рдХреЗ рд╕рд╛рде рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреНрд░рд╢реНрдиред


рдпрд╣ рд╣рдореЗрд╢рд╛ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдирд╣реАрдВред рдпрджрд┐ рд╣рдо рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХрд╛ рдЖрджреЗрд╢ рджреЗрддреЗ рд╣реИрдВ: рдЬрд░реВрд░реА рдирд╣реАрдВ, рддреЛ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрдЧреА, рдФрд░ рднреМрддрд┐рдХрдХрд░рдг рдЕрднреА рднреА рд╣реЛрдЧрд╛ред рдпрд╣ рдПрдХ рд╕рдореБрджрд╛рдп-рд╕рдЪреЗрдд рдирд┐рд░реНрдгрдп рд╣реИред

рд╣рдо рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╣реЛрдорд╡рд░реНрдХ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред рдЖрдЬ рдХреЗ рд▓рд┐рдП рдмрд╕ рдЗрддрдирд╛ рд╣реАред

рд╕реАрдЯреАрдИ рдореЗрдВ рдирдП рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд╕рдореАрдХреНрд╖рд╛ рдХрд╛ рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛ "рдПрдЯреНрд░реЛрдбреНрд╕ рдореЗрдВ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ 12" рд░рд┐рдкреЛрд░реНрдЯ рд╕реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдФрд░ рдЯреБрдХрдбрд╝реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдУрд▓реЗрдЧ рдмрд╛рд░реНрдЯреБрдиреЛрд╡ рдиреЗ рд╕реЗрдВрдЯ рдкреАрдЯрд░реНрд╕рдмрд░реНрдЧ рдореЗрдВ рд╕реЗрдВрдЯ рд╣рд╛рдИрд▓реЛрдб рд▓реЛрдб ++ рдореЗрдВ рдЗрд╕ рд╕рд╛рд▓ 9 рдЕрдкреНрд░реИрд▓ рдХреЛ рдкрдврд╝рд╛ рдерд╛ред

рдЕрдЧрд▓реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ - рдХреЗрдПрдирдПрди ред

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


All Articles