sql >> Databasteknik >  >> RDS >> PostgreSQL

Flerkolumnindex på 3 fält med heterogena datatyper

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.



  1. mySQL-fel 1040:För många anslutningar

  2. Antal rader med PDO

  3. Arbeta med datum i PostgreSQL

  4. returnera värde vid en position från STRING_SPLIT i SQL Server 2016