ΠΠΎ ΡΠ²Π΅ΡΠΎΡ Π½Π° Postgres, ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ΅ ΡΠ΅ ΠΊΠ»ΡΡΠ½ΠΈ Π·Π° Π΅ΡΠΈΠΊΠ°ΡΠ½ΠΎ Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡΠ° Π²ΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅ΡΠΎ Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ (Π½Π°ΡΠ΅ΡΠ΅Π½ΠΎ Π³ΡΠ°ΠΌΠ°Π΄Π°). Postgres Π½Π΅ ΠΏΠΎΠ΄Π΄ΡΠΆΡΠ²Π° ΠΊΠ»Π°ΡΡΠ΅ΡΠΈΡΠ°ΡΠ΅ Π·Π° Π½Π΅Π³ΠΎ, Π° Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ° MVCC ΠΏΡΠ΅Π΄ΠΈΠ·Π²ΠΈΠΊΡΠ²Π° Π΄Π° Π·Π°Π²ΡΡΠΈΡΠ΅ ΡΠΎ ΠΌΠ½ΠΎΠ³Ρ Π²Π΅ΡΠ·ΠΈΠΈ Π½Π° ΠΈΡΡΠ°ΡΠ° ΡΠΎΡΠΊΠ°. ΠΠ°ΡΠΎΠ°, ΠΌΠ½ΠΎΠ³Ρ Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ ΠΈ ΠΎΠ΄ΡΠΆΡΠ²Π°ΡΠ΅ Π΅ΡΠΈΠΊΠ°ΡΠ½ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ Π·Π° ΠΏΠΎΠ΄Π΄ΡΡΠΊΠ° Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈΡΠ΅.
ΠΠΈ ΠΏΡΠ΅Π½Π΅ΡΡΠ²Π°ΠΌ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΡΠΎΠ²Π΅ΡΠΈ Π·Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ°ΡΠ΅ ΠΈ ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ΡΠΎ Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ΅.
ΠΠ°Π±Π΅Π»Π΅ΡΠΊΠ°: ΠΡΠ°ΡΠ°ΡΠ°ΡΠ° ΠΏΡΠΈΠΊΠ°ΠΆΠ°Π½ΠΈ ΠΏΠΎΠ΄ΠΎΠ»Ρ ΡΠ°Π±ΠΎΡΠ°Ρ Π½Π° Π½Π΅ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠ°Π½ΠΈ
ΠΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈ Π·Π° ΠΏΠΎΠΊΡΠΈΠ²Π°ΡΠ΅
ΠΡΠ΄Π΅ Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ Π²ΠΎ Π±Π°ΡΠ°ΡΠ΅ΡΠΎ Π·Π° Π²ΡΠ°ΡΠ°ΡΠ΅ Π½Π° Π΅-ΠΏΠΎΡΡΠ° Π·Π° Π½Π΅Π°ΠΊΡΠΈΠ²Π½ΠΈ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΈ. ΠΠΎ ΡΠ°Π±Π΅Π»Π°ΡΠ° 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
β, Π° ΠΏΠΎΡΠΎΠ° ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅ΡΠ΅ ΡΠΎ ΠΏΡΠ΅Π±Π°ΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΊΡΠΏΠΎΡ Π½Π° ΡΠ°Π±Π΅Π»Π°ΡΠ° Π·Π° Π΄Π° Π³ΠΈ ΠΏΡΠΎΡΠΈΡΠ°ΡΠ΅ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈΡΠ΅ Π½Π° Π΄ΡΡΠ³ΠΈΡΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΈ (Π²ΠΎ ΠΎΠ²ΠΎΡ ΡΠ»ΡΡΠ°Ρ, ΠΊΠΎΠ»ΠΎΠ½Π°ΡΠ° email
) ΡΡΠΎ ΠΌΡ ΡΡΠ΅Π±Π° Π½Π° Π±Π°ΡΠ°ΡΠ΅ΡΠΎ.
PostgreSQL 11 Π²ΠΎΠ²Π΅Π΄Π΅ ΠΏΠΎΠΊΡΠΈΠ²Π½ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ. Π’ΠΈΠ΅ Π²ΠΈ Π΄ΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Π°Ρ Π΄Π° Π²ΠΊΠ»ΡΡΠΈΡΠ΅ Π΅Π΄Π½Π° ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΈ Π²ΠΎ ΡΠ°ΠΌΠΈΠΎΡ ΠΈΠ½Π΄Π΅ΠΊΡ - Π½ΠΈΠ²Π½ΠΈΡΠ΅ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈ ΡΠ΅ Π·Π°ΡΡΠ²ΡΠ²Π°Π°Ρ Π²ΠΎ ΠΏΡΠΎΠ΄Π°Π²Π½ΠΈΡΠ°ΡΠ° Π·Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π·Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈ.
ΠΠΊΠΎ ΡΠ° ΠΈΡΠΊΠΎΡΠΈΡΡΠΈΠ²ΠΌΠ΅ ΠΎΠ²Π°Π° ΡΡΠ½ΠΊΡΠΈΡΠ° ΠΈ ΡΠ° Π΄ΠΎΠ΄Π°Π΄Π΅ΠΌΠ΅ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠ° Π½Π° Π΅-ΠΏΠΎΡΡΠ°ΡΠ° Π²ΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΡ, ΡΠΎΠ³Π°Ρ Postgres Π½Π΅ΠΌΠ° Π΄Π° ΡΡΠ΅Π±Π° Π΄Π° ΡΠ° Π±Π°ΡΠ° Π²ΡΠ΅Π΄Π½ΠΎΡΡΠ° Π²ΠΎ ΠΊΡΠΏΠΎΡ Π½Π° ΡΠ°Π±Π΅Π»Π°ΡΠ°. 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
" Π½ΠΈ ΠΊΠ°ΠΆΡΠ²Π° Π΄Π΅ΠΊΠ° Π½Π° Π±Π°ΡΠ°ΡΠ΅ΡΠΎ ΡΠ΅Π³Π° ΠΌΡ ΡΡΠ΅Π±Π° ΡΠ°ΠΌΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΡ, ΡΡΠΎ ΠΏΠΎΠΌΠ°Π³Π° Π΄Π° ΡΠ΅ ΠΈΠ·Π±Π΅Π³Π½Π°Ρ ΡΠΈΡΠ΅ Π/Π Π½Π° Π΄ΠΈΡΠΊΠΎΡ Π·Π° Π΄Π° ΡΠ΅ ΠΏΡΠΎΡΠΈΡΠ° ΠΊΡΠΏΠΎΡ Π½Π° ΡΠ°Π±Π΅Π»Π°ΡΠ°.
ΠΠ΅Π½Π΅Ρ, ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ΅ Π·Π° ΠΏΠΎΠΊΡΠΈΠ²Π°ΡΠ΅ ΡΠ΅ Π΄ΠΎΡΡΠ°ΠΏΠ½ΠΈ ΡΠ°ΠΌΠΎ Π·Π° Π-Π΄ΡΠ²Π°ΡΠ°. ΠΠ΅ΡΡΡΠΎΠ°, Π²ΠΎ ΠΎΠ²ΠΎΡ ΡΠ»ΡΡΠ°Ρ Π½Π°ΠΏΠΎΡΠΎΡ Π·Π° ΠΎΠ΄ΡΠΆΡΠ²Π°ΡΠ΅ ΡΠ΅ Π±ΠΈΠ΄Π΅ ΠΏΠΎΠ³ΠΎΠ»Π΅ΠΌ.
ΠΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° ΠΏΠ°ΡΡΠΈΡΠ°Π»Π½ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ
ΠΠ΅Π»ΡΠΌΠ½ΠΈΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°Π°Ρ ΡΠ°ΠΌΠΎ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΎΠ΄ ΡΠ΅Π΄ΠΎΠ²ΠΈΡΠ΅ Π½Π° ΡΠ°Π±Π΅Π»Π°ΡΠ°. ΠΠ²Π° Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° ΡΠ° Π·Π°ΡΡΠ²Π°ΡΠ΅ Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π°ΡΠ° Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΎΡ ΠΈ Π΄Π° Π²ΡΡΠΈΡΠ΅ ΡΠΊΠ΅Π½ΠΈΡΠ°ΡΠ΅ ΠΏΠΎΠ±ΡΠ·ΠΎ.
ΠΠ° ΡΠ΅ΡΠ΅ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΡΡΠ΅Π±Π° Π΄Π° Π΄ΠΎΠ±ΠΈΠ΅ΠΌΠ΅ ΡΠΏΠΈΡΠΎΠΊ ΡΠΎ Π°Π΄ΡΠ΅ΡΠΈ Π½Π° Π΅-ΠΏΠΎΡΡΠ° Π·Π° Π½Π°ΡΠΈΡΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠΈ Π²ΠΎ ΠΠ°Π»ΠΈΡΠΎΡΠ½ΠΈΡΠ°. ΠΠ°ΡΠ°ΡΠ΅ΡΠΎ ΡΠ΅ Π±ΠΈΠ΄Π΅ Π²Π°ΠΊΠ°:
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
. ΠΠ° Π΄Π° Π³ΠΈ Π±Π°ΡΠ°ΠΌΠ΅ ΡΠΈΡΠ΅ ΡΠ°ΠΊΠ²ΠΈ ΡΠΈΠ»ΠΌΠΎΠ²ΠΈ, ΡΡΠ΅Π±Π° Π΄Π° Π³ΠΈ ΠΈΠ·Π±Π΅ΡΠ΅ΠΌΠ΅ ΡΠΈΡΠ΅ ΡΠ΅Π΄ΠΎΠ²ΠΈ ΡΠΎ β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_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