Enkelkolomsindex
Postgres kan meerdere indexen zeer efficiënt combineren in een enkele zoekopdracht met bitmapindexscans . Meestal wordt de meest selectieve index gekozen (of twee, gecombineerd met bitmapindexscans) en wordt de rest gefilterd. Zodra de resultatenset smal genoeg is, is het niet efficiënt om meer indexen te scannen.
Index met meerdere kolommen
Het is nog steeds sneller om een perfect overeenkomende index met meerdere kolommen te hebben, maar niet in ordes van grootte.
Omdat u een arraytype wilt opnemen Ik raad aan om een GIN . te gebruiken inhoudsopgave. AFAIK, operatorklassen ontbreken voor GiST-indexen voor algemene doeleinden op arraytype. (De uitzondering is intarray
voor integer
arrays.)
Om het integer
op te nemen kolom, installeer dan eerst de extra module btree_gin
, die de nodige GIN-operatorklassen biedt. Voer eenmaal per database uit :
CREATE EXTENSION btree_gin;
Dan zou u uw index met meerdere kolommen moeten kunnen maken:
CREATE INDEX tbl_abc_gin_idx ON tbl USING GIN(a, b, c);
De volgorde van indexkolommen is niet relevant voor GIN-indexen. De handleiding:
Een GIN-index met meerdere kolommen kan worden gebruikt met queryvoorwaarden die betrekking hebben op een subset van de kolommen van de index. In tegenstelling tot B-tree of GiST is de zoekeffectiviteit van de index hetzelfde, ongeacht welke indexkolom(men) de zoekvoorwaarden gebruiken.
Zoeken met dichtstbijzijnde buren
Aangezien u een PostGis geometry
type, is de kans groot dat je een naaste buur zoekt, waarvoor je een GiST . nodig hebt inhoudsopgave. In dit geval stel ik twee voor indexen:
CREATE INDEX tbl_ac_gist_idx ON tbl USING GiST(a, c); -- geometry type
CREATE INDEX tbl_bc_gin_idx ON tbl USING GIN(b, c);
Je zou de integer
. kunnen toevoegen kolom c
naar een of beide. Dat hangt ervan af. Daarvoor heb je btree_gin
. nodig of btree_gist
of beide, respectievelijk.