Π£ ΡΠ²Π΅ΡΡ ΠΠΎΡΡΠ³ΡΠ΅ΡΠ°, ΠΈΠ½Π΄Π΅ΠΊΡΠΈ ΡΡ Π½Π΅ΠΎΠΏΡ
ΠΎΠ΄Π½ΠΈ Π·Π° Π΅ΡΠΈΠΊΠ°ΡΠ½Ρ Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡΡ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅ΡΠ΅ΠΌ Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° (ΠΊΠΎΡΠ° ΡΠ΅ Π½Π°Π·ΠΈΠ²Π° βΠ³ΠΎΠΌΠΈΠ»Π°β). ΠΠΎΡΡΠ³ΡΠ΅Ρ Π½Π΅ ΠΏΠΎΠ΄ΡΠΆΠ°Π²Π° Π³ΡΡΠΏΠΈΡΠ°ΡΠ΅ Π·Π° ΡΠ΅Π³Π°, Π° ΠΠΠ¦Π¦ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ° ΡΠ·ΡΠΎΠΊΡΡΠ΅ Π΄Π° Π½Π° ΠΊΡΠ°ΡΡ Π΄ΠΎΠ±ΠΈΡΠ΅ΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ Π²Π΅ΡΠ·ΠΈΡΠ° ΠΈΡΡΠΎΠ³ ΡΡΠΏΠ»Π΅-Π°. ΠΠ±ΠΎΠ³ ΡΠΎΠ³Π° ΡΠ΅ Π²Π΅ΠΎΠΌΠ° Π²Π°ΠΆΠ½ΠΎ Π±ΠΈΡΠΈ Ρ ΡΡΠ°ΡΡ Π΄Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ ΠΈ ΠΎΠ΄ΡΠΆΠ°Π²Π°ΡΠ΅ Π΅ΡΠΈΠΊΠ°ΡΠ½Π΅ ΠΈΠ½Π΄Π΅ΠΊΡΠ΅ Π·Π° ΠΏΠΎΠ΄ΡΡΠΊΡ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΠΌΠ°.
ΠΠ²ΠΎ Π½Π΅ΠΊΠΎΠ»ΠΈΠΊΠΎ ΡΠ°Π²Π΅ΡΠ° Π·Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΡ ΠΈ ΠΏΠΎΠ±ΠΎΡΡΠ°ΡΠ΅ ΡΠΏΠΎΡΡΠ΅Π±Π΅ ΠΈΠ½Π΄Π΅ΠΊΡΠ°.
ΠΠ°ΠΏΠΎΠΌΠ΅Π½Π°: ΡΠΏΠΈΡΠΈ ΠΏΡΠΈΠΊΠ°Π·Π°Π½ΠΈ Ρ Π½Π°ΡΡΠ°Π²ΠΊΡ ΡΠ°Π΄Π΅ Π½Π° Π½Π΅ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΎΠΌ
ΠΠΎΡΠΈΡΡΠ΅ΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΠΏΠΎΠΊΡΠΈΠ²Π°ΡΠ°
Π₯Π°ΡΠ΄Π΅ Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π°ΠΌΠΎ Π·Π°Ρ
ΡΠ΅Π² Π·Π° ΠΈΠ·Π΄Π²Π°ΡΠ°ΡΠ΅ Π°Π΄ΡΠ΅ΡΠ° Π΅-ΠΏΠΎΡΡΠ΅ Π·Π° Π½Π΅Π°ΠΊΡΠΈΠ²Π½Π΅ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠ΅. Π‘ΡΠΎ 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
β, Π° Π·Π°ΡΠΈΠΌ Π½Π°ΡΡΠ°Π²ΠΈΡΠ΅ Π΄Π° ΠΏΡΠ΅ΡΡΠ°ΠΆΡΡΠ΅ΡΠ΅ Π³ΠΎΠΌΠΈΠ»Ρ ΡΠ°Π±Π΅Π»Π΅ Π΄Π° Π±ΠΈΡΡΠ΅ ΠΏΡΠΎΡΠΈΡΠ°Π»ΠΈ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈ Π΄ΡΡΠ³ΠΈΡ
ΠΊΠΎΠ»ΠΎΠ½Π° (Ρ ΠΎΠ²ΠΎΠΌ ΡΠ»ΡΡΠ°ΡΡ ΠΊΠΎΠ»ΠΎΠ½Π° email
) ΠΊΠΎΡΠ΅ ΡΠ΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ ΡΠΏΠΈΡΡ.
ΠΠΎΠΊΡΠΈΠ²Π°ΡΡΡΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ ΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠ΅Π½ΠΈ Ρ ΠΠΎΡΡΠ³ΡΠ΅Π‘ΠΠ 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
' Π½Π°ΠΌ Π³ΠΎΠ²ΠΎΡΠΈ Π΄Π° ΡΠ΅ ΡΠΏΠΈΡΡ ΡΠ°Π΄Π° ΠΏΠΎΡΡΠ΅Π±Π°Π½ ΡΠ°ΠΌΠΎ ΠΈΠ½Π΄Π΅ΠΊΡ, ΠΊΠΎΡΠΈ ΠΏΠΎΠΌΠ°ΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·Π±Π΅Π³Π½Π΅ ΡΠ°Π² Π/Π Π΄ΠΈΡΠΊ Π·Π° ΡΠΈΡΠ°ΡΠ΅ Π³ΠΎΠΌΠΈΠ»Π΅ ΡΠ°Π±Π΅Π»Π΅.
ΠΠ½Π΄Π΅ΠΊΡΠΈ ΠΏΠΎΠΊΡΠΈΠ²Π°ΡΠ° ΡΡ ΡΡΠ΅Π½ΡΡΠ½ΠΎ Π΄ΠΎΡΡΡΠΏΠ½ΠΈ ΡΠ°ΠΌΠΎ Π·Π° Π-ΡΡΠ°Π±Π»Π°. ΠΠ΅ΡΡΡΠΈΠΌ, Ρ ΠΎΠ²ΠΎΠΌ ΡΠ»ΡΡΠ°ΡΡ, Π½Π°ΠΏΠΎΡΠΈ ΠΎΠ΄ΡΠΆΠ°Π²Π°ΡΠ° ΡΠ΅ Π±ΠΈΡΠΈ Π²Π΅ΡΠΈ.
ΠΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π΄Π΅Π»ΠΈΠΌΠΈΡΠ½ΠΈΡ ΠΈΠ½Π΄Π΅ΠΊΡΠ°
ΠΠ΅Π»ΠΈΠΌΠΈΡΠ½ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°ΡΡ ΡΠ°ΠΌΠΎ ΠΏΠΎΠ΄ΡΠΊΡΠΏ ΡΠ΅Π΄ΠΎΠ²Π° Ρ ΡΠ°Π±Π΅Π»ΠΈ. ΠΠ²ΠΎ ΡΡΠ΅Π΄ΠΈ Π²Π΅Π»ΠΈΡΠΈΠ½Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΠΈ ΡΠΈΠ½ΠΈ ΡΠΊΠ΅Π½ΠΈΡΠ°ΡΠ΅ Π±ΡΠΆΠΈΠΌ.
Π Π΅ΡΠΈΠΌΠΎ Π΄Π° ΠΆΠ΅Π»ΠΈΠΌΠΎ Π΄Π° Π΄ΠΎΠ±ΠΈΡΠ΅ΠΌΠΎ Π»ΠΈΡΡΡ Π°Π΄ΡΠ΅ΡΠ° Π΅-ΠΏΠΎΡΡΠ΅ Π½Π°ΡΠΈΡ ΠΊΠ»ΠΈΡΠ΅Π½Π°ΡΠ° Ρ ΠΠ°Π»ΠΈΡΠΎΡΠ½ΠΈΡΠΈ. ΠΠ°Ρ ΡΠ΅Π² ΡΠ΅ Π±ΠΈΡΠΈ ΠΎΠ²Π°ΠΊΠ°Π²:
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)
ΠΠ½Π΄Π΅ΠΊΡ Π½ΠΈΡΠ΅ Π½ΠΈ ΡΠ°Π·ΠΌΠ°ΡΡΠ°Π½. ΠΠ½Π΄Π΅ΠΊΡ Π-ΡΡΠ°Π±Π»Π° Π½ΠΈΡΠ΅ ΡΠ²Π΅ΡΡΠ°Π½ ΠΏΠΎΡΡΠΎΡΠ°ΡΠ° ΠΏΠΎΡΠ΅Π΄ΠΈΠ½Π°ΡΠ½ΠΈΡ Π΅Π»Π΅ΠΌΠ΅Π½Π°ΡΠ° Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°Π½ΠΈΠΌ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈΠΌΠ°.
ΠΠΎΡΡΠ΅Π±Π°Π½ Π½Π°ΠΌ ΡΠ΅ ΠΠΠ ΠΈΠ½Π΄Π΅ΠΊΡ.
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)
ΠΠΠ ΠΈΠ½Π΄Π΅ΠΊΡ ΠΏΠΎΠ΄ΡΠΆΠ°Π²Π° ΠΌΠ°ΠΏΠΈΡΠ°ΡΠ΅ ΠΏΠΎΡΠ΅Π΄ΠΈΠ½Π°ΡΠ½ΠΈΡ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈ Ρ ΠΎΠ΄Π½ΠΎΡΡ Π½Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°Π½Π΅ ΡΠ»ΠΎΠΆΠ΅Π½Π΅ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈ, ΡΡΠΎ ΡΠ΅Π·ΡΠ»ΡΠΈΡΠ° ΡΡΠΎΡΠΊΠΎΠΌ ΠΏΠ»Π°Π½Π° ΡΠΏΠΈΡΠ° ΠΊΠΎΡΠΈ ΡΠ΅ Π²ΠΈΡΠ΅ Π½Π΅Π³ΠΎ ΠΏΡΠ΅ΠΏΠΎΠ»ΠΎΠ²ΡΠ΅Π½.
Π£ΠΊΠ»Π°ΡΠ°ΡΠ΅ Π΄ΡΠΏΠ»ΠΈΠΊΠ°ΡΠ° ΠΈΠ½Π΄Π΅ΠΊΡΠ°
ΠΠ½Π΄Π΅ΠΊΡΠΈ ΡΠ΅ Π°ΠΊΡΠΌΡΠ»ΠΈΡΠ°ΡΡ ΡΠΎΠΊΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½Π°, Π° ΠΏΠΎΠ½Π΅ΠΊΠ°Π΄ Π½ΠΎΠ²ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ°Π΄ΡΠΆΠΈ ΠΈΡΡΡ Π΄Π΅ΡΠΈΠ½ΠΈΡΠΈΡΡ ΠΊΠ°ΠΎ ΠΈ ΡΠ΅Π΄Π°Π½ ΠΎΠ΄ ΠΏΡΠ΅ΡΡ
ΠΎΠ΄Π½ΠΈΡ
. ΠΠΎΠΆΠ΅ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈΡΠΈ ΠΊΠ°ΡΠ°Π»ΠΎΡΠΊΠΈ ΠΏΡΠΈΠΊΠ°Π· Π΄Π° Π±ΠΈΡΡΠ΅ Π΄ΠΎΠ±ΠΈΠ»ΠΈ ΡΠΈΡΡΠΈΠ²Π΅ Π‘ΠΠ Π΄Π΅ΡΠΈΠ½ΠΈΡΠΈΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΠ°. 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)
ΠΠ±Π½ΠΎΠ²Π° ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΡΠ° ΠΌΠ°ΡΠ΅ Π±ΡΠ°Π²Π°
ΠΠ½Π΄Π΅ΠΊΡΠΈ ΡΠ΅ ΡΠ΅ΡΡΠΎ ΠΌΠΎΡΠ°ΡΡ ΠΏΠΎΠ½ΠΎΠ²ΠΎ ΠΈΠ·Π³ΡΠ°Π΄ΠΈΡΠΈ, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ ΠΊΠ°Π΄Π° ΠΏΠΎΡΡΠ°Π½Ρ Π½Π°Π΄ΡΠ²Π°Π½ΠΈ, Π° ΠΏΠΎΠ½ΠΎΠ²Π½Π° ΠΈΠ·ΡΠ°Π΄Π° ΠΌΠΎΠΆΠ΅ ΡΠ±ΡΠ·Π°ΡΠΈ ΡΠΊΠ΅Π½ΠΈΡΠ°ΡΠ΅. Π’Π°ΠΊΠΎΡΠ΅, ΠΈΠ½Π΄Π΅ΠΊΡΠΈ ΡΠ΅ ΠΌΠΎΠ³Ρ ΠΎΡΡΠ΅ΡΠΈΡΠΈ. ΠΡΠΎΠΌΠ΅Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΠ°ΡΠ° ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΡΠ°ΠΊΠΎΡΠ΅ ΠΌΠΎΠΆΠ΅ Π·Π°Ρ ΡΠ΅Π²Π°ΡΠΈ ΠΏΠΎΠ½ΠΎΠ²Π½Ρ ΠΈΠ·Π³ΡΠ°Π΄ΡΡ.
ΠΠΌΠΎΠ³ΡΡΠΈ ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ ΠΏΠ°ΡΠ°Π»Π΅Π»Π½ΠΎΠ³ ΠΈΠ½Π΄Π΅ΠΊΡΠ°
Π£ ΠΠΎΡΡΠ³ΡΠ΅Π‘ΠΠ 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
ΠΠ²Π° ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ° ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΡΠ΅ ΡΠ°Π·Π»ΠΈΠΊΡΡΠ΅ ΠΎΠ΄ ΡΠΎΠ±ΠΈΡΠ°ΡΠ΅Π½Π΅ ΠΏΠΎ ΡΠΎΠΌΠ΅ ΡΡΠΎ Π½Π΅ Π·Π°Ρ ΡΠ΅Π²Π° Π·Π°ΠΊΡΡΡΠ°Π²Π°ΡΠ΅ ΡΠ°Π±Π΅Π»Π΅, ΠΏΠ° ΡΡΠΎΠ³Π° Π½Π΅ Π±Π»ΠΎΠΊΠΈΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΠ΅ ΠΏΠΈΡΠ°ΡΠ°. Π‘ Π΄ΡΡΠ³Π΅ ΡΡΡΠ°Π½Π΅, ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ ΡΠ΅ Π²ΠΈΡΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½Π° ΠΈ ΡΡΠΎΡΠΈ Π²ΠΈΡΠ΅ ΡΠ΅ΡΡΡΡΠ°.
ΠΠΎΡΡΠ³ΡΠ΅Ρ ΠΏΡΡΠΆΠ° Π²Π΅Π»ΠΈΠΊΡ ΡΠ»Π΅ΠΊΡΠΈΠ±ΠΈΠ»Π½ΠΎΡΡ Π·Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΠΈ Π½Π°ΡΠΈΠ½Π° Π·Π° ΡΠ΅ΡΠ°Π²Π°ΡΠ΅ ΠΏΠΎΡΠ΅Π±Π½ΠΈΡ
ΡΠ»ΡΡΠ°ΡΠ΅Π²Π°, ΠΊΠ°ΠΎ ΠΈ Π½Π°ΡΠΈΠ½Π° ΡΠΏΡΠ°Π²ΡΠ°ΡΠ° Π±Π°Π·ΠΎΠΌ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° Ρ ΡΠ»ΡΡΠ°ΡΡ Π΄Π° Π²Π°ΡΠ° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° Π΅ΠΊΡΠΏΠ»ΠΎΠ΄ΠΈΡΠ°. ΠΠ°Π΄Π°ΠΌΠΎ ΡΠ΅ Π΄Π° ΡΠ΅ Π²Π°ΠΌ ΠΎΠ²ΠΈ ΡΠ°Π²Π΅ΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ Π΄Π° Π±ΡΠ·ΠΎ Π΄ΠΎΠ±ΠΈΡΠ΅ΡΠ΅ ΡΠ²ΠΎΡΠ΅ ΡΠΏΠΈΡΠ΅ ΠΈ Π΄Π° Π²Π°ΡΠ° Π±Π°Π·Π° ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° Π±ΡΠ΄Π΅ ΡΠΏΡΠ΅ΠΌΠ½Π° Π·Π° ΡΠΊΠ°Π»ΠΈΡΠ°ΡΠ΅.
ΠΠ·Π²ΠΎΡ: Π²Π²Π².Ρ
Π°Π±Ρ.ΡΠΎΠΌ