Kushandisa ese masimba e indexes muPostgreSQL

Kushandisa ese masimba e indexes muPostgreSQL
Munyika yePostgres, indekisi dzakakosha kuti ufambe zvakanaka mudura rekuchengetedza (inonzi murwi). Postgres haitsigire kuungana kwayo, uye iyo MVCC yekuvaka inokonzeresa kuti iwe upedze neshanduro dzakawanda dzeiyo tuple. Naizvozvo, zvakakosha kwazvo kuti ugone kugadzira uye kuchengetedza indekisi inoshanda kutsigira maapplication.

Ini ndinounza kwauri mamwe matipi ekugadzirisa uye kuvandudza mashandisirwo e indexes.

Cherechedza: Mibvunzo inoratidzwa pazasi inoshanda pane isina kuvandudzwa pagila database sample.

Kushandisa Covering Indexes

Ngatitarisei chikumbiro chekudzoreredza email kero dzevashandisi vasingashande. Mutafura customer pane mbiru active, uye mubvunzo wacho uri nyore:

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)

Mubvunzo unodaidza iyo yakazara tafura scan sequence customer. Ngatigadzirei index pa column 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)

Yakabatsirwa, scan yakazotevera yakashandurwa kuita "index scan". Izvi zvinoreva kuti Postgres ichakambaira index "idx_cust1", uye woenderera mberi nekutsvaga murwi wetafura kuti uverenge hutsika hwemamwe makoramu (munyaya iyi, iyo column email) izvo chikumbiro chinoda.

PostgreSQL 11 yakaunza inovhara indexes. Ivo vanokutendera kuti ubatanidze imwe kana mamwe makoramu ekuwedzera mune index pachayo - maitiro avo anochengetwa muchitoro chedata.

Kana isu takashandisa chimiro ichi uye tikawedzera iyo email kukosha mukati meiyo index, saka Postgres yaisazoda kutarisa mumurwi wetafura kukosha. email. Ngationei kana izvi zvichishanda:

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" inotiudza kuti mubvunzo izvozvi unongoda index chete, iyo inobatsira kudzivirira dhisiki yese I / O kuverenga murwi wetafura.

Nhasi, ma indexes ekuvhara anowanikwa chete kune B-miti. Zvisinei, munyaya iyi kuedza kwekugadzirisa kuchave kwakakwirira.

Kushandisa Partial Indexes

Partial indexes indekisi chete chikamu chidiki chemitsara yetafura. Izvi zvinokutendera iwe kuchengetedza index saizi uye kuita scans nekukurumidza.

Ngatitii isu tinoda kuwana runyorwa rweemail kero yevatengi vedu muCalifornia. Chikumbiro chichava seizvi:

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)

Ndeapi ma index index achatipa:

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)

Scan address yakatsiviwa ne index scanning idx_address1, uye ipapo murwi wacho wakaongororwa address.

Sezvo uyu uri mubvunzo unogara uchibvunzwa uye uchida kuvandudzwa, tinogona kushandisa chikamu che index, icho chinonongedza chete mitsetse ine kero umo nzvimbo yacho. β€˜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)

Iye zvino chikumbiro chinoverenga chete idx_address2 uye haabati tafura address.

Kushandisa Multi-Value Indexes

Mamwe makoramu anoda kuiswa indexed anogona kunge asina scalar data type. Column mhando dzakadai jsonb, arrays ΠΈ tsvector zvine zvirevo zvakasanganiswa kana zvakawanda. Kana iwe uchida kunyoresa makoramu akadaro, iwe kazhinji unofanirwa kutsvaga ese ega ega hunhu mumakoramu iwayo.

Ngatiedzei kutsvaga mazita emafirimu ese ane zvimedu kubva kune asina kubudirira kutora. Mutafura film pane chinyorwa chinyorwa chinonzi special_features. Kana bhaisikopo riine iyi "special property", saka iyo column ine chinhu chiri muchimiro chemavara array Behind The Scenes. Kuti titsvage mafirimu akadaro, tinoda kusarudza mitsetse yose ine "Behind The Scenes" pa chero array values special_features:

SELECT title FROM film WHERE special_features @> '{"Behind The Scenes"}';

Containment operator @> inotarisa kana rutivi rworudyi ichikamu chiduku cherutivi rworuboshwe.

