PostgreSQL рдорд╛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рдХрд╛ рд╕рдмреИ рд╕реБрд╡рд┐рдзрд╛рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИ

PostgreSQL рдорд╛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рдХрд╛ рд╕рдмреИ рд╕реБрд╡рд┐рдзрд╛рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИ
Postgres рд╕рдВрд╕рд╛рд░рдорд╛, рдбрд╛рдЯрд╛рдмреЗрд╕ рднрдгреНрдбрд╛рд░рдгрдХреЛ рдХреБрд╢рд▓ рдиреЗрднрд┐рдЧреЗрд╕рдирдХрд╛ рд▓рд╛рдЧрд┐ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рд╣рд░реВ рдЖрд╡рд╢реНрдпрдХ рдЫрдиреН (рдЬрд╕рд▓рд╛рдИ "рд╣рд┐рдк" рднрдирд┐рдиреНрдЫ)ред Postgres рд▓реЗ рдпрд╕рдХреЛ рд▓рд╛рдЧрд┐ рдХреНрд▓рд╕реНрдЯрд░рд┐рдЩрд▓рд╛рдИ рд╕рдорд░реНрдерди рдЧрд░реНрджреИрди, рд░ 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) рдЬреБрди рдХреНрд╡реЗрд░реА рдЖрд╡рд╢реНрдпрдХ рдЫред

рдХрднрд░рд┐рдЩ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рд╣рд░реВ PostgreSQL 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 рдмрд╛рдЯ рдмрдЪреНрди рдорджреНрджрдд рдЧрд░реНрджрдЫред

рдХрднрд░рд┐рдЩ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рд╣рд░реВ рд╣рд╛рд▓ B-рдЯреНрд░реАрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдорд╛рддреНрд░ рдЙрдкрд▓рдмреНрдз рдЫрдиреНред рдпрджреНрдпрдкрд┐, рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛, рдорд░реНрдордд рдкреНрд░рдпрд╛рд╕ рдЙрдЪреНрдЪ рд╣реБрдиреЗрдЫред

рдЖрдВрд╢рд┐рдХ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИ

рдЖрдВрд╢рд┐рдХ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рд╣рд░реВ рддрд╛рд▓рд┐рдХрд╛рдорд╛ рдкрдЩреНрдХреНрддрд┐рд╣рд░реВрдХреЛ рдЙрдкрд╕рдореВрд╣ рдорд╛рддреНрд░ рд╣реБрдиреНред рдпрд╕рд▓реЗ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рдХреЛ рд╕рд╛рдЗрдЬ рдмрдЪрдд рдЧрд░реНрдЫ рд░ рд╕реНрдХреНрдпрд╛рдирд▓рд╛рдИ рдЫрд┐рдЯреЛ рдмрдирд╛рдЙрдБрдЫред

рдорд╛рдиреМрдВ рд╣рд╛рдореА рдХреНрдпрд╛рд▓рд┐рдлреЛрд░реНрдирд┐рдпрд╛рдорд╛ рд╣рд╛рдореНрд░рд╛ рдЧреНрд░рд╛рд╣рдХрд╣рд░реВрдХреЛ рдЗрдореЗрд▓ рдареЗрдЧрд╛рдирд╛рд╣рд░реВрдХреЛ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреМрдВред рдЕрдиреБрд░реЛрдз рдпрд╕ рдкреНрд░рдХрд╛рд░ рд╣реБрдиреЗрдЫ:

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 рдорд╛, рдПрдХ B-Tree рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╕рд┐рд░реНрдЬрдирд╛ рд╕рдорд╡рд░реНрддреА рдЫред рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛рд▓рд╛рдИ рдЧрддрд┐ рджрд┐рди, рдзреЗрд░реИ рд╕рдорд╛рдирд╛рдиреНрддрд░ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рдпрджреНрдпрдкрд┐, рдпреА рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рд╕рд╣реА рд░реВрдкрдорд╛ рд╕реЗрдЯ рдЧрд░рд┐рдПрдХреЛ рдЫ рднрдиреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрдиреБрд╣реЛрд╕реН:

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

рдпреЛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рд╛рдорд╛рдиреНрдп рднрдиреНрджрд╛ рдлрд░рдХ рдЫ рдХрд┐ рдпрд╕рд▓рд╛рдИ рдЯреЗрдмрд▓рдорд╛ рд▓рдХ рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрджреИрди, рд░ рддреНрдпрд╕реИрд▓реЗ рд▓реЗрдЦрди рдХрд╛рд░реНрдпрд╣рд░реВ рд░реЛрдХреНрджреИрдиред рдЕрд░реНрдХреЛрддрд░реНрдл, рдпрд╕рд▓реЗ рдмрдвреА рд╕рдордп рд▓рд┐рдиреНрдЫ рд░ рдердк рд╕реНрд░реЛрддрд╣рд░реВ рдЦрдкрдд рдЧрд░реНрджрдЫред

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

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди