PostgreSQL рдореЗрдВ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХреА рд╕рднреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


Postgres world рдореЗрдВ, рдбреЗрдЯрд╛рдмреЗрд╕ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ (рд╣реАрдк, рд╣реАрдк) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред Postgres рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ MVCC рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдЖрдкрдХреЛ рдПрдХ рд╣реА рдЯреНрдпреВрдкрд▓ рдХреЗ рдХрдИ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдЬрдорд╛ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рднрд╛рд╡реА рдЕрдиреБрдХреНрд░рдорд┐рдд рдмрдирд╛рдиреЗ рдФрд░ рдмрдирд╛рдП рд░рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдФрд░ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдХреБрдЫ рд╕реБрдЭрд╛рд╡ рджрд┐рдП рдЧрдП рд╣реИрдВред

рдиреЛрдЯ: рдиреАрдЪреЗ рджрд┐рдЦрд╛рдП рдЧрдП рдХреНрд╡реЗрд░реАрдЬрд╝ рдПрдХ рдЕрдирдореЙрдбрд┐рдлрд╛рдЗрдб рдкрдЧрд┐рд▓рд╛ рдирдореВрдирд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

рдХрд╡рд░рд┐рдВрдЧ рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рдЖрдЗрдП рдирд┐рд╖реНрдХреНрд░рд┐рдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдИрдореЗрд▓ рдкрддреЗ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░реЗрдВред customer рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ active рдХреЙрд▓рдо рд╣реИ, рдФрд░ рдЕрдиреБрд░реЛрдз рд╕рд░рд▓ рд╣реИ:

 pagila=# EXPLAIN SELECT email FROM customer WHERE active=0; QUERY PLAN ----------------------------------------------------------- Seq Scan on customer (cost=0.00..16.49 rows=15 width=32) Filter: (active = 0) (2 rows) 

рдХреНрд╡реЗрд░реА customer рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╕реНрдХреИрди рдХрд░рдиреЗ рдХрд╛ рдкреВрд░рд╛ рдЕрдиреБрдХреНрд░рдо рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддреА рд╣реИред active рдХреЙрд▓рдо рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рдПрдВ:

 pagila=# CREATE INDEX idx_cust1 ON customer(active); CREATE INDEX pagila=# EXPLAIN SELECT email FROM customer WHERE active=0; QUERY PLAN ----------------------------------------------------------------------------- Index Scan using idx_cust1 on customer (cost=0.28..12.29 rows=15 width=32) Index Cond: (active = 0) (2 rows) 

рдЗрд╕рдиреЗ рдорджрдж рдХреА, рдмрд╛рдж рдореЗрдВ рд╕реНрдХреИрди рдПрдХ " index scan " рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ Postgres idx_cust1 рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рд╕реНрдХреИрди рдХрд░реЗрдЧрд╛, рдФрд░ рдлрд┐рд░ рдЕрдиреНрдп рдХреЙрд▓рдо (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, email рдХреЙрд▓рдо) рдХреЗ рдорд╛рдиреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдвреЗрд░ рдХреЛ рдЦреЛрдЬрдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдЧрд╛ рдЬрд┐рд╕реЗ рдХреНрд╡реЗрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

PostgreSQL 11 рдиреЗ рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рдХрд╡рд░ рдХрд┐рдпрд╛ред рд╡реЗ рдЖрдкрдХреЛ рдПрдХ рдпрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЙрд▓рдо рдХреЛ рдЗрдВрдбреЗрдХреНрд╕ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ - рдЙрдирдХрд╛ рдорд╛рди рдЗрдВрдбреЗрдХреНрд╕ рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрджрд┐ рд╣рдордиреЗ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдЕрдВрджрд░ рдИрдореЗрд▓ рдореВрд▓реНрдп рдЬреЛрдбрд╝рд╛ рд╣реИ, рддреЛ Postgres рдХреЛ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдвреЗрд░ рдореЗрдВ email рдореВрд▓реНрдп рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

 pagila=# CREATE INDEX idx_cust2 ON customer(active) INCLUDE (email); CREATE INDEX pagila=# EXPLAIN SELECT email FROM customer WHERE active=0; QUERY PLAN ---------------------------------------------------------------------------------- Index Only Scan using idx_cust2 on customer (cost=0.28..12.29 rows=15 width=32) Index Cond: (active = 0) (2 rows) 

