PostgreSQL рдордзреАрд▓ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХрд╛рдВрдЪреА рд╕рд░реНрд╡ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпреЗ рд╡рд╛рдкрд░рдгреЗ

PostgreSQL рдордзреАрд▓ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХрд╛рдВрдЪреА рд╕рд░реНрд╡ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпреЗ рд╡рд╛рдкрд░рдгреЗ
рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕ рдЬрдЧрд╛рдд, рдбреЗрдЯрд╛рдмреЗрд╕рдЪреНрдпрд╛ рд╕реНрдЯреЛрд░реЗрдЬрдЪреНрдпрд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдо рдиреЗрд╡реНрд╣рд┐рдЧреЗрд╢рдирд╕рд╛рдареА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗрдд (рдЬреНрдпрд╛рд▓рд╛ "рдвреАрдЧ" рдореНрд╣рдгрддрд╛рдд). рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕ рдпрд╛рд╕рд╛рдареА рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧрд▓рд╛ рд╕рдкреЛрд░реНрдЯ рдХрд░рдд рдирд╛рд╣реА рдЖрдгрд┐ MVCC рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рдПрдХрд╛рдЪ рдЯреНрдпреБрдкрд▓рдЪреНрдпрд╛ рдЕрдиреЗрдХ рдЖрд╡реГрддреНрддреНрдпрд╛рдВрд╕рд╣ рд╕рдорд╛рдкреНрдд рдХрд░рдгреНрдпрд╛рд╕ рдкреНрд░рд╡реГрддреНрдд рдХрд░рддреЗ. рдореНрд╣рдгреВрди, рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдВрдирд╛ рд╕рдорд░реНрдерди рджреЗрдгреНрдпрд╛рд╕рд╛рдареА рдХрд╛рд░реНрдпрдХреНрд╖рдо рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдд рдЖрдгрд┐ рд░рд╛рдЦрдгреНрдпрд╛рдд рд╕рдХреНрд╖рдо рдЕрд╕рдгреЗ рдЦреВрдк рдорд╣рддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ.

рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХрд╛рдВрдЪрд╛ рд╡рд╛рдкрд░ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЭ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд╕реБрдзрд╛рд░рдгреНрдпрд╛рд╕рд╛рдареА рдпреЗрдереЗ рдХрд╛рд╣реА рдЯрд┐рдкрд╛ рдЖрд╣реЗрдд.

рдЯреАрдк: рдЦрд╛рд▓реА рджрд░реНрд╢рд╡рд┐рд▓реЗрд▓реНрдпрд╛ рдХреНрд╡реЗрд░реА рдмрджрд▓ рди рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╡рд░ рдХрд╛рд░реНрдп рдХрд░рддрд╛рдд pagila рдирдореБрдирд╛ рдбреЗрдЯрд╛рдмреЗрд╕.

рдХрд╡реНрд╣рд░рд┐рдВрдЧ рдЗрдВрдбреЗрдХреНрд╕реЗрд╕ рд╡рд╛рдкрд░рдгреЗ

рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрд╕рд╛рдареА рдИрдореЗрд▓ рдкрддреНрддреЗ рдХрд╛рдврдгреНрдпрд╛рдЪреА рд╡рд┐рдирдВрддреА рдкрд╛рд╣реВ. рдЯреЗрдмрд▓ 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" рдпрд╛рдЪрд╛ рдЕрд░реНрде рдЕрд╕рд╛ рдХреА рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╕реНрдХреЕрди рдХрд░реЗрд▓ "idx_cust1", рдЖрдгрд┐ рдирдВрддрд░ рдЗрддрд░ рд╕реНрддрдВрднрд╛рдВрдЪреА рдореВрд▓реНрдпреЗ рд╡рд╛рдЪрдгреНрдпрд╛рд╕рд╛рдареА рдЯреЗрдмрд▓ рд╣реАрдк рд╢реЛрдзрдгреЗ рд╕реБрд░реВ рдареЗрд╡рд╛ (рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рд╕реНрддрдВрдн email) рдЬреНрдпрд╛рдЪреА рдХреНрд╡реЗрд░реА рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

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

