
I saol Postgres, tĂĄ innĂ©acsanna riachtanach chun stĂłrĂĄil an bhunachair sonraĂ a nascleanĂșint go hĂ©ifeachtĂșil (ar a dtugtar "carn"). NĂ thacaĂonn Postgres le braisliĂș dĂł, agus cuireann ailtireacht an MVCC faoi deara go mbĂonn go leor leaganacha den tuple cĂ©anna agat. DĂĄ bhrĂ sin, tĂĄ sĂ© an-tĂĄbhachtach a bheith in ann innĂ©acsanna Ă©ifeachtacha a chruthĂș agus a chothabhĂĄil chun tacĂș le hiarratais.
Seo roinnt leideanna chun ĂșsĂĄid innĂ©acsanna a bharrfheabhsĂș agus a fheabhsĂș.
Tabhair faoi deara: oibrĂonn na fiosruithe a thaispeĂĄntar thĂos ar neamhmhodhnĂș .
Ag ĂsĂĄid InnĂ©acsanna ClĂșdaigh
BreathnaĂmid ar iarratas chun seoltaĂ rĂomhphoist a bhaint as ĂșsĂĄideoirĂ neamhghnĂomhacha. TĂĄbla customer tĂĄ colĂșn active, agus tĂĄ an cheist simplĂ:
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) Baineann an cheist leis an seicheamh scanadh tĂĄbla iomlĂĄn customer. CruthaĂmid innĂ©acs ar cholĂșn 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) Chuidigh sĂ©, d'iompaigh an scanadh ina dhiaidh sin isteach "index scanâ. CiallaĂonn sĂ© seo go ndĂ©anfaidh Postgres an t-innĂ©acs a scanadh "idx_cust1" , agus ansin lean ar aghaidh ag cuardach an charn tĂĄbla chun luachanna na gcolĂșn eile a lĂ©amh (sa chĂĄs seo, an colĂșn email) a theastaĂonn Ăłn bhfiosrĂșchĂĄn.
Tugtar isteach innĂ©acsanna cumhdaigh in PostgreSQL 11 . Ligeann siad duit colĂșn breise amhĂĄin nĂł nĂos mĂł a chur san ĂĄireamh san innĂ©acs fĂ©in - stĂłrĂĄiltear a luachanna sa stĂłr sonraĂ innĂ©acs.
DĂĄ mbainfimid leas as an ngnĂ© seo agus mĂĄ chuireamar an luach rĂomhphoist laistigh den innĂ©acs, nĂ bheadh ââââgĂĄ le Postgres cuardach a dhĂ©anamh ar an gcarn tĂĄbla don luach. email. Feicfimid an n-oibreoidh sĂ© seo:
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' a insĂonn dĂșinn nach bhfuil ag teastĂĄil Ăłn bhfiosrĂșchĂĄn anois ach innĂ©acs, rud a chabhraĂonn le gach diosca I/O a sheachaint chun an carn tĂĄbla a lĂ©amh.
NĂl innĂ©acsanna clĂșdaigh ar fĂĄil faoi lĂĄthair ach amhĂĄin do chrainn B. Mar sin fĂ©in, sa chĂĄs seo, beidh an iarracht chothabhĂĄla nĂos airde.
Ag ĂsĂĄid InnĂ©acsanna PĂĄirteach
NĂ innĂ©acsaĂonn innĂ©acsanna pĂĄirteacha ach fo-thacar de na sraitheanna i dtĂĄbla. SĂĄbhĂĄlann sĂ© seo mĂ©id na n-innĂ©acsanna agus dĂ©anann sĂ© scanadh nĂos tapĂșla.
Ligean le rĂĄ gur mhaith linn liosta de sheoltaĂ rĂomhphoist ĂĄr gcustaimĂ©irĂ a fhĂĄil i gCalifornia. Beidh an t-iarratas mar seo:
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)Cad a thabharfaidh gnĂĄth-innĂ©acsanna dĂșinn:
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 Tå scanadh innéacs curtha ina ionad idx_address1agus ansin scanadh an gcarn address.
Ăs rud Ă© gur ceist mhinic Ă© seo agus gur gĂĄ Ă© a bharrfheabhsĂș, is fĂ©idir linn innĂ©acs pĂĄirteach a ĂșsĂĄid, a dhĂ©anann innĂ©acsĂș ar na sraitheanna sin amhĂĄin le seoltaĂ ina bhfuil an ceantar. â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) Anois nà léann ach an cheist idx_address2 agus nach dteagmhåil leis an tåbla address.
Ag baint ĂșsĂĄide as InnĂ©acsanna Illuacha
Seans nach mbeidh cineĂĄl sonraĂ scĂĄlach i roinnt colĂșin atĂĄ le hinnĂ©acsĂș. Is maith le cineĂĄlacha colĂșn jsonb, arrays Đž tsvector go bhfuil luachanna ilchodacha nĂł iolracha ann. MĂĄs gĂĄ duit colĂșin den sĂłrt sin a innĂ©acsĂș, de ghnĂĄth caithfidh tĂș cuardach a dhĂ©anamh trĂ na luachanna aonair go lĂ©ir sna colĂșin sin.
DĂ©anaimis iarracht teacht ar theidil na scannĂĄn go lĂ©ir ina bhfuil gearrthacha Ăł ghlactha nĂĄr Ă©irigh leo. TĂĄbla film tĂĄ colĂșn tĂ©acs ar a dtugtar special_features. MĂĄ tĂĄ an "airĂonna speisialta" seo ag an scannĂĄn, tĂĄ an eilimint mar eagar tĂ©acs sa cholĂșn Behind The Scenes. Chun cuardach a dhĂ©anamh ar gach scannĂĄn den sĂłrt sin, nĂ mĂłr dĂșinn gach sraith a roghnĂș le "Behind The Scenes" nuair aon luachanna eagar special_features:
SELECT title FROM film WHERE special_features @> '{"Behind The Scenes"}'; Oibreoir neadaithe @> seiceålacha må tå an taobh deas fo-thacar den taobh clé.
Plean iarratais:
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)A iarrann scanadh carn iomlĂĄn ar chostas 67.
Feicfimid an gcabhraĂonn innĂ©acs rialta crann B linn:
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)NĂor measadh an t-innĂ©acs fiĂș. NĂ heol don innĂ©acs B-crann go bhfuil gnĂ©ithe aonair sna luachanna innĂ©acsaithe.
TĂĄ innĂ©acs GIN de dhĂth orainn.
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)TacaĂonn an t-innĂ©acs GIN le luachanna aonair a mhapĂĄil i gcoinne luachanna ilchodacha innĂ©acsaithe, rud a fhĂĄgann go bhfuil costas plean fiosrĂșchĂĄin nĂos mĂł nĂĄ leath.
FĂĄil rĂ©idh le hinnĂ©acsanna dĂșblacha
Carnann innĂ©acsanna le himeacht ama, agus uaireanta dâfhĂ©adfadh an sainmhĂniĂș cĂ©anna a bheith in innĂ©acs nua agus a bhĂ ar na cinn roimhe seo. Is fĂ©idir leat amharc na catalĂłige a ĂșsĂĄid chun sainmhĂnithe SQL atĂĄ inlĂ©ite ag daoine a fhĂĄil ar innĂ©acsanna. pg_indexes. Is fĂ©idir leat sainmhĂnithe comhionanna a fhĂĄil go hĂ©asca freisin:
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)
Innéacsanna Sårshraith
Is fĂ©idir go dtarlĂłdh sĂ© go mbeidh go leor innĂ©acsanna agat, ceann acu a dhĂ©anann innĂ©acsĂș ar shĂĄrthacar de cholĂșin a dhĂ©anann innĂ©acsĂș ar innĂ©acsanna eile. DâfhĂ©adfadh nĂł nach mbeadh sĂ© seo inmhianaitheâdâfhĂ©adfadh scananna innĂ©acs-amhĂĄin a bheith mar thoradh ar an sĂĄr-thacar, rud atĂĄ go maith, ach dâfhĂ©adfadh go dtĂłgfadh sĂ© an iomarca spĂĄis, nĂł nĂ bhaintear ĂșsĂĄid a thuilleadh as an bhfiosrĂșchĂĄn a raibh sĂ© i gceist ag an sĂĄrshraith Ă© a bharrfheabhsĂș.
MĂĄs gĂĄ duit an sainmhĂniĂș ar innĂ©acsanna den sĂłrt sin a uathoibriĂș, is fĂ©idir leat tosĂș leis Ăłn mbord pg_catalog.
InnĂ©acsanna neamhĂșsĂĄidte
De rĂ©ir mar a fhorbraĂonn feidhmchlĂĄir a ĂșsĂĄideann bunachair shonraĂ, is amhlaidh a thagann na ceisteanna a ĂșsĂĄideann siad. NĂ fĂ©idir innĂ©acsanna a cuireadh leis nĂos luaithe a ĂșsĂĄid a thuilleadh le haon cheist. Gach uair a scanadh innĂ©acs, dĂ©anann an bainisteoir staitisticĂ Ă© a mharcĂĄil, agus i radharc catalĂłg an chĂłrais pg_stat_user_indexes is fĂ©idir leat an luach a fheiceĂĄil idx_scan, atĂĄ ina chuntar carnach. MĂĄ dhĂ©antar an luach seo a rianĂș thar thrĂ©imhse ama (abair mĂ) tabharfar smaoineamh maith duit faoi na hinnĂ©acsanna nach bhfuil ĂĄ n-ĂșsĂĄid agus a bhfĂ©adfaĂ iad a ĂsliĂș.
Seo ceist chun na hĂĄirimh reatha scanadh a fhĂĄil ar na hinnĂ©acsanna go lĂ©ir sa scĂ©imre â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)InnĂ©acsanna a atĂłgĂĄil le nĂos lĂș glas
Is minic is gĂĄ innĂ©acsanna a atĂłgĂĄil, mar shampla nuair a thagann siad faoi bhlĂĄth, agus fĂ©adann atĂłgĂĄil an scanadh a bhrostĂș. Chomh maith leis sin is fĂ©idir innĂ©acsanna a fhĂĄil truaillithe. D'fhĂ©adfadh go mbeadh gĂĄ le atĂłgĂĄil na bparaimĂ©adar innĂ©acs freisin.
Cumasaigh cruthĂș innĂ©acs comhthreomhar
In PostgreSQL 11, cruthaĂtear innĂ©acs B-Tree i gcomhthrĂĄth. Chun an prĂłiseas cruthaithe a bhrostĂș, is fĂ©idir roinnt oibrithe comhthreomhara a ĂșsĂĄid. Mar sin fĂ©in, dĂ©an cinnte go bhfuil na roghanna cumraĂochta seo socraithe i gceart:
SET max_parallel_workers = 32;
SET max_parallel_maintenance_workers = 16;TĂĄ na luachanna rĂ©amhshocraithe rĂł-bheag. Go hidĂ©alach, ba cheart go n-ardĂłdh na huimhreacha seo chomh maith le lĂon na gcroĂthe prĂłiseĂĄlaithe. LĂ©igh tuilleadh i .
CruthĂș innĂ©acs cĂșlra
Is fĂ©idir leat innĂ©acs a chruthĂș sa chĂșlra ag baint ĂșsĂĄide as an rogha CONCURRENTLY orduithe CREATE INDEX:
pagila=# CREATE INDEX CONCURRENTLY idx_address1 ON address(district);
CREATE INDEXTĂĄ an nĂłs imeachta cruthĂș innĂ©acs seo difriĂșil Ăłn ngnĂĄthnĂłs sa mhĂ©id is nach dteastaĂonn glas ar an tĂĄbla, agus mar sin nĂ chuireann sĂ© bac ar oibrĂochtaĂ scrĂbhneoireachta. Ar an lĂĄimh eile, tĂłgann sĂ© nĂos mĂł ama agus ĂdĂonn nĂos mĂł acmhainnĂ.
SolĂĄthraĂonn Postgres go leor solĂșbthachta maidir le hinnĂ©acsanna a chruthĂș agus bealaĂ chun dĂ©ileĂĄil le haon chĂĄsanna speisialta, chomh maith le bealaĂ chun an bunachar sonraĂ a bhainistiĂș ar eagla go bhfĂĄsfaidh dâiarratas go plĂ©ascach. TĂĄ sĂșil againn go gcabhrĂłidh na leideanna seo leat do cheisteanna a fhĂĄil go tapa agus do bhunachar sonraĂ rĂ©idh de rĂ©ir scĂĄla.
Foinse: will.com
