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


рдЕрдиреБрд░реЛрдз рдореЗрдВ рдЗрддрдирд╛ рд╕рдордп рдХреНрдпреЛрдВ рд▓рдЧрд╛? рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?
рд╢рд╛рдпрдж рд╕рднреА рдиреЗ PostgreSQL рдореЗрдВ EXPLAIN рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд╛ рд╣реИред рд▓реЗрдХрд┐рди рдРрд╕реЗ рдХрдИ рдирд╣реАрдВ рд╣реИрдВ рдЬреЛ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИред рдЦреБрдж рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдкрд╛рдареНрдпрдкреБрд╕реНрддрдХ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд▓рдн рдирд╣реАрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ (рдЦрд░рд╛рдм рдЦреЛрдЬ?)ред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рдорджрдж рдХрд░реЗрдЧрд╛ рдЬреЛ рдЗрд╕ рдЕрджреНрднреБрдд рдЙрдкрдХрд░рдг рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

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

рдЗрддрдирд╛ рдбрд░рд╛рд╡рдирд╛ рдирд░рдХ рдирд╣реАрдВ


рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, PostgreSQL рдХрд░реНрдиреЗрд▓ рдХреЗ рдкреАрдЫреЗ рдХреЗ рддрд░реНрдХ рдХреЛ рд╕рдордЭрдирд╛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
рдореИрдВ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рдХрд░реНрдиреЗрд▓ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣рдо EXPLAIN рдХрдорд╛рдВрдб рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ, рдпрд╣ рд╕рдордЭрдХрд░ рдХрд┐ PostgreSQL рдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред рдпрд╣ PostgreSQL 9.2 рдФрд░ рдмрд╛рдж рдореЗрдВ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред

рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп:



рдкрд╣рд▓рд╛ рдХрджрдо


рд╣рдо рдПрдХ рдорд┐рд▓рд┐рдпрди-рд▓рд╛рдЗрди рдЯреЗрд╕реНрдЯ рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ рдкрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рджреЗрдВрдЧреЗ
CREATE TABLE foo (c1 integer, c2 text); INSERT INTO foo SELECT i, md5(random()::text) FROM generate_series(1, 1000000) AS i; 

рдЖрдЗрдП рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ
 EXPLAIN SELECT * FROM foo; 

рдЬрд▓реНрджреА рдпреЛрдЬрдирд╛
- foo рдкрд░ Seq рд╕реНрдХреИрди (рд▓рд╛рдЧрдд = 0.00..18334.00 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 1,000,000 рдЪреМрдбрд╝рд╛рдИ = 37)
(1 рдкрдВрдХреНрддрд┐)

рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рдирд╛ рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, EXPLAIN рдХреА рд░рд┐рдкреЛрд░реНрдЯ рд╣реИ рдХрд┐ Seq Scan рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ - рдЕрдиреБрдХреНрд░рдорд┐рдХ, рдмреНрд▓реЙрдХ рджреНрд╡рд╛рд░рд╛ рдмреНрд▓реЙрдХ, foo рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рдирд╛ред
cost рдХреНрдпрд╛ рд╣реИ? рдпрд╣ рд╕рдордп рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╡реИрдХреНрдпреВрдо рдЕрд╡рдзрд╛рд░рдгрд╛ рдореЗрдВ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЧреЛрд▓рд╛рдХрд╛рд░ рд╣реИ, рдЬрд┐рд╕реЗ рдСрдкрд░реЗрд╢рди рдХреА рд▓рд╛рдЧрдд рдХрд╛ рдЖрдХрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред 0.00 рдХрд╛ рдкрд╣рд▓рд╛ рдорд╛рди рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рд▓рд╛рдЧрдд рд╣реИред рджреВрд╕рд░реА - 18334.00 - рд╕рднреА рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рд▓рд╛рдЧрддред
rows Seq Scan рдСрдкрд░реЗрд╢рди рдХрд░рддреЗ рд╕рдордп рджреА рдЧрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдЕрдиреБрдорд╛рдирд┐рдд рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдпрд╣ рдорд╛рди рд╢реЗрдбреНрдпреВрд▓рд░ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред
width - рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рдХрд╛ рдФрд╕рдд рдЖрдХрд╛рд░ред
10 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред
 INSERT INTO foo SELECT i, md5(random()::text) FROM generate_series(1, 10) AS i; EXPLAIN SELECT * FROM foo; 