рдЬрд░ рдЖрдореНрд╣реА рдпрд╛ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпрд╛рдЪрд╛ рдлрд╛рдпрджрд╛ рдШреЗрддрд▓рд╛ рдЖрдгрд┐ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХрд╛рдд рдИрдореЗрд▓ рдореВрд▓реНрдп рдЬреЛрдбрд▓реЗ, рддрд░ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕рд▓рд╛ рдореВрд▓реНрдпрд╛рд╕рд╛рдареА рдЯреЗрдмрд▓ рд╣реАрдк рд╢реЛрдзрдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╛рд╣реА. 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рдЖрдгрд┐ рдирдВрддрд░ рдвреАрдЧ рд╕реНрдХреЕрди рдХреЗрд▓рд╛ 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 рд╕рдВрдорд┐рд╢реНрд░ рдХрд┐рдВрд╡рд╛ рдПрдХрд╛рдзрд┐рдХ рдореВрд▓реНрдпреЗ рдЖрд╣реЗрдд. рддреБрдореНрд╣рд╛рд▓рд╛ рдЕрд╕реЗ рд╕реНрддрдВрдн рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рд╛рдпрдЪреЗ рдЕрд╕рд▓реНрдпрд╛рд╕, рддреБрдореНрд╣рд╛рд▓рд╛ рддреНрдпрд╛ рд╕реНрддрдВрднрд╛рдВрдордзреАрд▓ рд╕рд░реНрд╡ рд╡реИрдпрдХреНрддрд┐рдХ рдореВрд▓реНрдпреЗ рд╢реЛрдзрд╛рд╡реА рд▓рд╛рдЧрддреАрд▓.

рдЕрдпрд╢рд╕реНрд╡реА рдЯреЗрдХрдордзреВрди рдХрдЯ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╕рд░реНрд╡ рдЪрд┐рддреНрд░рдкрдЯрд╛рдВрдЪреА рд╢реАрд░реНрд╖рдХреЗ рд╢реЛрдзрдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реВрдпрд╛. рдЯреЗрдмрд▓ 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 рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдЕрдиреБрдХреНрд░рдорд┐рдд рд╕рдВрдорд┐рд╢реНрд░ рдореВрд▓реНрдпрд╛рдВрдЪреНрдпрд╛ рд╡рд┐рд░реВрджреНрдз рдПрдХрд▓ рдореВрд▓реНрдпрд╛рдВрдЪреЗ рдореЕрдкрд┐рдВрдЧ рдХрд░рдгреНрдпрд╛рд╕ рд╕рдорд░реНрдерди рджреЗрддреЗ, рдкрд░рд┐рдгрд╛рдореА рдХреНрд╡реЗрд░реА рдпреЛрдЬрдиреЗрдЪреА рдХрд┐рдВрдордд рдЕрд░реНрдзреНрдпрд╛рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдЖрд╣реЗ.

рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдЗрдВрдбреЗрдХреНрд╕реЗрд╕рдкрд╛рд╕реВрди рдореБрдХреНрдд рд╣реЛрдгреЗ

рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛рд▓рд╛рдВрддрд░рд╛рдиреЗ рдЬрдорд╛ рд╣реЛрддрд╛рдд рдЖрдгрд┐ рдХрд╛рд╣реАрд╡реЗрд│рд╛ рдирд╡реАрди рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХрд╛рдордзреНрдпреЗ рдорд╛рдЧреАрд▓рдкреИрдХреА рдПрдХ рд╕рд╛рд░рдЦреАрдЪ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЕрд╕реВ рд╢рдХрддреЗ. рдЗрдВрдбреЗрдХреНрд╕реЗрд╕рдЪреА рдорд╛рдирд╡реА-рд╡рд╛рдЪрдиреАрдп 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_index рдЯреЗрдмрд▓ рдкрд╛рд╕реВрди pg_catalog.