Chirongwa chemubvunzo:

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)

Iyo inokumbira yakazara murwi scan ine mutengo we67.

Ngationei kana indekisi yenguva dzose B-muti ichatibatsira:

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)

Iyo index haina kana kutariswa. Iyo B-muti index haina ruzivo nezve kuvepo kwezvinhu zvega muhunhu hwainonongedza.

Tinoda GIN index.

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)

Iyo GIN indekisi inotsigira kumepu hunhu hwemunhu kune indexed composite kukosha, zvichikonzera inopfuura hafu yemutengo wechirongwa chemubvunzo.

Kubvisa duplicate indexes

Indekisi dzinoungana nekufamba kwenguva, uye dzimwe nguva indekisi nyowani inogona kunge iine tsananguro yakafanana neyeimwe yapfuura. Iwe unogona kushandisa iyo catalog maonero kuti uwane-inoverengeka SQL index tsananguro pg_indexes. Iwe unogona zvakare kuwana nyore tsananguro dzakafanana:

 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)

Superset Indexes

Zvinogona kuitika kuti iwe uunganidze indekisi dzakawanda, imwe yacho inoratidzira superset yemakoramu ayo mamwe indekisi index. Izvi zvinogona kana kusadiwa - superset inogona kukonzera index-chete scan, izvo zvakanaka, asi zvinogona kutora nzvimbo yakawandisa, kana kubvunza iyo superset yaida kukwirisa haichashandiswi.

Kana iwe uchida kuita otomatiki tsananguro yeindekisi dzakadaro, unogona kutanga nazvo pg_index kubva patafura pg_catalog.

Ma indexes asina kushandiswa

Sezvo maapplication anoshandisa dhatabhesi anoshanduka, saka mibvunzo yavanoshandisa. Ma indexes aimbowedzerwa anogona kunge asisashandiswe nechero mibvunzo. Pese painotariswa index, inocherechedzwa nemaneja wenhamba uye mune iyo system catalog view pg_stat_user_indexes unogona kuona kukosha idx_scan, inova cumulative counter. Kutevera kukosha uku nekufamba kwenguva (taura mwedzi) kunopa zano rakanaka rekuti ndeapi indexes asiri kushandiswa uye anogona kudonhedzwa.

Hechino chikumbiro chekutora yazvino scan kuverenga yeese indexes mu schema β€˜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)

Kuvakazve indexes nemakiyi mashoma

Ma indexes anowanzoda kugadzirwa patsva, semuenzaniso kana azvimba, uye kugadzira patsva kunogona kukurumidzira kuongorora. Indexes inogona zvakare kushatiswa. Kuchinja index parameter kungangoda kuti igadziriswezve.

Gonesa kugadzira indekisi inofambirana

MuPostgreSQL 11, B-Muti index kusikwa kwakafanana. Kuti ikurumidze kusika maitiro, vashandi vakati wandei vakafanana vanogona kushandiswa. Nekudaro, ita shuwa kuti izvi zvigadziriso zvigadziriso zvakaiswa nenzira kwayo:

SET max_parallel_workers = 32;
SET max_parallel_maintenance_workers = 16;

Iwo default values ​​idiki zvakanyanya. Nenzira yakanaka, nhamba idzi dzinofanira kuwedzera pamwe chete nehuwandu hwema processor cores. Verenga zvakawanda mu zvinyorwa.

Background index kugadzira

Iwe unogona kugadzira index kumashure uchishandisa sarudzo CONCURRENTLY mirairo CREATE INDEX:

pagila=# CREATE INDEX CONCURRENTLY idx_address1 ON address(district);
CREATE INDEX

Iyi nzira yekugadzira index inosiyana neyakajairika pakuti haidi kukiya tafura, uye nekudaro haivharise mabasa ekunyora. Ukuwo, zvinotora nguva yakareba uye zvinopedza zviwanikwa zvakawanda.

Postgres inopa akawanda anochinjika sarudzo dzekugadzira indexes uye mhinduro kune chero akakosha kesi, uye zvakare inopa nzira dzekutonga dhatabhesi kana application yako ikakura zvakanyanya. Tinovimba kuti matipi aya achakubatsira kuita kuti mibvunzo yako ikurumidze uye dhatabhesi rako rigadzirire kuyera.

Source: www.habr.com

Voeg