рдХреНрд╡реЗрд░реА рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рдиред PostgreSQL рдореЗрдВ рдореВрд▓ рдмрд╛рддреЗрдВ (рднрд╛рдЧ 3)


рдореИрдВ рдЧрд┐рд▓рд┐рдпреВрдо рд▓реЗрд▓рд╛рд░реНрдЬ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд┐рдд рд╕рдордЭ рдХрд╛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕рдВрд╢реЛрдзрди рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реВрдВред
рдПрдХ рдмрд╛рд░ рдлрд┐рд░, рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝реА рдЧрдИ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдореВрд▓ рдкрдврд╝реЗрдВред
рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ:

рднрд╛рдЧ 1
рднрд╛рдЧ реи

рдЖрджреЗрд╢ рджреНрд╡рд╛рд░рд╛


DROP INDEX foo_c1_idx; EXPLAIN (ANALYZE) SELECT * FROM foo ORDER BY c1; 

рдЬрд▓реНрджреА рдпреЛрдЬрдирд╛
- рд╕реЙрд░реНрдЯ (рд▓рд╛рдЧрдд = 117993.01..120493.04 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 1000010 рдЪреМрдбрд╝рд╛рдИ = 37) (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 571.591..651.524 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 1000010 рд▓реВрдк = 1)
рдХреНрд░рдордмрджреНрдз рдХреБрдВрдЬреА: c1
рд╕реЙрд░реНрдЯ рд╡рд┐рдзрд┐: рдмрд╛рд╣рд░реА рдорд░реНрдЬ рдбрд┐рд╕реНрдХ: 45952kB
-> рдлреВ (рд▓рд╛рдЧрдд = 0.00..18334.10 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 1000010 рдЪреМрдбрд╝рд╛рдИ = 37) рдкрд░ рд╕реАрдХ рд╕реНрдХреИрди (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 0.007..62.041 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 1000010 рд▓реВрдк = 1)
рдХреБрд▓ рд░рдирдЯрд╛рдЗрдо: 690.984 рдПрдордПрд╕
(5 рдкрдВрдХреНрддрд┐рдпрд╛рдБ)

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, Seq Scan рдЯреЗрдмрд▓ foo рдЙрддреНрдкрд╛рджрди рдХрд┐рдпрд╛ foo рд╣реИред рдлрд┐рд░ рд╕реЙрд░реНрдЯ Sort ред EXPLAIN рдХрдорд╛рдВрдб рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ, рд╕рд╛рдЗрди -> рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдо ( рдиреЛрдб ) рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдкрд╣рд▓реЗ рдХреА рдЧрдИ рдХреНрд░рд┐рдпрд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдЙрддрдиреА рд╣реА рдЕрдзрд┐рдХ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред
Sort Key - рд╕реЙрд░реНрдЯрд┐рдВрдЧ рд╕реНрдерд┐рддрд┐ред
Sort Method: external merge Disk - рд╕реЙрд░реНрдЯ рдХрд░рддреЗ рд╕рдордп, 45952kB рдХреЗ рдбрд┐рд╕реНрдХ рд╡реЙрд▓реНрдпреВрдо рдкрд░ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓ 45952kB ред

рдореИрдВ рдЙрди рд▓реЛрдЧреЛрдВ рд╕реЗ рдкреВрдЫрддрд╛ рд╣реВрдВ рдЬреЛ external merge рдФрд░ external sort рдмреАрдЪ рдХреЗ рдЕрдВрддрд░ рдХреЛ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╖рдп рдХреЛ рд╕рдордЭрддреЗ рд╣реИрдВ ред

BUFFERS рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдЬрд╛рдВрдЪреЗрдВ:
 EXPLAIN (ANALYZE,BUFFERS) SELECT * FROM foo ORDER BY c1; 

