
Π ΡΠ²Π΅ΡΠ° Π½Π° Postgres ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ΅ ΡΠ° ΠΈΠ·ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π²Π°ΠΆΠ½ΠΈ Π·Π° Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½Π°ΡΠ° Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡ Π² Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ Π½Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ (Π½Π°ΡΠ΅ΡΠ΅Π½ΠΎ βΠΊΡΡΠ°β, heap). Postgres Π½Π΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΠΊΠ»ΡΡΡΠ΅ΡΠΈΡΠ°Π½Π΅ Π·Π° Π½Π΅Π³ΠΎ, Π° Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ° MVCC Π²ΠΎΠ΄ΠΈ Π΄ΠΎ Π½Π°ΡΡΡΠΏΠ²Π°Π½Π΅ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ Π²Π΅ΡΡΠΈΠΈ Π½Π° Π΅Π΄ΠΈΠ½ ΠΈ ΡΡΡΠΈ ΠΊΠΎΡΡΠ΅ΠΆ. ΠΠ°ΡΠΎΠ²Π° Π΅ ΠΈΠ·ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π²Π°ΠΆΠ½ΠΎ Π΄Π° Π·Π½Π°Π΅ΡΠ΅ ΠΊΠ°ΠΊ Π΄Π° ΡΡΠ·Π΄Π°Π²Π°ΡΠ΅ ΠΈ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°ΡΠ΅ Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ Π·Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΡΠ΅Π΄Π»Π°Π³Π°ΠΌ Π²ΠΈ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΡΠ²Π΅ΡΠ° Π·Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΈ ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ΅.
ΠΠ°Π±Π΅Π»Π΅ΠΆΠΊΠ°: ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΈΡΠ΅ ΠΏΠΎ-Π΄ΠΎΠ»Ρ Π·Π°ΡΠ²ΠΊΠΈ ΡΠ°Π±ΠΎΡΡΡ Π½Π° Π½Π΅ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠ°Π½ΠΈΡ .
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠΊΡΠΈΠ²Π°ΡΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ (Covering Indexes)
ΠΠ΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π·Π°ΡΠ²ΠΊΠ° Π·Π° ΠΈΠ·Π²Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΈΠΌΠ΅ΠΉΠ» Π°Π΄ΡΠ΅ΡΠΈ Π½Π° Π½Π΅Π°ΠΊΡΠΈΠ²Π½ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ. Π ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° 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β, Π° ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈ Π΄Π° ΡΡΡΡΠΈ Π² ΠΊΡΠΏΡΠΈΠ½Π°ΡΠ° Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ°, Π·Π° Π΄Π° ΠΏΡΠΎΡΠ΅ΡΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° Π΄ΡΡΠ³ΠΈΡΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΈ (Π² ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ, ΠΊΠΎΠ»ΠΎΠ½Π°ΡΠ° ΠΈΠΌΠ΅ΠΉΠ»), ΠΊΠΎΠΈΡΠΎ ΡΠ° Π½ΡΠΆΠ½ΠΈ Π½Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ°.
Π PostgreSQL 11 ΡΠ΅ ΠΏΠΎΡΠ²ΠΈΡ Π° ΠΏΠΎΠΊΡΠΈΠ²Π°ΡΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ. Π’Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ Π²ΠΊΠ»ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π΅Π΄Π½Π° ΠΈΠ»ΠΈ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΈ Π² ΡΠ°ΠΌΠΈΡ ΠΈΠ½Π΄Π΅ΠΊΡ β ΡΠ΅Ρ Π½ΠΈΡΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π°Ρ Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠ°.
ΠΠΊΠΎ Π±ΡΡ
ΠΌΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π»ΠΈ ΡΠ°Π·ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Π½Π° ΠΈΠΌΠ΅ΠΉΠ»Π° Π² ΠΈΠ½Π΄Π΅ΠΊΡΠ°, ΡΠΎ Π½Π° Postgres Π½Π΅ Π±ΠΈ Π±ΠΈΠ»ΠΎ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΡΡΡΠΈ Π² ΠΊΡΠΏΡΠΈΠ½Π°ΡΠ° Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° ΠΈΠΌΠ΅ΠΉΠ». ΠΠ΅ΠΊΠ° Π²ΠΈΠ΄ΠΈΠΌ Π΄Π°Π»ΠΈ ΡΠΎΠ²Π° ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ:
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β Π½ΠΈ ΠΊΠ°Π·Π²Π°, ΡΠ΅ Π½Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ° Π²Π΅ΡΠ΅ ΠΌΡ Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ΅Π½ ΡΠ°ΠΌΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΡΡ, ΠΊΠΎΠ΅ΡΠΎ ΠΏΠΎΠΌΠ°Π³Π° Π΄Π° ΡΠ΅ ΠΈΠ·Π±Π΅Π³Π½Π°Ρ Π²ΡΠΈΡΠΊΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π·Π° Π΄ΠΈΡΠΊΠΎΠ²ΠΎ Π²Ρ
ΠΎΠ΄/ΠΈΠ·Ρ
ΠΎΠ΄ Π·Π° ΡΠ΅ΡΠ΅Π½Π΅ Π½Π° ΠΊΡΠΏΡΠΈΠ½Π°ΡΠ° Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ°.
Π ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΠΏΠΎΠΊΡΠΈΠ²Π°ΡΠΈΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ ΡΠ° Π½Π°Π»ΠΈΡΠ½ΠΈ ΡΠ°ΠΌΠΎ Π·Π° 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.
Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΡΠΎΠ²Π° Π΅ ΡΠ΅ΡΡΠΎ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ°, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ ΠΈΠ½Π΄Π΅ΠΊΡ, ΠΊΠΎΠΉΡΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ° ΡΠ°ΠΌΠΎ ΡΠ΅Π·ΠΈ ΡΠ΅Π΄ΠΎΠ²Π΅ Ρ Π°Π΄ΡΠ΅ΡΠΈ, Π² ΠΊΠΎΠΈΡΠΎ ΡΠ΅Π³ΠΈΠΎΠ½ΡΡ β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.
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎΠ·Π½Π°ΡΠ½ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ (Multi-Value Indexes)
ΠΡΠΊΠΎΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π°Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°Π½ΠΈ, ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π΅ ΡΡΠ΄ΡΡΠΆΠ°Ρ ΡΠΊΠ°Π»Π°ΡΠ΅Π½ ΡΠΈΠΏ Π΄Π°Π½Π½ΠΈ. Π’ΠΈΠΏΠΎΠ²Π΅ ΠΊΠΎΠ»ΠΎΠ½ΠΈ ΠΊΠ°ΡΠΎ jsonb, ΠΌΠ°ΡΠΈΠ²ΠΈ ΠΈ tsvector ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΡΠ΄ΡΡΠΆΠ°Ρ ΡΠ»ΠΎΠΆΠ½ΠΈ ΠΈΠ»ΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ. ΠΠΊΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ½Π΄Π΅ΠΊΡirΠ°ΡΠ΅ ΡΠ°ΠΊΠΈΠ²Π° ΠΊΠΎΠ»ΠΎΠ½ΠΈ, ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΡΡΡΠΈΡΠ΅ Π²ΡΠ² Π²ΡΠΈΡΠΊΠΈ ΠΎΡΠ΄Π΅Π»Π½ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ Π² ΡΠ΅Π·ΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΈ.
ΠΠ° ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΠΌ ΠΈΠΌΠ΅Π½Π°ΡΠ° Π½Π° Π²ΡΠΈΡΠΊΠΈ ΡΠΈΠ»ΠΌΠΈ, ΡΡΠ΄ΡΡΠΆΠ°ΡΠΈ Π½Π°ΡΡΠ·ΠΊΠΈ ΠΎΡ Π½Π΅ΡΡΠΏΠ΅ΡΠ½ΠΈ Π΄ΡΠ±Π»Π°ΠΆΠΈ. Π ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° 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 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 ΠΏΡΠ΅Π΄Π»Π°Π³Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π³ΡΠ²ΠΊΠ°Π²ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈ ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π½Π° Π²ΡΡΠΊΠ°ΠΊΠ²ΠΈ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈ ΡΠ»ΡΡΠ°ΠΈ, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ ΠΏΡΠΈ Π΅ΠΊΡΠΏΠΎΠ½Π΅Π½ΡΠΈΠ°Π»Π΅Π½ ΡΠ°ΡΡΠ΅ΠΆ Π½Π° Π²Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠΠ°Π΄ΡΠ²Π°ΠΌΠ΅ ΡΠ΅ ΡΠ΅Π·ΠΈ ΡΡΠ²Π΅ΡΠΈ Π΄Π° Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π°Ρ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ Π·Π°ΠΏΠΈΡΠ²Π°Π½ΠΈΡΡΠ° Π±ΡΡΠ·ΠΈ ΠΈ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ Π³ΠΎΡΠΎΠ²Π° Π·Π° ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°Π½Π΅.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