рди рд╡рд╛рдкрд░рд▓реЗрд▓реЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ

рдбреЗрдЯрд╛рдмреЗрд╕ рд╡рд╛рдкрд░рдгрд╛рд░реЗ рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕ рдЬрд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрддрд╛рдд, рддрд╕реЗ рддреЗ рд╡рд╛рдкрд░рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдХреНрд╡реЗрд░реА рджреЗрдЦреАрд▓ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрддрд╛рдд. рдЖрдзреА рдЬреЛрдбрд▓реЗрд▓реНрдпрд╛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдпрд╛рдкреБрдвреЗ рдХреЛрдгрддреНрдпрд╛рд╣реА рдХреНрд╡реЗрд░реАрджреНрд╡рд╛рд░реЗ рд╡рд╛рдкрд░рд▓реНрдпрд╛ рдЬрд╛рдгрд╛рд░ рдирд╛рд╣реАрдд. рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╕реНрдХреЕрди рдХреЗрд▓реНрдпрд╛рд╡рд░, рддреЗ рд╕рд╛рдВрдЦреНрдпрд┐рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХрд╛рджреНрд╡рд╛рд░реЗ рдЪрд┐рдиреНрд╣рд╛рдВрдХрд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ рдЖрдгрд┐ рд╕рд┐рд╕реНрдЯрдо рдХреЕрдЯрд▓реЙрдЧ рджреГрд╢реНрдпрд╛рдд 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 рдЖрдЬреНрдЮрд╛ CREATE INDEX:

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

рд╣реА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдкрджреНрдзрддреАрдкреЗрдХреНрд╖рд╛ рд╡реЗрдЧрд│реА рдЖрд╣реЗ рдХрд╛рд░рдг рддреНрдпрд╛рд▓рд╛ рдЯреЗрдмрд▓рд╡рд░ рд▓реЙрдХрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╕рддреЗ рдЖрдгрд┐ рддреНрдпрд╛рдореБрд│реЗ рд▓реЗрдЦрди рдСрдкрд░реЗрд╢рдиреНрд╕ рдмреНрд▓реЙрдХ рд╣реЛрдд рдирд╛рд╣реАрдд. рджреБрд╕рд░реАрдХрдбреЗ, рдпрд╛рд╕ рдЕрдзрд┐рдХ рд╡реЗрд│ рд▓рд╛рдЧрддреЛ рдЖрдгрд┐ рдЕрдзрд┐рдХ рд╕рдВрд╕рд╛рдзрдиреЗ рд▓рд╛рдЧрддрд╛рдд.

рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рдХреЛрдгрддреНрдпрд╛рд╣реА рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд░рдгрд╛рдВрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреНрдпрд╛рдЪреЗ рдорд╛рд░реНрдЧ рддрд╕реЗрдЪ рддреБрдордЪрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реНрдлреЛрдЯрдХрдкрдгреЗ рд╡рд╛рдврд▓реНрдпрд╛рд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рднрд░рдкреВрд░ рд▓рд╡рдЪрд┐рдХрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ. рдЖрдореНтАНрд╣рд╛рд▓рд╛ рдЖрд╢рд╛ рдЖрд╣реЗ рдХреА рдпрд╛ рдЯрд┐рдкрд╛ рддреБрдореНтАНрд╣рд╛рд▓рд╛ рддреБрдордЪреНтАНрдпрд╛ рдХреНтАНрд╡реЗрд░реА рдЬрд▓рдж рдЖрдгрд┐ рддреБрдордЪреНтАНрдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕рд▓рд╛ рдорд╛рдкрдирд╛рд╕рд╛рдареА рддрдпрд╛рд░ рдХрд░рдгреНтАНрдпрд╛рдд рдорджрдд рдХрд░рддреАрд▓.

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