рдЬрд▓реНрджреА рдпреЛрдЬрдирд╛
- рдХреНрд░рдордмрджреНрдз (рд▓рд╛рдЧрдд = 117993.01..120493.04 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 1000010 рдЪреМрдбрд╝рд╛рдИ = 37) (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 568.412..652.308 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 1000010 рд▓реВрдк = 1)
рдХреНрд░рдордмрджреНрдз рдХреБрдВрдЬреА: c1
рд╕реЙрд░реНрдЯ рд╡рд┐рдзрд┐: рдмрд╛рд╣рд░реА рдорд░реНрдЬ рдбрд┐рд╕реНрдХ: 45952kB
рдмрдлрд╝рд░реНрд╕: рд╕рд╛рдЭрд╛ рд╣рд┐рдЯ = 8334, рдЕрд╕реНрдерд╛рдпреА рдкрдврд╝рд╛ = 5745 рд▓рд┐рдЦрд╛ = 5745
-> foo рдкрд░ Seq рд╕реНрдХреИрди (рд▓рд╛рдЧрдд = 0.00..18334.10 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 1000010 рдЪреМрдбрд╝рд╛рдИ = 37) (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 0.010..68.203 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 1000010 рд▓реВрдк = 1)
рдмрдлрд╝рд░реНрд╕: рд╕рд╛рдЭрд╛ рд╣рд┐рдЯ = 8334
рдХреБрд▓ рд░рдирдЯрд╛рдЗрдо: 698.032 рдПрдордПрд╕
(7 рдкрдВрдХреНрддрд┐рдпрд╛рдБ)

рджрд░рдЕрд╕рд▓, temp read=5745 written=5745 - 5745 8Kb = 45960Kb рдХреЗ рдмреНрд▓реЙрдХ рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдФрд░ рдкрдврд╝реЗ рдЧрдПред рдХреИрд╢ рдореЗрдВ 8334 рдмреНрд▓реЙрдХ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдореЗрдореЛрд░реА рд╕рд┐рд╕реНрдЯрдо рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдСрдкрд░реЗрд╢рди рдзреАрдорд╛ рд╣реИред
рдЖрдЗрдП work_mem рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдореЗрдореЛрд░реА рдХреА рдорд╛рддреНрд░рд╛ рдмрдврд╝рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ:
 SET work_mem TO '200MB'; EXPLAIN (ANALYZE) SELECT * FROM foo ORDER BY c1; 

рдЬрд▓реНрджреА рдпреЛрдЬрдирд╛
- рдХреНрд░рдордмрджреНрдз (рд▓рд╛рдЧрдд = 117993.01..120493.04 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 1000010 рдЪреМрдбрд╝рд╛рдИ = 37) (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 265.301..296.777 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 1000010 рд▓реВрдк = 1)
рдХреНрд░рдордмрджреНрдз рдХреБрдВрдЬреА: c1
рд╕реЙрд░реНрдЯ рд╡рд┐рдзрд┐: quicksort рдореЗрдореЛрд░реА: 102702kB
-> рдлреВ рдкрд░ рд╕реНрдХреИрди (рд▓рд╛рдЧрдд = 0.00..18334.10 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 1000010 рдЪреМрдбрд╝рд╛рдИ = 37) (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 0.006..57.836 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 1000010 рд▓реВрдк = 1)
рдХреБрд▓ рд░рдирдЯрд╛рдЗрдо: 328.746 рдПрдордПрд╕
(5 рдкрдВрдХреНрддрд┐рдпрд╛рдБ)

Sort Method: quicksort Memory: 102702kB - рдкреВрд░реА рдЫрдВрдЯрдиреА рд░реИрдо рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИред

рдЬрд╝рд┐рдк рдХреЛрдб:
 CREATE INDEX ON foo(c1); EXPLAIN (ANALYZE) SELECT * FROM foo ORDER BY c1; 

рдЬрд▓реНрджреА рдпреЛрдЬрдирд╛
- foo_c1_idx рдХрд╛ foo (рд▓рд╛рдЧрдд = 0.42..34327.57 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 1000010 рдЪреМрдбрд╝рд╛рдИ = 37) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реНрдХреИрди (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 0.023..126.076 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 1000010 рдЫреЛрд░реЛрдВ = 1)
рдХреБрд▓ рд░рдирдЯрд╛рдЗрдо: 153.452 рдПрдордПрд╕
(2 рдкрдВрдХреНрддрд┐рдпрд╛рдБ)

рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ, рдХреЗрд╡рд▓ Index Scan рд╣реА рд░рд╣рддрд╛ рд╣реИ, рдЬрд┐рд╕рдиреЗ рдХреНрд╡реЗрд░реА рдХреА рдЧрддрд┐ рдХреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рд╣реИред

рдЖрдк LIMIT


рдкрд╣рд▓реЗ рдмрдирд╛рдП рдЧрдП рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рдбрд┐рд▓реАрдЯ рдХрд░реЗрдВред
 DROP INDEX foo_c2_idx1; EXPLAIN (ANALYZE,BUFFERS) SELECT * FROM foo WHERE c2 LIKE 'ab%'; 

рдЬрд▓реНрджреА рдпреЛрдЬрдирд╛
- foo рдкрд░ Seq рд╕реНрдХреИрди (рд▓рд╛рдЧрдд = 0.00..20834.12 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 100 рдЪреМрдбрд╝рд╛рдИ = 37) (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 0.033..94.757 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 3824 рдЫреЛрд░реЛрдВ = 1)
рдлрд╝рд┐рд▓реНрдЯрд░: (c2 ~~ 'ab%' :: рдЯреЗрдХреНрд╕реНрдЯ)
рдлрд╝рд┐рд▓реНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рдХрд╛рд▓реА рдЧрдИ рдкрдВрдХреНрддрд┐рдпрд╛рдБ: 996186
рдмрдлрд╝рд░реНрд╕: рд╕рд╛рдЭрд╛ рд╣рд┐рдЯ = 8334
рдХреБрд▓ рд░рдирдЯрд╛рдЗрдо: 94.924 рдПрдордПрд╕
(5 рдкрдВрдХреНрддрд┐рдпрд╛рдБ)

Seq Scan рдФрд░ Filter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИред

 EXPLAIN (ANALYZE,BUFFERS) SELECT * FROM foo WHERE c2 LIKE 'ab%' LIMIT 10; 

рдЬрд▓реНрджреА рдпреЛрдЬрдирд╛
- рд╕реАрдорд╛ (рд▓рд╛рдЧрдд = 0.00..2083.41 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 10 рдЪреМрдбрд╝рд╛рдИ = 37) (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 0.037..0.607 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 10 рдЫреЛрд░реЛрдВ = 1)
рдмрдлрд╝рд░реНрд╕: рд╕рд╛рдЭрд╛ рд╣рд┐рдЯ = 26
-> рдлреВ (рд▓рд╛рдЧрдд = 0.00..20834.12 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 100 рдЪреМрдбрд╝рд╛рдИ = 37) рдкрд░ Seq рд╕реНрдХреИрди (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 0.031..0.599 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 10 рдЫреЛрд░реЛрдВ = 1)
рдлрд╝рд┐рд▓реНрдЯрд░: (c2 ~~ 'ab%' :: рдЯреЗрдХреНрд╕реНрдЯ)
рдлрд╝рд┐рд▓реНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рдХрд╛рд▓реА рдЧрдИ рдкрдВрдХреНрддрд┐рдпрд╛рдБ: 3053
рдмрдлрд╝рд░реНрд╕: рд╕рд╛рдЭрд╛ рд╣рд┐рдЯ = 26
рдХреБрд▓ рд░рдирдЯрд╛рдЗрдо: 0.628 рдПрдордПрд╕
(7 рдкрдВрдХреНрддрд┐рдпрд╛рдБ)

Seq Scan рддрд╛рд▓рд┐рдХрд╛ рдкрдВрдХреНрддрд┐рдпреЛрдВ Seq Scan рдФрд░ Filter рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИред рдЬреИрд╕реЗ рд╣реА 10 рд░рд┐рдХреЙрд░реНрдб рд╕рдВрддреБрд╖реНрдЯ рд╣реЛрддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рд╕реНрдХреИрди рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкрд░рд┐рдгрд╛рдо рдХреА 10 рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкреВрд░реА рддрд╛рд▓рд┐рдХрд╛ рдирд╣реАрдВ рдкрдврд╝рдиреА рдереА, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ 3063 рд░рд┐рдХреЙрд░реНрдб рдереЗ, рдЬрд┐рдирдореЗрдВ рд╕реЗ 3053 рдХреЛ рдЦрд╛рд░рд┐рдЬ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ( Rows Removed by Filter )ред
рдпрд╣реА рдмрд╛рдд Index Scan рд╕рд╛рде рднреА рд╣реЛрддреА рд╣реИред

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


рдПрдХ рдирдИ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдВрдХрдбрд╝реЗ рдПрдХрддреНрд░ рдХрд░реЗрдВред
 CREATE TABLE bar (c1 integer, c2 boolean); INSERT INTO bar SELECT i, i%2=1 FROM generate_series(1, 500000) AS i; ANALYZE bar; 


рджреЛ рдЯреЗрдмрд▓ рдХреНрд╡реЗрд░реА
 EXPLAIN (ANALYZE) SELECT * FROM foo JOIN bar ON foo.c1=bar.c1; 

рдЬрд▓реНрджреА рдпреЛрдЬрдирд╛
- рд╣реИрд╢ рдЬреНрд╡рд╛рдЗрди (рд▓рд╛рдЧрдд = 13463.00..49297.22 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 500000 рдЪреМрдбрд╝рд╛рдИ = 42) (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 87.441..907.555 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 500010 рдЫреЛрд░ = 1)
рд╣реИрд╢ рдХрд╛рдВрдб: (foo.c1 = bar.c1)
-> рдлреВ (рд▓рд╛рдЧрдд = 0.00..18334.10 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 1000010 рдЪреМрдбрд╝рд╛рдИ = 37) рдкрд░ Seq рд╕реНрдХреИрди (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 0.008..67.951 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 1000010 рдЫреЛрд░реЛрдВ = 1)
-> рд╣реИрд╢ (рд▓рд╛рдЧрдд = 7213.00..7213.00 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 500000 рдЪреМрдбрд╝рд╛рдИ = 5) (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 87.352..87.352 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 500000 рд▓реВрдк = 1)
рдмрд╛рд▓реНрдЯреА: 65536 рдмреИрдЪ: 1 рдореЗрдореЛрд░реА рдЙрдкрдпреЛрдЧ: 18067kB
-> рдмрд╛рд░ рдкрд░ рд╕реНрдХреИрди рд╕реНрдХреИрди (рд▓рд╛рдЧрдд = 0.00..7213.00 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 500000 рдЪреМрдбрд╝рд╛рдИ = 5) (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 0.007..33.233 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 500000 рд▓реВрдк = 1)
рдХреБрд▓ рд░рдирдЯрд╛рдЗрдо: 920.967 рдПрдордПрд╕
(7 рдкрдВрдХреНрддрд┐рдпрд╛рдБ)

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, bar (рддрд╛рд▓рд┐рдХрд╛) рд╕реНрдХреИрди рдХреА рдЬрд╛рддреА рд╣реИ ( Seq Scan )ред рдЗрд╕рдХреА рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╣реИрд╢ рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред
рдлрд┐рд░, Seq Scan рдЯреЗрдмрд▓ foo рд╕реНрдХреИрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдХреА рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╣реИрд╢ рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕рдХреА рддреБрд▓рдирд╛ Hash Cond рдХреА рд╕реНрдерд┐рддрд┐ рджреНрд╡рд╛рд░рд╛ bar рдЯреЗрдмрд▓ рдХреЗ рд╣реИрд╢ рдХреЗ рд╕рд╛рде ( Hash Join ) рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рдХреЛрдИ рдорд┐рд▓рд╛рди рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкрд░рд┐рдгрд╛рдореА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреА рд╣реИ, рдЕрдиреНрдпрдерд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдореЗрдЬ рдХреА bar рд╣реИрд╢ рдХреА рдореЗрдЬрдмрд╛рдиреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдореГрддрд┐ рдореЗрдВ 18067kB рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред

рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдЬреЛрдбрд╝реЗрдВ
 CREATE INDEX ON bar(c1); EXPLAIN (ANALYZE) SELECT * FROM foo JOIN bar ON foo.c1=bar.c1; 