рдЬрд▓реНрджреА рдпреЛрдЬрдирд╛
- foo рдкрд░ Seq рд╕реНрдХреИрди (рд▓рд╛рдЧрдд = 0.00..18334.00 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 1,000,000 рдЪреМрдбрд╝рд╛рдИ = 37)
(1 рдкрдВрдХреНрддрд┐)

rows рдХрд╛ рдореВрд▓реНрдп рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИред рдореЗрдЬ рдкрд░ рдЖрдБрдХрдбрд╝реЗ рдкреБрд░рд╛рдиреЗ рд╣реИрдВред рдЖрдВрдХрдбрд╝реЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, ANALYZE рдХрдорд╛рдВрдб рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред
 ANALYZE foo; EXPLAIN SELECT * FROM foo; 

рдЬрд▓реНрджреА рдпреЛрдЬрдирд╛
- foo рдкрд░ Seq рд╕реНрдХреИрди (рд▓рд╛рдЧрдд = 0.00..18334.10 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 1000010 рдЪреМрдбрд╝рд╛рдИ = 37)
(1 рдкрдВрдХреНрддрд┐)

рдЕрдм rows рдХреА рд╕рд╣реА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред

ANALYZE рдХрд░рддреЗ рд╕рдордп рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ?


ANALYZE рдХрд┐рддрдиреА рд▓рд╛рдЗрдиреЗрдВ рдкрдврд╝реЗрдЧрд╛ рдпрд╣ default_statistics_target рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛

EXPLAIN рдХрдорд╛рдВрдб рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рд╣рдордиреЗ рдЬреЛ рдХреБрдЫ рднреА рдКрдкрд░ рджреЗрдЦрд╛ рд╡рд╣ рд╕рд┐рд░реНрдл рд╢реЗрдбреНрдпреВрд▓рд░ рдХреА рдЕрдкреЗрдХреНрд╖рд╛рдПрдВ рд╣реИрдВред рдЖрдЗрдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛ рдкрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдЙрдирдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рд╣рдо EXPLAIN (ANALYZE) рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
 EXPLAIN (ANALYZE) SELECT * FROM foo; 

рдЬрд▓реНрджреА рдпреЛрдЬрдирд╛
- foo рдкрд░ Seq рд╕реНрдХреИрди (рд▓рд╛рдЧрдд = 0.00..18334.10 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 1000010 рдЪреМрдбрд╝рд╛рдИ = 37) (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп = 0.012..61.524 рдкрдВрдХреНрддрд┐рдпрд╛рдБ = 1000010 рд▓реВрдк = 1)
рдХреБрд▓ рд░рдирдЯрд╛рдЗрдо: 90.944 рдПрдордПрд╕
(2 рдкрдВрдХреНрддрд┐рдпрд╛рдБ)

рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк INSERT, DELETE рдпрд╛ UPDATE рдХреЗ рд▓рд┐рдП EXPLAIN (ANALYZE) рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХрд╛ рдбреЗрдЯрд╛ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ред рд╕рд╛рд╡рдзрд╛рди! рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, ROLLBACK рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рдХрдорд╛рдВрдб рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред
actual time - рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдХреНрд░рдорд╢рдГ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдФрд░ рд╕рднреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рддрд╛рдпрд╛ рдЧрдпрд╛ред
rows - Seq Scan рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЦреНрдпрд╛ред
loops - рдХрд┐рддрдиреА рдмрд╛рд░ рдСрдкрд░реЗрд╢рди Seq Scan рдХрд░рдирд╛ рдкрдбрд╝рд╛ред
Total runtime - рдЕрдиреБрд░реЛрдз рдХрд╛ рдХреБрд▓ рд░рдирдЯрд╛рдЗрдоред

рдЕрдзрд┐рдХ ...

рдкрд╣рд▓реЗ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП, рд╢рд╛рдпрдж рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рднрд╛рдЧ реи
рднрд╛рдЧ рей

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


All Articles