" Index Only Scan " рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрд╡реЗрд░реА рдХреЛ рдЕрдм рдХреЗрд╡рд▓ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдЯреЗрдмрд▓ рд╣реАрдк рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдбрд┐рд╕реНрдХ I / O рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред

рдЖрдЬ, рдХрд╡рд░рд┐рдВрдЧ рдЗрдВрдбреЗрдХреНрд╕ рдХреЗрд╡рд▓ рдмреА-рдкреЗрдбрд╝реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрд╕реНрдХреЙрд░реНрдЯ рдкреНрд░рдпрд╛рд╕ рдЕрдзрд┐рдХ рд╣реЛрдВрдЧреЗред

рдЖрдВрд╢рд┐рдХ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рдЖрдВрд╢рд┐рдХ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдХреЗрд╡рд▓ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╕рдмрд╕реЗрдЯ рд╣реИред рдпрд╣ рдЕрдиреБрдХреНрд░рдорд┐рдд рдФрд░ рддреЗрдЬреА рд╕реЗ рд╕реНрдХреИрди рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИред

рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдореЗрдВ рдЕрдкрдиреЗ рдХреИрд▓рд┐рдлреЛрд░реНрдирд┐рдпрд╛ рдХреЗ рдЧреНрд░рд╛рд╣рдХреЛрдВ рд╕реЗ рдИрдореЗрд▓ рдкрддреЗ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдиреБрд░реЛрдз рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:

 SELECT c.email FROM customer c JOIN address a ON c.address_id = a.address_id WHERE a.district = 'California'; which has a query plan that involves scanning both the tables that are joined: pagila=# EXPLAIN SELECT c.email FROM customer c pagila-# JOIN address a ON c.address_id = a.address_id pagila-# WHERE a.district = 'California'; QUERY PLAN ---------------------------------------------------------------------- Hash Join (cost=15.65..32.22 rows=9 width=32) Hash Cond: (c.address_id = a.address_id) -> Seq Scan on customer c (cost=0.00..14.99 rows=599 width=34) -> Hash (cost=15.54..15.54 rows=9 width=4) -> Seq Scan on address a (cost=0.00..15.54 rows=9 width=4) Filter: (district = 'California'::text) (6 rows) 

рд╕рд╛рдорд╛рдиреНрдп рд╕реВрдЪрдХрд╛рдВрдХ рд╣рдореЗрдВ рдХреНрдпрд╛ рджреЗрдЧрд╛:

 pagila=# CREATE INDEX idx_address1 ON address(district); CREATE INDEX pagila=# EXPLAIN SELECT c.email FROM customer c pagila-# JOIN address a ON c.address_id = a.address_id pagila-# WHERE a.district = 'California'; QUERY PLAN --------------------------------------------------------------------------------------- Hash Join (cost=12.98..29.55 rows=9 width=32) Hash Cond: (c.address_id = a.address_id) -> Seq Scan on customer c (cost=0.00..14.99 rows=599 width=34) -> Hash (cost=12.87..12.87 rows=9 width=4) -> Bitmap Heap Scan on address a (cost=4.34..12.87 rows=9 width=4) Recheck Cond: (district = 'California'::text) -> Bitmap Index Scan on idx_address1 (cost=0.00..4.34 rows=9 width=0) Index Cond: (district = 'California'::text) (8 rows) 

address рд╕реНрдХреИрди рдХреЛ idx_address1 рдЗрдВрдбреЗрдХреНрд╕ idx_address1 рджреНрд╡рд╛рд░рд╛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдлрд┐рд░ address рд╣реАрдк рдХреЛ рд╕реНрдХреИрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЪреВрдВрдХрд┐ рдпрд╣ рд▓рдЧрд╛рддрд╛рд░ рдХреНрд╡реЗрд░реА рд╣реИ рдФрд░ рдЗрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рдо рдПрдХ рдЖрдВрд╢рд┐рдХ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ рдЙрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЙрди рдкрддреЗ рдХреЗ рд╕рд╛рде рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдирдореЗрдВ рдХреНрд╖реЗрддреНрд░ 'California' :

 pagila=# CREATE INDEX idx_address2 ON address(address_id) WHERE district='California'; CREATE INDEX pagila=# EXPLAIN SELECT c.email FROM customer c pagila-# JOIN address a ON c.address_id = a.address_id pagila-# WHERE a.district = 'California'; QUERY PLAN ------------------------------------------------------------------------------------------------ Hash Join (cost=12.38..28.96 rows=9 width=32) Hash Cond: (c.address_id = a.address_id) -> Seq Scan on customer c (cost=0.00..14.99 rows=599 width=34) -> Hash (cost=12.27..12.27 rows=9 width=4) -> Index Only Scan using idx_address2 on address a (cost=0.14..12.27 rows=9 width=4) (5 rows) 

