PostgreSQL рдореЗрдВ рдЗрдВрдбреЗрдХреНрд╕ рдХреА рд╕рднреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

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

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

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

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

рдЖрдЗрдП рдирд┐рд╖реНрдХреНрд░рд┐рдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдИрдореЗрд▓ рдкрддреЗ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд░ рдирдЬрд░ рдбрд╛рд▓реЗрдВред рдореЗрдЬ рдкрд░ 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", рдФрд░ рдлрд┐рд░ рдЕрдиреНрдп рдХреЙрд▓рдореЛрдВ рдХреЗ рдорд╛рдиреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЗрдмрд▓ рд╣реАрдк рдХреЛ рдЦреЛрдЬрдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, column 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 рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред

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

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

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

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

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