рдЬрд▓реНрджреА рдпреЛрдЬрдирд╛
- рдорд░реНрдЬ рдЬреЙрдЗрди (рд▓рд╛рдЧрдд = 1.69..39879.71 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 500000 рдЪреМрдбрд╝рд╛рдИ = 42) (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 0.037..263.357 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 500010 рд▓реВрдк = 1)
рдорд░реНрдЬ рдХрдВрдб: (foo.c1 = bar.c1)
-> рд╕реВрдЪрдХрд╛рдВрдХ рд╕реНрдХреИрди foo_c1_idx рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ foo (рд▓рд╛рдЧрдд = 0.42..34327.57 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 1000010 рдЪреМрдбрд╝рд╛рдИ = 37) (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 0.019..58.920 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 500011 рд▓реВрдк = 1)
-> рдмрд╛рд░ рдкрд░ рдмрд╛рд░_c1_idx (рд▓рд╛рдЧрдд = 0.42..15212.42 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 500000 рдЪреМрдбрд╝рд╛рдИ = 5) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реНрдХреИрди (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 0.008..71.719 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 500010 рдЫреЛрд░ = 1)
рдХреБрд▓ рд░рдирдЯрд╛рдЗрдо: 283.549 рдПрдордПрд╕
(5 рдкрдВрдХреНрддрд┐рдпрд╛рдБ)

Hash рдЕрдм рдЙрдкрдпреЛрдЧ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рджреЛрдиреЛрдВ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдкрд░ Merge Join рдФрд░ Index Scan рдПрдХ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрддреЗ рд╣реИрдВред

рдмрд╛рдИрдВ рдУрд░:
 EXPLAIN (ANALYZE) SELECT * FROM foo LEFT JOIN bar ON foo.c1=bar.c1; 

рдЬрд▓реНрджреА рдпреЛрдЬрдирд╛
- рд╣реИрд╢ рд▓реЗрдлреНрдЯ рдЬреЙрдЗрди (рд▓рд╛рдЧрдд = 13463.00..49297.22 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 1000010 рдЪреМрдбрд╝рд╛рдИ = 42) (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 82.682..926.331 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 1000010 рд▓реВрдк = 1)
рд╣реИрд╢ рдХрд╛рдВрдб: (foo.c1 = bar.c1)
-> рдлреВ (рд▓рд╛рдЧрдд = 0.00..18334.10 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 1000010 рдЪреМрдбрд╝рд╛рдИ = 37) рдкрд░ рд╕реАрдХ рд╕реНрдХреИрди (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 0.004..68.763 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 1000010 рд▓реВрдк = 1)
-> рд╣реИрд╢ (рд▓рд╛рдЧрдд = 7213.00..7213.00 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 500000 рдЪреМрдбрд╝рд╛рдИ = 5) (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 82.625..82.625 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 500000 рд▓реВрдк = 1)
рдмрд╛рд▓реНрдЯреА: 65536 рдмреИрдЪ: 1 рдореЗрдореЛрд░реА рдЙрдкрдпреЛрдЧ: 18067kB
-> рдмрд╛рд░ рдкрд░ рд╕реНрдХреИрди рд╕реНрдХреИрди (рд▓рд╛рдЧрдд = 0.00..7213.00 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 500000 рдЪреМрдбрд╝рд╛рдИ = 5) (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 0.003..31.890 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 500000 рд▓реВрдк = 1)
рдХреБрд▓ рд░рдирдЯрд╛рдЗрдо: 950.625 рдПрдордПрд╕
(7 рдкрдВрдХреНрддрд┐рдпрд╛рдБ)

Seq Scan ?
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЕрдЧрд░ рд╣рдо Seq Scan рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдкрд░рд┐рдгрд╛рдо рдХреНрдпрд╛ рд╣реЛрдВрдЧреЗред
 SET enable_seqscan TO off; EXPLAIN (ANALYZE) SELECT * FROM foo LEFT JOIN bar ON foo.c1=bar.c1; 

рдЬрд▓реНрджреА рдпреЛрдЬрдирд╛
- рдорд░реНрдЬ рд▓реЗрдлреНрдЯ рдЬреЙрдЗрди (рд▓рд╛рдЧрдд = 0.85..58290.02 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 1000010 рдЪреМрдбрд╝рд╛рдИ = 42) (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 0.024..353.819 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 1000010 рд▓реВрдк = 1)
рдорд░реНрдЬ рдХрдВрдб: (foo.c1 = bar.c1)
-> рд╕реВрдЪрдХрд╛рдВрдХ рд╕реНрдХреИрди foo_c1_idx рдХрд╛ рдЙрдкрдпреЛрдЧ foo (рд▓рд╛рдЧрдд = 0.42..34327.57 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 1000010 рдЪреМрдбрд╝рд╛рдИ = 37) (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 0.011..112.095 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 1000010 рдЫреЛрд░реЛрдВ = 1) рдкрд░ рдХрд░реЗрдВ
-> рдмрд╛рд░ рдкрд░ рдмрд╛рд░_c1_idx (рд▓рд╛рдЧрдд = 0.42..15212.42 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 500000 рдЪреМрдбрд╝рд╛рдИ = 5) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реНрдХреИрди (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 0.008..63.125 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 500010 рдЫреЛрд░ = 1)
рдХреБрд▓ рд░рдирдЯрд╛рдЗрдо: 378.603 рдПрдордПрд╕
(5 рдкрдВрдХреНрддрд┐рдпрд╛рдБ)

рдкреНрд▓рд╛рдирд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╣реИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдорд╣рдВрдЧрд╛ рд╣реИред рдпрд╣ рдЖрд╡рдВрдЯрд┐рдд рд╕реНрдореГрддрд┐ рдХреА рдкрд░реНрдпрд╛рдкреНрдд рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╕рдВрднрд╡ рд╣реИред рдпрд╛рдж рд░рдЦреЗрдВ рд╣рдордиреЗ work_mem ?
рд▓реЗрдХрд┐рди, рдпрджрд┐ рд╕реНрдореГрддрд┐ рдХрдо рдЖрдкреВрд░реНрддрд┐ рдореЗрдВ рд╣реИ, рддреЛ рдЕрдиреБрд╕реВрдЪрдХ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдЧрд╛:
 SET work_mem TO '15MB'; SET enable_seqscan TO ON; EXPLAIN (ANALYZE) SELECT * FROM foo LEFT JOIN bar ON foo.c1=bar.c1; 

рдЬрд▓реНрджреА рдпреЛрдЬрдирд╛
- рдорд░реНрдЬ рд▓реЗрдлреНрдЯ рдЬреЙрдЗрди (рд▓рд╛рдЧрдд = 0.85..58290.02 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 1000010 рдЪреМрдбрд╝рд╛рдИ = 42) (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 0.014..376.395 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 1000010 рд▓реВрдк = 1)
рдорд░реНрдЬ рдХрдВрдб: (foo.c1 = bar.c1)
-> рд╕реВрдЪрдХрд╛рдВрдХ рд╕реНрдХреИрди foo_c1_idx1 рдХрд╛ рдЙрдкрдпреЛрдЧ foo (рд▓рд╛рдЧрдд = 0.42..34327.57 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 1000010 рдЪреМрдбрд╝рд╛рдИ = 37) (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 0.005..124.698 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 1000010 рдЫреЛрд░реЛрдВ = 1) рдкрд░ рдХрд░реЗрдВ
-> рдкрдЯреНрдЯреА рдкрд░ рдмрд╛рд░_c1_idx (рд▓рд╛рдЧрдд = 0.42..15212.42 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 500000 рдЪреМрдбрд╝рд╛рдИ = 5) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реНрдХреИрди (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 0.006..66.813 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 500010 рдЫреЛрд░ = 1)
рдХреБрд▓ рд░рдирдЯрд╛рдЗрдо: 401.990 рдПрдордПрд╕
(5 рдкрдВрдХреНрддрд┐рдпрд╛рдБ)

рдФрд░ рдирд┐рд╖рд┐рджреНрдз Index Scan рд╕рд╛рде EXPLAIN рдЖрдЙрдЯрдкреБрдЯ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛?
 SET work_mem TO '15MB'; SET enable_indexscan TO off; EXPLAIN (ANALYZE) SELECT * FROM foo LEFT JOIN bar ON foo.c1=bar.c1; 