рдЕрдм рдЕрдиреБрд░реЛрдз рдХреЗрд╡рд▓ idx_address2 рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ address рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╕реНрдкрд░реНрд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдорд▓реНрдЯреА-рд╡реИрд▓реНрдпреВ рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рдХреБрдЫ рд╕реНрддрдВрдн рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЙрдирдореЗрдВ рдПрдХ рд╕реНрдХреЗрд▓рд░ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред jsonb , arrays рдФрд░ tsvector рдЬреИрд╕реЗ jsonb рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдПрдХ рдпрд╛ рдХрдИ рдорд╛рди рд╣реЛрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХреЛ рдРрд╕реЗ рд╕реНрддрдВрднреЛрдВ рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЖрдорддреМрд░ рдкрд░ рдЗрди рд╕реНрддрдВрднреЛрдВ рдХреЗ рд╕рднреА рд╡реНрдпрдХреНрддрд┐рдЧрдд рдореВрд▓реНрдпреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рдиреА рд╣реЛрдЧреАред

рдЖрдЗрдП рд╕рднреА рдлрд┐рд▓реНрдореЛрдВ рдХреЗ рдирд╛рдо рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдЬрд┐рдирдореЗрдВ рдЕрд╕рдлрд▓рддрд╛ рд╕реЗ рдХрдЯреМрддреА рд╣реЛрддреА рд╣реИред film рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдкрд╛рда рд╕реНрддрдВрдн рд╣реИ рдЬрд┐рд╕реЗ special_features рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдлрд┐рд▓реНрдо рдореЗрдВ рдпрд╣ "рд╡рд┐рд╢реЗрд╖ рдЧреБрдг" рд╣реИ, рддреЛ рд╕реНрддрдВрдн рдореЗрдВ рдкрд╛рда рдХреЗ Behind The Scenes рдПрдХ рддрддреНрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рддрддреНрд╡ рд╣реЛрддрд╛ рд╣реИред рдРрд╕реА рд╕рднреА рдлрд┐рд▓реНрдореЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ special_features рдХрд┐рд╕реА рднреА рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП "рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗ" рдХреЗ рд╕рд╛рде рд╕рднреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 SELECT title FROM film WHERE special_features @> '{"Behind The Scenes"}'; 

рдирд┐рдпрдВрддреНрд░рдг рдСрдкрд░реЗрдЯрд░ @> рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рджрд╛рдИрдВ рдУрд░ рдмрд╛рдИрдВ рдУрд░ рдХрд╛ рдЙрдкрд╕рдореВрд╣ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдЕрдиреБрд░реЛрдз рдпреЛрдЬрдирд╛:

 pagila=# EXPLAIN SELECT title FROM film pagila-# WHERE special_features @> '{"Behind The Scenes"}'; QUERY PLAN ----------------------------------------------------------------- Seq Scan on film (cost=0.00..67.50 rows=5 width=15) Filter: (special_features @> '{"Behind The Scenes"}'::text[]) (2 rows) 

рдЬреЛ 67 рдХреА рд▓рд╛рдЧрдд рдХреЗ рд╕рд╛рде рдлреБрд▓ рд╣реАрдк рд╕реНрдХреИрди рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИред

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдирд┐рдпрдорд┐рдд рдмреА-рдЯреНрд░реА рдЗрдВрдбреЗрдХреНрд╕ рд╣рдорд╛рд░реА рдорджрдж рдХрд░рддрд╛ рд╣реИ:

 pagila=# CREATE INDEX idx_film1 ON film(special_features); CREATE INDEX pagila=# EXPLAIN SELECT title FROM film pagila-# WHERE special_features @> '{"Behind The Scenes"}'; QUERY PLAN ----------------------------------------------------------------- Seq Scan on film (cost=0.00..67.50 rows=5 width=15) Filter: (special_features @> '{"Behind The Scenes"}'::text[]) (2 rows) 

