
āĻĒā§āϏā§āĻāĻā§āϰā§āϏ āĻŦāĻŋāĻļā§āĻŦā§, āĻĄāĻžāĻāĻžāĻŦā§āϏ āϏā§āĻā§āϰā§āĻ (āϝāĻžāĻā§ āĻšāĻŋāĻĒ āĻŦāϞāĻž āĻšāϝāĻŧ) āĻĻāĻā§āώāϤāĻžāϰ āϏāĻžāĻĨā§ āύā§āĻāĻŋāĻā§āĻ āĻāϰāĻžāϰ āĻāύā§āϝ āϏā§āĻāĻāĻā§āϞāĻŋ āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖāĨ¤ 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" āĻāϰ āĻŽāĻžāύ⧠āĻĒā§āϏā§āĻāĻā§āϰā§āϏ āϏā§āĻāĻ āĻā§āϰāϞ āĻāϰāĻŦā§ "idx_cust1", āĻāĻŦāĻ āϤāĻžāϰāĻĒāϰ⧠āĻ
āύā§āϝāĻžāύā§āϝ āĻāϞāĻžāĻŽā§āϰ āĻŽāĻžāύ āĻĒāĻĄāĻŧāϤ⧠āĻā§āĻŦāĻŋāϞā§āϰ āϏā§āϤā§āĻĒ āĻ
āύā§āϏāύā§āϧāĻžāύ āĻāĻžāϞāĻŋāϝāĻŧā§ āϝāĻžāύ (āĻāĻ āĻā§āώā§āϤā§āϰā§, āĻāϞāĻžāĻŽ email) āϝ⧠āĻ
āύā§āϰā§āϧā§āϰ āĻĒā§āϰāϝāĻŧā§āĻāύāĨ¤
PostgreSQL 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" āĻāĻŽāĻžāĻĻā§āϰ āĻŦāϞ⧠āϝ⧠āĻā§āϝā§āϝāĻŧāĻžāϰā§āĻāĻŋāϰ āĻāĻāύ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āϏā§āĻā§ āĻĒā§āϰāϝāĻŧā§āĻāύ, āϝāĻž āĻā§āĻŦāĻŋāϞā§āϰ āϏā§āϤā§āĻĒ āĻĒāĻĄāĻŧāĻžāϰ āĻāύā§āϝ āϏāĻŽāϏā§āϤ āĻĄāĻŋāϏā§āĻ I/O āĻāĻĄāĻŧāĻžāϤ⧠āϏāĻžāĻšāĻžāϝā§āϝ āĻāϰā§āĨ¤
āĻāĻ, āĻāĻāĻžāϰāĻŋāĻ āĻāύāĻĄā§āĻā§āϏ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻŦāĻŋ-āĻŦā§āĻā§āώā§āϰ āĻāύā§āϝ āĻāĻĒāϞāĻŦā§āϧāĨ¤ āϤāĻŦā§ āĻāĻ āĻā§āώā§āϤā§āϰ⧠āϰāĻā§āώāĻŖāĻžāĻŦā§āĻā§āώāĻŖā§āϰ āĻĒā§āϰāĻā§āώā§āĻāĻž āĻŦā§āĻļāĻŋ āĻšāĻŦā§āĨ¤
āĻāĻāĻļāĻŋāĻ āϏā§āĻāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§
āĻāĻāĻļāĻŋāĻ āϏā§āĻā§ āϏā§āĻā§ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻā§āĻŦāĻŋāϞā§āϰ āϏāĻžāϰāĻŋāϰ āĻāĻāĻāĻŋ āĻāĻĒāϏā§āĻāĨ¤ āĻāĻāĻŋ āĻāĻĒāύāĻžāĻā§ āϏā§āĻāĻā§āϰ āĻāĻāĻžāϰ āϏāĻāϰāĻā§āώāĻŖ āĻāϰāϤ⧠āĻāĻŦāĻ āĻĻā§āϰā§āϤ āϏā§āĻā§āϝāĻžāύ āĻāϰāϤ⧠āĻĻā§āϝāĻŧāĨ¤
āϧāϰāĻž āϝāĻžāĻ āĻāĻŽāĻžāĻĻā§āϰ āĻā§āϝāĻžāϞāĻŋāĻĢā§āϰā§āύāĻŋāϝāĻŧāĻžāϝāĻŧ āĻāĻŽāĻžāĻĻā§āϰ āĻā§āϰāĻžāĻšāĻāĻĻā§āϰ āĻāύā§āϝ āĻāĻŽā§āϞ āĻ āĻŋāĻāĻžāύāĻžāĻā§āϞāĻŋāϰ āĻāĻāĻāĻŋ āϤāĻžāϞāĻŋāĻāĻž āĻĒā§āϤ⧠āĻšāĻŦā§ā§ˇ āĻ āύā§āϰā§āϧ āĻāĻ āĻŽāϤ āĻšāĻŦā§:
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)āĻāĻŋāĻāĻāĻāύ āϏā§āĻāĻ āϏā§āĻŦāϤāύā§āϤā§āϰ āĻŽāĻžāύāĻā§āϞāĻŋāĻā§ āϏā§āĻā§āĻā§āϤ āϝā§āĻāĻŋāĻ āĻŽāĻžāύāĻā§āϞāĻŋāϤ⧠āĻŽā§āϝāĻžāĻĒ āĻāϰāϤ⧠āϏāĻŽāϰā§āĻĨāύ āĻāϰā§, āϝāĻžāϰ āĻĢāϞ⧠āĻā§āϝā§āϝāĻŧāĻžāϰ⧠āĻĒāϰāĻŋāĻāϞā§āĻĒāύāĻžāϰ āĻ āϰā§āϧā§āĻā§āϰāĻ āĻŦā§āĻļāĻŋ āĻāϰāĻ āĻšāϝāĻŧāĨ¤
āĻĄā§āĻĒā§āϞāĻŋāĻā§āĻ āϏā§āĻā§ āĻĒāϰāĻŋāϤā§āϰāĻžāĻŖ āĻĒāĻžāĻāϝāĻŧāĻž
āϏāĻŽāϝāĻŧā§āϰ āϏāĻžāĻĨā§ āϏāĻžāĻĨā§ āϏā§āĻāĻāĻā§āϞāĻŋ āĻāĻŽāĻž āĻšāϝāĻŧ, āĻāĻŦāĻ āĻāĻāύāĻ āĻāĻāύāĻ āĻāĻāĻāĻŋ āύāϤā§āύ āϏā§āĻāĻā§ āĻāĻā§āϰāĻā§āϞāĻŋāϰ āĻāĻāĻāĻŋāϰ āĻŽāϤ⧠āĻāĻāĻ āϏāĻāĻā§āĻāĻž āĻĨāĻžāĻāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻŽāĻžāύāĻŦ-āĻĒāĻžāĻ āϝā§āĻā§āϝ 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āĻāĻ āϏā§āĻāĻ āϤā§āϰāĻŋāϰ āĻĒāĻĻā§āϧāϤāĻŋāĻāĻŋ āϏāĻžāϧāĻžāϰāĻŖā§āϰ āĻĨā§āĻā§ āĻāϞāĻžāĻĻāĻž āϝ⧠āĻāĻāĻŋāϤ⧠āĻā§āĻŦāĻŋāϞāĻāĻŋ āϞāĻ āĻāϰāĻžāϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āύā§āĻ āĻāĻŦāĻ āϤāĻžāĻ āϞā§āĻāĻžāϰ āĻā§āϰāĻŋāϝāĻŧāĻžāĻāϞāĻžāĻĒāĻā§āϞāĻŋāĻā§ āĻŦā§āϞāĻ āĻāϰ⧠āύāĻžāĨ¤ āĻ āύā§āϝāĻĻāĻŋāĻā§, āĻāĻāĻŋ āĻŦā§āĻļāĻŋ āϏāĻŽāϝāĻŧ āύā§āϝāĻŧ āĻāĻŦāĻ āĻāϰāĻ āϏāĻāϏā§āĻĨāĻžāύ āĻā§āϰāĻšāĻŖ āĻāϰā§āĨ¤
āĻĒā§āϏā§āĻāĻā§āϰā§āϏ āĻā§āύ⧠āĻŦāĻŋāĻļā§āώ āĻā§āώā§āϤā§āϰ⧠āϏā§āĻā§ āϤā§āϰāĻŋ āĻāĻŦāĻ āϏāĻŽāĻžāϧāĻžāύā§āϰ āĻāύā§āϝ āĻ
āύā§āĻ āύāĻŽāύā§āϝāĻŧ āĻŦāĻŋāĻāϞā§āĻĒ āϏāϰāĻŦāϰāĻžāĻš āĻāϰ⧠āĻāĻŦāĻ āĻāĻĒāύāĻžāϰ āĻ
ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύāĻāĻŋ āĻŦāĻŋāϏā§āĻĢā§āϰāĻāĻāĻžāĻŦā§ āĻŦā§āĻĻā§āϧāĻŋ āĻĒā§āϞ⧠āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰāĻžāϰ āĻāĻĒāĻžāϝāĻŧāĻ āϏāϰāĻŦāϰāĻžāĻš āĻāϰā§āĨ¤ āĻāĻŽāϰāĻž āĻāĻļāĻž āĻāϰāĻŋ āĻāĻ āĻāĻŋāĻĒāϏāĻā§āϞāĻŋ āĻāĻĒāύāĻžāĻā§ āĻāĻĒāύāĻžāϰ āĻĒā§āϰāĻļā§āύāĻā§āϞāĻŋāĻā§ āĻĻā§āϰā§āϤ āĻāĻŦāĻ āĻāĻĒāύāĻžāϰ āĻĄāĻžāĻāĻžāĻŦā§āϏāĻā§ āϏā§āĻā§āϞ āĻāϰāĻžāϰ āĻāύā§āϝ āĻĒā§āϰāϏā§āϤā§āϤ āĻāϰāϤ⧠āϏāĻžāĻšāĻžāϝā§āϝ āĻāϰāĻŦā§ā§ˇ
āĻāϤā§āϏ: www.habr.com