рдЬрд▓реНрджреА рдпреЛрдЬрдирд╛
- рд╣реИрд╢ рд▓реЗрдлреНрдЯ рдЬреЙрдЗрди (рд▓рд╛рдЧрдд = 15417.00..63831.18 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 1000010 рдЪреМрдбрд╝рд╛рдИ = 42) (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 93.440..712.056 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 1000010 рд▓реВрдк = 1)
рд╣реИрд╢ рдХрд╛рдВрдб: (foo.c1 = bar.c1)
-> рдлреВ (рд▓рд╛рдЧрдд = 0.00..18334.10 рдкрдВрдХреНрддрд┐рдпреЛрдВ = 1000010 рдЪреМрдбрд╝рд╛рдИ = 37) рдкрд░ Seq рд╕реНрдХреИрди (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 0.008..65.901 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 1000010 рд▓реВрдк = 1)
-> рд╣реИрд╢ (рд▓рд╛рдЧрдд = 7213.00..7213.00 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 500000 рдЪреМрдбрд╝рд╛рдИ = 5) (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 93.308..93.308 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 500000 рд▓реВрдк = 1)
рдмрд╛рд▓реНрдЯреА: 65536 рдмреИрдЪ: 2 рдореЗрдореЛрд░реА рдЙрдкрдпреЛрдЧ: 9045kB
-> рдмрд╛рд░ рдкрд░ рд╕реНрдХреИрди рд╕реНрдХреИрди (рд▓рд╛рдЧрдд = 0.00..7213.00 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 500000 рдЪреМрдбрд╝рд╛рдИ = 5) (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 0.007..33.718 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 500000 рд▓реВрдк = 1)
рдХреБрд▓ рд░рдирдЯрд╛рдЗрдо: 736.726 рдПрдордПрд╕
(7 рдкрдВрдХреНрддрд┐рдпрд╛рдБ)

cost рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрдврд╝ рдЧрдИ рд╣реИред Batches: 2 рдореЗрдВ рдХрд╛рд░рдг Batches: 2 ред рдкреВрд░рд╛ рд╣реИрд╢ рдореЗрдореЛрд░реА рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рдерд╛, рдЗрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ 9045kB рдХреЗ 2 рдкреИрдХреЗрдЯ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛ред

рдпрд╣рд╛рдБ рдореИрдВ рдлрд┐рд░ рд╕реЗ рдЧреБрд░реБ рд╕реЗ рдорджрдж рдорд╛рдБрдЧрддрд╛ рд╣реВрдБред рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпреЛрдВ Merge Left Join LEFT JOIN рдФрд░ рдкрд░реНрдпрд╛рдкреНрдд work_mem , Merge Left Join рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ Hash Left Join рддреБрд▓рдирд╛ Merge Left Join рдЕрдзрд┐рдХ рдорд╣рдВрдЧрд╛ рд╣реИ?

рдореИрдВ рдЖрдЬ рдпрд╣реАрдВ рд░реБрдХреВрдВрдЧрд╛ред

рдпреБрдкреАрдбреАред
PostgreSQL рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдИ рдЙрдкрдпреЛрдЧреА рдмрд╛рддреЗрдВ рдУрд▓реЗрдЧ рдмрд╛рд░реНрдЯреБрдиреЛрд╡ рдФрд░ рдЕрд▓реЗрдХреНрдЬреЗрдВрдбрд░ рдХреЛрд░реЛрдЯрдХреЛрд╡ рджреНрд╡рд╛рд░рд╛ рдмрддрд╛рдИ рдЧрдИ рдереАрдВред

рдореИрдВ рдпрд╣рд╛рдБ PostgreSQL Indexes рдХреЗ рдирд╡реАрдирддрдо рд▓реЗрдЦреЛрдВ рдХрд╛ рд▓рд┐рдВрдХ рд▓рд╛рдКрдВрдЧрд╛, рднрд╛рдЧ 2 , рднрд╛рдЧ 3 ред рдмрд╣реБрдд рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

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


All Articles