Index med en kolumn
Postgres kan kombinera flera index mycket effektivt i en enda fråga med bitmappsindexskanningar . För det mesta väljs det mest selektiva indexet (eller två, kombinerat med bitmappsindexavsökningar) och resten filtreras. När resultatuppsättningen är tillräckligt smal är det inte effektivt att skanna fler index.
Flerkolumnindex
Det är fortfarande snabbare att ha ett perfekt matchande flerkolumnindex, men inte i storleksordningar.
Eftersom du vill inkludera en matristyp Jag föreslår att du använder ett GIN index. AFAIK, operatörsklasser saknas för generella GiST-index på arraytyp. (Undantaget är intarray
för integer
arrayer.)
Att inkludera integer
kolumnen installerar du först tilläggsmodulen btree_gin
, som tillhandahåller de nödvändiga GIN-operatörsklasserna. Kör en gång per databas :
CREATE EXTENSION btree_gin;
Då bör du kunna skapa ditt flerkolumnindex:
CREATE INDEX tbl_abc_gin_idx ON tbl USING GIN(a, b, c);
Ordningen på indexkolumnerna är irrelevant för GIN-index. Manualen:
Ett GIN-index med flera kolumner kan användas med frågevillkor som involverar vilken delmängd som helst av indexets kolumner. Till skillnad från B-tree eller GiST är indexsökningseffektiviteten densamma oavsett vilken eller vilka indexkolumner som sökvillkoren använder.
Sök efter närmaste granne
Eftersom du inkluderar en PostGis geometry
typ, chansen är stor att du vill göra en närmaste grannesökning, för vilken du behöver en GiST index. I det här fallet föreslår jag två index:
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);
Du kan lägga till integer
kolumn c
till endera eller båda. Det beror på. För det behöver du antingen btree_gin
eller btree_gist
eller båda.