Π ΡΠ²Π΅ΡΠ° Π½Π° 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
' Π½ΠΈ ΠΊΠ°Π·Π²Π°, ΡΠ΅ Π·Π°ΡΠ²ΠΊΠ°ΡΠ° ΡΠ΅Π³Π° ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ ΡΠ°ΠΌΠΎ ΠΎΡ ΠΈΠ½Π΄Π΅ΠΊΡ, ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΠΌΠ°Π³Π° Π΄Π° ΡΠ΅ ΠΈΠ·Π±Π΅Π³Π½Π°Ρ Π²ΡΠΈΡΠΊΠΈ Π΄ΠΈΡΠΊΠΎΠ²ΠΈ 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.
ΠΠ΅ΠΊΠ° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ Π΄Π°Π»ΠΈ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ ΠΈΠ½Π΄Π΅ΠΊΡ Π½Π° 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;
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