
Π ΡΠ²Π΅ΡΠ° Π½Π° Postgres ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ΅ ΠΈΠ³ΡΠ°ΡΡ ΠΈΠ·ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π²Π°ΠΆΠ½Π° ΡΠΎΠ»Ρ Π·Π° Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½Π°ΡΠ° Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡ Π² Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ Π½Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ (ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ ΠΊΠ°ΡΠΎ βheapβ). Postgres Π½Π΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΠΊΠ»ΡΡΡΠ΅ΡΠΈΡΠ°Π½Π΅ Π·Π° Π½Π΅Π³ΠΎ, Π° Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ° MVCC Π²ΠΎΠ΄ΠΈ Π΄ΠΎ Π½Π°ΡΡΡΠΏΠ²Π°Π½Π΅ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ Π²Π΅ΡΡΠΈΠΈ Π½Π° Π΅Π΄ΠΈΠ½ ΠΈ ΡΡΡΠΈ ΠΊΠΎΡΡΠ΅ΠΆ. ΠΠ°ΡΠΎΠ²Π° Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π²Π°ΠΆΠ½ΠΎ Π΄Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΠ·Π΄Π°Π²Π°ΡΠ΅ ΠΈ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°ΡΠ΅ Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ Π·Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ°.
ΠΡΠ΅Π΄ΡΡΠ°Π²ΡΠΌ Π²ΠΈ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΡΠ²Π΅ΡΠ° Π·Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΈ ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π°Π½Π΅ Π½Π° ΡΠΏΠΎΡΡΠ΅Π±Π°ΡΠ° Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ΅.
ΠΠ°Π±Π΅Π»Π΅ΠΆΠΊΠ°: ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΈΡΠ΅ ΠΏΠΎ-Π΄ΠΎΠ»Ρ Π·Π°ΡΠ²ΠΊΠΈ ΡΠ°Π±ΠΎΡΡΡ Π½Π° Π½Π΅ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠ°Π½ΠΈΡ .
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠΊΡΠΈΠ²Π°ΡΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ (Covering Indexes).
ΠΠ΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π·Π°ΡΠ²ΠΊΠ° Π·Π° ΠΈΠ·Π²Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΈΠΌΠ΅ΠΉΠ»ΠΈ Π½Π° Π½Π΅Π°ΠΊΡΠΈΠ²Π½ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ. Π ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° customer ΠΈΠΌΠ° ΠΊΠΎΠ»ΠΎΠ½Π° Π°ΠΊΡΠΈΠ²Π½ΠΎ, Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ° Π΅ Π½Π΅ΡΠ»ΠΎΠΆΠ½Π°:
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ΠΠ΅ΠΊΠ° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΠΈΠ½Π΄Π΅ΠΊΡ Π·Π° ΠΊΠΎΠ»ΠΎΠ½Π°ΡΠ° Π°ΠΊΡΠΈΠ²Π½ΠΎ:
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β, Π° ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈ Π΄Π° ΡΡΡΡΠΈ Π² heap-Π° Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ°, Π·Π° Π΄Π° ΠΏΡΠΎΡΠ΅ΡΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° Π΄ΡΡΠ³ΠΈΡΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΈ (Π² ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ, ΠΊΠΎΠ»ΠΎΠ½Π°ΡΠ° email), ΠΊΠΎΠΈΡΠΎ ΡΠ° Π½ΡΠΆΠ½ΠΈ Π·Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ°.
Π PostgreSQL 11 ΡΠ΅ ΠΏΠΎΡΠ²ΠΈΡ Π° ΠΏΠΎΠΊΡΠΈΠ²Π°ΡΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ. Π’Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ Π²ΠΊΠ»ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π΅Π΄Π½Π° ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΈ β ΡΠ΅Ρ Π½ΠΈΡΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π°Ρ Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅ Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠ°.
ΠΠΊΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ
ΠΌΠ΅ ΡΠ°Π·ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ
ΠΌΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Π½Π° ΠΈΠΌΠ΅ΠΉΠ»Π° Π² ΠΈΠ½Π΄Π΅ΠΊΡΠ°, Postgres Π½ΡΠΌΠ° Π΄Π° ΡΠ΅ Π½Π°Π»Π°Π³Π° Π΄Π° ΡΡΡΡΠΈ Π² heap-Π° Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° 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β Π½ΠΈ ΠΊΠ°Π·Π²Π°, ΡΠ΅ Π½Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ° Π²Π΅ΡΠ΅ ΠΉ Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ΅Π½ ΡΠ°ΠΌΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΡΡ, ΠΊΠΎΠ΅ΡΠΎ ΠΏΠΎΠΌΠ°Π³Π° Π΄Π° ΡΠ΅ ΠΈΠ·Π±Π΅Π³Π½Π°Ρ Π²ΡΠΈΡΠΊΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π·Π° Π²ΡΠ²Π΅ΠΆΠ΄Π°Π½Π΅/ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ Π΄ΠΈΡΠΊΠ° Π·Π° ΡΠ΅ΡΠ΅Π½Π΅ Π½Π° heap-Π° Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ°.
Π Π΄Π½Π΅ΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΏΠΎΠΊΡΠΈΠ²Π°ΡΠΈΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ ΡΠ° Π½Π°Π»ΠΈΡΠ½ΠΈ ΡΠ°ΠΌΠΎ Π·Π° B-Π΄Π΅ΡΠ΅Π²Π°ΡΠ°. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, Π² ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΡΡΠΈΠ»ΠΈΡΡΠ° Π·Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΏΠΎ-Π²ΠΈΡΠΎΠΊΠΈ.
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΠ°ΡΡΠΈΡΠ½ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ
Π§Π°ΡΡΠΈΡΠ½ΠΈΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°Ρ ΡΠ°ΠΌΠΎ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΎΡ ΡΠ΅Π΄ΠΎΠ²Π΅ΡΠ΅ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ°. Π’ΠΎΠ²Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΠ΅ ΡΠΏΠ΅ΡΡΠΈ ΡΠ°Π·ΠΌΠ΅ΡΡΡ Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ΅ ΠΈ ΠΏΠΎ-Π±ΡΡΠ·ΠΎ Π΄Π° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΡΠΊΠ°Π½ΠΈΡΠ°Π½Π΅.
ΠΠ° ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΠ΅ Π½ΠΈ ΡΡΡΠ±Π²Π° ΡΠΏΠΈΡΡΠΊ Ρ ΠΈΠΌΠ΅ΠΉΠ» Π°Π΄ΡΠ΅ΡΠΈΡΠ΅ Π½Π° Π½Π°ΡΠΈΡΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠΈ ΠΎΡ ΠΠ°Π»ΠΈΡΠΎΡΠ½ΠΈΡ. ΠΠ°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ ΡΠ°ΠΊΠΎΠ²Π°:
SELECT c.email FROM customer c
JOIN address a ON c.address_id = a.address_id
WHERE a.district = 'California';
ΠΊΠΎΠ΅ΡΠΎ ΠΈΠΌΠ° ΠΏΠ»Π°Π½ Π·Π° Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅, ΠΊΠΎΠΉΡΠΎ Π²ΠΊΠ»ΡΡΠ²Π° ΡΠΊΠ°Π½ΠΈΡΠ°Π½Π΅ Π½Π° Π΄Π²Π΅ΡΠ΅ ΡΠ²ΡΡΠ·Π°Π½ΠΈ ΡΠ°Π±Π»ΠΈΡΠΈ:
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.
Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΡΠΎΠ²Π° Π΅ ΡΠ΅ΡΡΠΎ ΡΡΠ΅ΡΠ°Π½ΠΎ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½ΠΎ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ ΠΈΠ½Π΄Π΅ΠΊΡ, ΠΊΠΎΠΉΡΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ° ΡΠ°ΠΌΠΎ ΡΠ΅Π·ΠΈ ΡΠ΅Π΄ΠΎΠ²Π΅ Ρ Π°Π΄ΡΠ΅ΡΠΈ, Π² ΠΊΠΎΠΈΡΠΎ ΡΠ°ΠΉΠΎΠ½ΡΡ βΠΠ°Π»ΠΈΡΠΎΡΠ½ΠΈΡβ:
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.
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎΠ·Π½Π°ΡΠ½ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ (Multi-Value Indexes)
ΠΡΠΊΠΎΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π°Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°Π½ΠΈ, ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π΅ ΡΡΠ΄ΡΡΠΆΠ°Ρ ΡΠΊΠ°Π»Π°ΡΠ΅Π½ ΡΠΈΠΏ Π΄Π°Π½Π½ΠΈ. Π’ΠΈΠΏΠΎΠ²Π΅ ΠΊΠΎΠ»ΠΎΠ½ΠΈ ΠΊΠ°ΡΠΎ jsonb, ΠΌΠ°ΡΠΈΠ²ΠΈ ΠΈ tsvector ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡΠ΄ΡΡΠΆΠ°Ρ ΡΠ»ΠΎΠΆΠ½ΠΈ ΠΈΠ»ΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ. ΠΠΊΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ΅ ΡΠ°ΠΊΠΈΠ²Π° ΠΊΠΎΠ»ΠΎΠ½ΠΈ, ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΡΡΠΈΡΠ΅ Π·Π° Π²ΡΠΈΡΠΊΠΈ ΠΎΡΠ΄Π΅Π»Π½ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ Π² ΡΠ΅Π·ΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΈ.
ΠΠ΅ΠΊΠ° Π΄Π° ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΠΌ Π·Π°Π³Π»Π°Π²ΠΈΡΡΠ° Π½Π° Π²ΡΠΈΡΠΊΠΈ ΡΠΈΠ»ΠΌΠΈ, ΡΡΠ΄ΡΡΠΆΠ°ΡΠΈ ΠΈΠ·ΡΠ΅Π·ΠΊΠΈ ΠΎΡ Π½Π΅ΡΡΠΏΠ΅ΡΠ½ΠΈ Π΄ΡΠ±Π»ΡΠΎΡΠΈ. Π ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° film ΠΈΠΌΠ° ΡΠ΅ΠΊΡΡΠΎΠ²Π° ΠΊΠΎΠ»ΠΎΠ½Π°, Π½Π°ΡΠ΅ΡΠ΅Π½Π° special_features. ΠΠΊΠΎ ΡΠΈΠ»ΠΌΡΡ ΠΈΠΌΠ° ΡΠΎΠ²Π° βΠΎΡΠΎΠ±Π΅Π½ΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎβ, Π² ΠΊΠΎΠ»ΠΎΠ½Π°ΡΠ° Π΅ Π·Π°ΠΏΠΈΡΠ°Π½ Π΅Π»Π΅ΠΌΠ΅Π½Ρ ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° ΡΠ΅ΠΊΡΡΠΎΠ² ΠΌΠ°ΡΠΈΠ² ΠΠ°Π΄ ΠΊΡΠ»ΠΈΡΠΈΡΠ΅. ΠΠ° Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΠΌ Π²ΡΠΈΡΠΊΠΈ ΡΠ°ΠΊΠΈΠ²Π° ΡΠΈΠ»ΠΌΠΈ, ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·Π±Π΅ΡΠ΅ΠΌ Π²ΡΠΈΡΠΊΠΈ ΡΠ΅Π΄ΠΎΠ²Π΅ Ρ βΠΠ°Π΄ ΠΊΡΠ»ΠΈΡΠΈΡΠ΅β ΠΏΡΠΈ Π²ΡΡΠΊΠ°ΠΊΠ²ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ Π½Π° ΠΌΠ°ΡΠΈΠ²Π° special_features:
SELECT title FROM film WHERE special_features @> '{"Behind The Scenes"}'; ΠΠΏΠ΅ΡΠ°ΡΠΎΡΡΡ Π½Π° ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ (containment operator) @> ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° Π΄Π°Π»ΠΈ Π΄ΡΡΠ½Π°ΡΠ° ΡΠ°ΡΡ Π΅ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π½Π° Π»ΡΠ²Π°ΡΠ° ΡΠ°ΡΡ.
ΠΠ»Π°Π½ Π½Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ°:
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.
ΠΠ° Π²ΠΈΠ΄ΠΈΠΌ Π΄Π°Π»ΠΈ Π½ΠΈ ΠΏΠΎΠΌΠ°Π³Π° ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ ΠΈΠ½Π΄Π΅ΠΊΡ Π½Π° B-Π΄Π΅ΡΠ΅Π²ΠΎ:
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)ΠΠ½Π΄Π΅ΠΊΡΡΡ Π΄ΠΎΡΠΈ Π½Π΅ Π±Π΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°Π½. ΠΠ½Π΄Π΅ΠΊΡΡΡ Π½Π° B-Π΄Π΅ΡΠ΅Π²ΠΎ Π½Π΅ ΠΎΡΡΠ·Π½Π°Π²Π° ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΎΡΠ΄Π΅Π»Π½ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ Π² ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°Π½ΠΈΡΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ.
ΠΡΠΆΠ΄Π°Π΅ΠΌ ΡΠ΅ ΠΎΡ 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;
Π Π΅ΡΠΎ ΠΈ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ°, ΠΊΠΎΠ³Π°ΡΠΎ Π±ΡΠ΄Π΅ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΎ Π½Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ pagila:
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 ΡΠ΅Π΄Π°)
ΠΠ½Π΄Π΅ΠΊΡΠΈ Π½Π° Π½Π°Π΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° (Superset Indexes)
ΠΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ»ΡΡΠΈ ΡΠ°ΠΊΠ°, ΡΠ΅ Π΄Π° ΠΈΠΌΠ°ΡΠ΅ Π½Π°ΡΡΡΠΏΠ°Π½ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ, Π΅Π΄ΠΈΠ½ ΠΎΡ ΠΊΠΎΠΈΡΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ° Π½Π°Π΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΎΡ ΠΊΠΎΠ»ΠΎΠ½ΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°Ρ Π΄ΡΡΠ³ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ. Π’ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΆΠ΅Π»Π°ΡΠ΅Π»Π½ΠΎ, Π½ΠΎ ΠΈ Π½Π΅ β Π½Π°Π΄ΠΌΠ½ΠΎΠΆΡΡΠ²ΠΎΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ ΡΠΊΠ°Π½ΠΈΡΠ°Π½Π΅ ΡΠ°ΠΌΠΎ ΠΏΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ, ΠΊΠΎΠ΅ΡΠΎ Π΅ Π΄ΠΎΠ±ΡΠ΅, Π½ΠΎ ΡΡΡΠ΅Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π·Π°Π΅ΠΌΠ° ΡΠ²ΡΡΠ΄Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΡΡΡΠΎ, ΠΈΠ»ΠΈ Π·Π°ΡΠ²ΠΊΠ°ΡΠ°, Π·Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΡΡΠΎ Π΅ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΎ ΡΠΎΠ²Π° Π½Π°Π΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ, Π²Π΅ΡΠ΅ Π΄Π° Π½Π΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°.
ΠΠΊΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π΅ΡΠΎ Π½Π° ΡΠ°ΠΊΠΈΠ²Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅ Ρ ΠΎΡ ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° pg_catalog.
ΠΠ΅ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ
Π‘ ΡΠ°Π·Π²ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ°, ΠΊΠΎΠΈΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ, ΡΠ΅ ΡΠ°Π·Π²ΠΈΠ²Π°Ρ ΠΈ Π·Π°ΡΠ²ΠΊΠΈΡΠ΅, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ ΠΎΡ ΡΡΡ
. ΠΠ½Π΄Π΅ΠΊΡΠΈΡΠ΅, Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ ΠΏΡΠ΅Π΄ΠΈ ΡΠΎΠ²Π°, ΠΌΠΎΠΆΠ΅ Π²Π΅ΡΠ΅ Π΄Π° Π½Π΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΎΡ Π½ΠΈΡΠΎ Π΅Π΄Π½Π° Π·Π°ΡΠ²ΠΊΠ°. ΠΡΠΈ Π²ΡΡΠΊΠΎ ΡΠΊΠ°Π½ΠΈΡΠ°Π½Π΅ Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΡΠΎΠΉ ΡΠ΅ ΠΎΡΠ±Π΅Π»ΡΠ·Π²Π° ΠΎΡ Π΄ΠΈΡΠΏΠ΅ΡΠ΅ΡΠ° Π½Π° ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ°ΡΠ°, ΠΈ Π² ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠ½Π΅ΡΠΎ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ pg_stat_user_indexes ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° idx_scan, ΠΊΠΎΠΉΡΠΎ Π΅ ΠΊΡΠΌΡΠ»Π°ΡΠΈΠ²Π΅Π½ Π±ΡΠΎΡΡ. ΠΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ°Π·ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡ Π·Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ ΠΏΠ΅ΡΠΈΠΎΠ΄ ΠΎΡ Π²ΡΠ΅ΠΌΠ΅ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠ΅ΡΠ΅Ρ) ΡΠ΅ Π΄Π°Π΄Π΅ Π΄ΠΎΠ±ΡΠ° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π° Π·Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ Π½Π΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΈΠ·ΡΡΠΈΡΠΈ.
ΠΡΠΎ Π·Π°ΡΠ²ΠΊΠ° Π·Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ Π½Π° ΡΠ΅ΠΊΡΡΠΈΡΠ΅ Π±ΡΠΎΡΡΠΈΡΠ΅ Π·Π° ΡΠΊΠ°Π½ΠΈΡΠ°Π½Π΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ Π² ΡΡ
Π΅ΠΌΠ°ΡΠ° 'public':
SELECT relname, indexrelname, idx_scan
FROM pg_catalog.pg_stat_user_indexes
WHERE schemaname = 'public';
Ρ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ ΠΎΡ ΡΠΎΠ·ΠΈ Π²ΠΈΠ΄:
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 ΡΠ΅Π΄Π°)ΠΡeΡΠΎΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ΅ Ρ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ
Π§Π΅ΡΡΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π°Ρ ΠΏΡΠ΅ΡΠ΅ΠΌΠΎΠ½ΡΠΈΡΠ°Π½ΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅ ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π°Ρ ΡΠ°Π·ΠΌΠ΅ΡΠΈΡΠ΅ ΠΈΠΌ, ΠΈ ΠΏΡΠ΅ΡΠ΅ΠΌΠΎΠ½ΡΠΈΡΠ°Π½Π΅ΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡΠΊΠΎΡΠΈ ΡΠΊΠ°Π½ΠΈΡΠ°Π½Π΅ΡΠΎ. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΏΠΎΠ²ΡΠ΅Π΄Π΅Π½ΠΈ. ΠΡΠΎΠΌΡΠ½Π°ΡΠ° Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΡΡΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·ΠΈΡΠΊΠ²Π° Π½Π΅Π³ΠΎΠ²ΠΎΡΠΎ ΠΏΡΠ΅ΡΠ΅ΠΌΠΎΠ½ΡΠΈΡΠ²Π°Π½Π΅.
ΠΠΊΡΠΈΠ²ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠ°ΡΠ°Π»Π΅Π»Π½ΠΎ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈ
Π 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 ΠΏΡΠ΅Π΄Π»Π°Π³Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π³ΡΠ²ΠΊΠ°Π²ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈ ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π½Π° Π²ΡΡΠΊΠ°ΠΊΠ²ΠΈ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈ ΡΠ»ΡΡΠ°ΠΈ, Π° ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΠΏΡΠ΅Π΄Π»Π°Π³Π° Π½Π°ΡΠΈΠ½ΠΈ Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ Π² ΡΠ»ΡΡΠ°ΠΉ Π½Π° Π΅ΠΊΡΠΏΠ»ΠΎΠ·ΠΈΠ²Π΅Π½ ΡΠ°ΡΡΠ΅ΠΆ Π½Π° Π²Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠΠ°Π΄ΡΠ²Π°ΠΌΠ΅ ΡΠ΅ ΡΠ΅Π·ΠΈ ΡΡΠ²Π΅ΡΠΈ Π΄Π° Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π°Ρ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ Π·Π°ΠΏΠΈΡΠ²Π°Π½ΠΈΡΡΠ° Π±ΡΡΠ·ΠΈ ΠΈ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ Π³ΠΎΡΠΎΠ²Π° Π·Π° ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°Π½Π΅.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