рд╕реВрдЪрдХрд╛рдВрдХ рдкрд░ рднреА рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдмреА-рдЯреНрд░реА рдЗрдВрдбреЗрдХреНрд╕ рдЗрдВрдбреЗрдХреНрд╕ рдореВрд▓реНрдпреЛрдВ рдореЗрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рддрддреНрд╡реЛрдВ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рд╣реИред

рд╣рдореЗрдВ GIN рдЗрдВрдбреЗрдХреНрд╕ рдЪрд╛рд╣рд┐рдПред

 pagila=# CREATE INDEX idx_film2 ON film USING GIN(special_features); CREATE INDEX pagila=# EXPLAIN SELECT title FROM film pagila-# WHERE special_features @> '{"Behind The Scenes"}'; QUERY PLAN --------------------------------------------------------------------------- Bitmap Heap Scan on film (cost=8.04..23.58 rows=5 width=15) Recheck Cond: (special_features @> '{"Behind The Scenes"}'::text[]) -> Bitmap Index Scan on idx_film2 (cost=0.00..8.04 rows=5 width=0) Index Cond: (special_features @> '{"Behind The Scenes"}'::text[]) (4 rows) 

GIN-index рдЗрдВрдбреЗрдХреНрд╕ рдХрд┐рдП рдЧрдП рд╕рдордЧреНрд░ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╡реНрдпрдХреНрддрд┐рдЧрдд рдореВрд▓реНрдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдХреНрд╡реЗрд░реА рдкреНрд▓рд╛рди рдХреА рд▓рд╛рдЧрдд рдЖрдзреЗ рд╕реЗ рдЕрдзрд┐рдХ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИред

рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдЗрдВрдбреЗрдХреНрд╕ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдПрдВ


рд╕реВрдЪрдХрд╛рдВрдХ рд╕рдордп рдХреЗ рд╕рд╛рде рдЬрдорд╛ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдХрднреА-рдХрднреА рдПрдХ рдирдП рд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ рдкрд┐рдЫрд▓реА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд╕рдорд╛рди рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЗрдВрдбреЗрдХреНрд╕ рдХреА рдорд╛рдирд╡ рдкрдардиреАрдп SQL рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдХреИрдЯрд▓реЙрдЧ рджреГрд╢реНрдп pg_indexes рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рд╕рдорд╛рди рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рднреА рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

  SELECT array_agg(indexname) AS indexes, replace(indexdef, indexname, '') AS defn FROM pg_indexes GROUP BY defn HAVING count(*) > 1; And here's the result when run on the stock pagila database: pagila=# SELECT array_agg(indexname) AS indexes, replace(indexdef, indexname, '') AS defn pagila-# FROM pg_indexes pagila-# GROUP BY defn pagila-# HAVING count(*) > 1; indexes | defn ------------------------------------------------------------------------+------------------------------------------------------------------ {payment_p2017_01_customer_id_idx,idx_fk_payment_p2017_01_customer_id} | CREATE INDEX ON public.payment_p2017_01 USING btree (customer_id {payment_p2017_02_customer_id_idx,idx_fk_payment_p2017_02_customer_id} | CREATE INDEX ON public.payment_p2017_02 USING btree (customer_id {payment_p2017_03_customer_id_idx,idx_fk_payment_p2017_03_customer_id} | CREATE INDEX ON public.payment_p2017_03 USING btree (customer_id {idx_fk_payment_p2017_04_customer_id,payment_p2017_04_customer_id_idx} | CREATE INDEX ON public.payment_p2017_04 USING btree (customer_id {payment_p2017_05_customer_id_idx,idx_fk_payment_p2017_05_customer_id} | CREATE INDEX ON public.payment_p2017_05 USING btree (customer_id {idx_fk_payment_p2017_06_customer_id,payment_p2017_06_customer_id_idx} | CREATE INDEX ON public.payment_p2017_06 USING btree (customer_id (6 rows) 

рд╕реБрдкрд░рд╕реЗрдЯ рд╕реВрдЪрдХрд╛рдВрдХ


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

рдпрджрд┐ рдЖрдкрдХреЛ рдРрд╕реЗ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк pg_cex рд╕реЗ pg_catalog рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдкреНрд░рд╛рд░рдВрдн рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдкреНрд░рдпреБрдХреНрдд рд╕реВрдЪрдХрд╛рдВрдХ


рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рдХреНрд╡реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ рдЬреЛрдбрд╝реЗ рдЧрдП рдЗрдВрдбреЗрдХреНрд╕ рдЕрдм рдХрд┐рд╕реА рднреА рдХреНрд╡реЗрд░реА рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЬрдм рднреА рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рд╕реНрдХреИрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рд╕рд╛рдВрдЦреНрдпрд┐рдХреА рдкреНрд░рдмрдВрдзрдХ рджреНрд╡рд╛рд░рд╛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ pg_stat_user_indexes рд╕рд┐рд╕реНрдЯрдо рдХреИрдЯрд▓реЙрдЧ pg_stat_user_indexes рдЖрдк idx_scan рдорд╛рди рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рд╕рдВрдЪрдпреА рдХрд╛рдЙрдВрдЯрд░ рд╣реИред рдЗрд╕ рдорд╛рди рдХреЛ рд╕рдордп рдХреЗ рд╕рд╛рде рдЯреНрд░реИрдХ рдХрд░рдирд╛ (рдЬреИрд╕реЗ, рдПрдХ рдорд╣реАрдирд╛) рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рджреЗрдЧрд╛ рдХрд┐ рдХреМрди рд╕реЗ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣рд╛рдВ 'public' рд╕реНрдХреАрдорд╛ рдореЗрдВ рд╕рднреА рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕реНрдХреИрди рдХрд╛рдЙрдВрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рд╣реИ:

 SELECT relname, indexrelname, idx_scan FROM pg_catalog.pg_stat_user_indexes WHERE schemaname = 'public'; with output like this: pagila=# SELECT relname, indexrelname, idx_scan pagila-# FROM pg_catalog.pg_stat_user_indexes pagila-# WHERE schemaname = 'public' pagila-# LIMIT 10; relname | indexrelname | idx_scan ---------------+--------------------+---------- customer | customer_pkey | 32093 actor | actor_pkey | 5462 address | address_pkey | 660 category | category_pkey | 1000 city | city_pkey | 609 country | country_pkey | 604 film_actor | film_actor_pkey | 0 film_category | film_category_pkey | 0 film | film_pkey | 11043 inventory | inventory_pkey | 16048 (10 rows) 

рдХрдо рддрд╛рд▓реЛрдВ рд╡рд╛рд▓реЗ рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рдПрдВ


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

рд╕рдорд╛рдирд╛рдВрддрд░ рдЗрдВрдбреЗрдХреНрд╕ рдирд┐рд░реНрдорд╛рдг рд╕рдХреНрд╖рдо рдХрд░реЗрдВ


PostgreSQL 11 рдореЗрдВ, рдмреА-рдЯреНрд░реА рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рдирд╛ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рд╣реИред рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдИ рд╕рдорд╛рдирд╛рдВрддрд░ рд╢реНрд░рдорд┐рдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдпреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕реЗрдЯ рд╣реИрдВ:

 SET max_parallel_workers = 32; SET max_parallel_maintenance_workers = 16; 

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

рдкреГрд╖реНрдарднреВрдорд┐ рд╕реВрдЪрдХрд╛рдВрдХ рдирд┐рд░реНрдорд╛рдг


рдЖрдк рдХреНрд░рд┐рдПрдЯ рдЗрдВрдбреЗрдХреНрд╕ рдХрдорд╛рдВрдб рдХреЗ CONCURRENTLY рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:

 pagila=# CREATE INDEX CONCURRENTLY idx_address1 ON address(district); CREATE INDEX 


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

Postgres рдЕрдиреБрдХреНрд░рдорд┐рдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд▓рдЪреАрд▓реЗ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ, рд╕рд╛рде рд╣реА рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдХреА рд╡рд┐рд╕реНрдлреЛрдЯрдХ рд╡реГрджреНрдзрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЖрд╢рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпреЗ рдпреБрдХреНрддрд┐рдпрд╛рдВ рдЖрдкрдХреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд╢реАрдШреНрд░рддрд╛ рд╕реЗ рдФрд░ рдЖрдкрдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдкреИрдорд╛рдирд╛ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреАред

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


All Articles