ΠšΠΎΡ€ΠΈΡˆΡ›Π΅ΡšΠ΅ свих карактСристика индСкса Ρƒ ΠŸΠΎΡΡ‚Π³Ρ€Π΅Π‘ΠšΠ›-Ρƒ

ΠšΠΎΡ€ΠΈΡˆΡ›Π΅ΡšΠ΅ свих карактСристика индСкса Ρƒ ΠŸΠΎΡΡ‚Π³Ρ€Π΅Π‘ΠšΠ›-Ρƒ
Π£ свСту ΠŸΠΎΡΡ‚Π³Ρ€Π΅ΡΠ°, индСкси су Π½Π΅ΠΎΠΏΡ…ΠΎΠ΄Π½ΠΈ Π·Π° Сфикасну Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΡ˜Ρƒ ΡΠΊΠ»Π°Π΄ΠΈΡˆΡ‚Π΅ΡšΠ΅ΠΌ Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° (која сС Π½Π°Π·ΠΈΠ²Π° β€žΠ³ΠΎΠΌΠΈΠ»Π°β€œ). ΠŸΠΎΡΡ‚Π³Ρ€Π΅Ρ Π½Π΅ ΠΏΠΎΠ΄Ρ€ΠΆΠ°Π²Π° Π³Ρ€ΡƒΠΏΠΈΡΠ°ΡšΠ΅ Π·Π° њСга, Π° ΠœΠ’Π¦Π¦ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° ΡƒΠ·Ρ€ΠΎΠΊΡƒΡ˜Π΅ Π΄Π° Π½Π° ΠΊΡ€Π°Ρ˜Ρƒ Π΄ΠΎΠ±ΠΈΡ˜Π΅Ρ‚Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π²Π΅Ρ€Π·ΠΈΡ˜Π° истог Ρ‚ΡƒΠΏΠ»Π΅-Π°. Π—Π±ΠΎΠ³ Ρ‚ΠΎΠ³Π° јС Π²Π΅ΠΎΠΌΠ° Π²Π°ΠΆΠ½ΠΎ Π±ΠΈΡ‚ΠΈ Ρƒ ΡΡ‚Π°ΡšΡƒ Π΄Π° ΠΊΡ€Π΅ΠΈΡ€Π°Ρ‚Π΅ ΠΈ ΠΎΠ΄Ρ€ΠΆΠ°Π²Π°Ρ‚Π΅ СфикаснС индСксС Π·Π° ΠΏΠΎΠ΄Ρ€ΡˆΠΊΡƒ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°ΠΌΠ°.

Π•Π²ΠΎ Π½Π΅ΠΊΠΎΠ»ΠΈΠΊΠΎ савСта Π·Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ˜Ρƒ ΠΈ ΠΏΠΎΠ±ΠΎΡ™ΡˆΠ°ΡšΠ΅ ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π΅ индСкса.

НапомСна: ΡƒΠΏΠΈΡ‚ΠΈ ΠΏΡ€ΠΈΠΊΠ°Π·Π°Π½ΠΈ Ρƒ наставку Ρ€Π°Π΄Π΅ Π½Π° нСизмСњСном ΠΏΠ°Π³ΠΈΠ»Π° ΡƒΠ·ΠΎΡ€Π°ΠΊ Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°.

ΠšΠΎΡ€ΠΈΡˆΡ›Π΅ΡšΠ΅ индСкса ΠΏΠΎΠΊΡ€ΠΈΠ²Π°ΡšΠ°

Π₯ајдС Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π°ΠΌΠΎ Π·Π°Ρ…Ρ‚Π΅Π² Π·Π° издвајањС адрСса Π΅-ΠΏΠΎΡˆΡ‚Π΅ Π·Π° Π½Π΅Π°ΠΊΡ‚ΠΈΠ²Π½Π΅ корисникС. Π‘Ρ‚ΠΎ 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

Ова ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΠ° индСкса сС Ρ€Π°Π·Π»ΠΈΠΊΡƒΡ˜Π΅ ΠΎΠ΄ ΡƒΠΎΠ±ΠΈΡ‡Π°Ρ˜Π΅Π½Π΅ ΠΏΠΎ Ρ‚ΠΎΠΌΠ΅ ΡˆΡ‚ΠΎ Π½Π΅ Π·Π°Ρ…Ρ‚Π΅Π²Π° Π·Π°ΠΊΡ™ΡƒΡ‡Π°Π²Π°ΡšΠ΅ Ρ‚Π°Π±Π΅Π»Π΅, ΠΏΠ° стога Π½Π΅ Π±Π»ΠΎΠΊΠΈΡ€Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ˜Π΅ писања. Π‘ Π΄Ρ€ΡƒΠ³Π΅ странС, ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ јС вишС Π²Ρ€Π΅ΠΌΠ΅Π½Π° ΠΈ Ρ‚Ρ€ΠΎΡˆΠΈ вишС рСсурса.

ΠŸΠΎΡΡ‚Π³Ρ€Π΅Ρ ΠΏΡ€ΡƒΠΆΠ° Π²Π΅Π»ΠΈΠΊΡƒ флСксибилност Π·Π° ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΠ΅ индСкса ΠΈ Π½Π°Ρ‡ΠΈΠ½Π° Π·Π° Ρ€Π΅ΡˆΠ°Π²Π°ΡšΠ΅ посСбних ΡΠ»ΡƒΡ‡Π°Ρ˜Π΅Π²Π°, ΠΊΠ°ΠΎ ΠΈ Π½Π°Ρ‡ΠΈΠ½Π° ΡƒΠΏΡ€Π°Π²Ρ™Π°ΡšΠ° Π±Π°Π·ΠΎΠΌ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° Ρƒ ΡΠ»ΡƒΡ‡Π°Ρ˜Ρƒ Π΄Π° ваша Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Сксплодира. Надамо сС Π΄Π° Ρ›Π΅ Π²Π°ΠΌ ΠΎΠ²ΠΈ савСти ΠΏΠΎΠΌΠΎΡ›ΠΈ Π΄Π° Π±Ρ€Π·ΠΎ Π΄ΠΎΠ±ΠΈΡ˜Π΅Ρ‚Π΅ својС ΡƒΠΏΠΈΡ‚Π΅ ΠΈ Π΄Π° ваша Π±Π°Π·Π° ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° Π±ΡƒΠ΄Π΅ спрСмна Π·Π° ΡΠΊΠ°Π»ΠΈΡ€Π°ΡšΠ΅.

Π˜Π·Π²ΠΎΡ€: Π²Π²Π².Ρ…Π°Π±Ρ€.Ρ†ΠΎΠΌ

Π”ΠΎΠ΄Π°Ρ˜ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€