sql >> Databáze >  >> RDS >> PostgreSQL

Vícesloupcový index na 3 polích s heterogenními datovými typy

Jednosloupcový index

Postgres dokáže velmi efektivně kombinovat více indexů v jediném dotazu s skenováním bitmapových indexů . Většinou se vybere nejselektivnější index (nebo dva v kombinaci s prohledáváním indexu bitmap) a zbytek se filtruje. Jakmile je sada výsledků dostatečně úzká, není efektivní skenovat více indexů.

Vícesloupcový index

Stále je rychlejší mít dokonale odpovídající vícesloupcový index, ale ne o řády.
Protože chcete zahrnout typ pole Doporučuji použít GIN index. AFAIK, třídy operátorů chybí pro obecné indexy GiST na typu pole. (Výjimkou je intarray pro integer pole.)

Chcete-li zahrnout integer nejprve nainstalujte přídavný modul btree_gin , který poskytuje potřebné třídy operátorů GIN. Spustit jednou pro každou databázi :

CREATE EXTENSION btree_gin;

Pak byste měli být schopni vytvořit svůj vícesloupcový index:

CREATE INDEX tbl_abc_gin_idx ON tbl USING GIN(a, b, c);

Pořadí sloupců indexu je pro indexy GIN irelevantní. Manuál:

Vícesloupcový index GIN lze použít s podmínkami dotazu, které zahrnují jakoukoli podmnožinu sloupců indexu. Na rozdíl od B-stromu nebo GiST je účinnost vyhledávání indexu stejná bez ohledu na to, který sloupec indexu(y) používají podmínky dotazu.

Hledání nejbližšího souseda

Protože zahrnujete geometry PostGis typu, je pravděpodobné, že chcete provést vyhledávání nejbližšího souseda, ke kterému potřebujete GiST index. V tomto případě navrhuji dva indexy:

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);

Můžete přidat integer sloupec c k jednomu nebo oběma. To záleží. K tomu potřebujete buď btree_gin nebo btree_gist nebo obojí.



  1. SQL Server Xml dotaz s více obory názvů

  2. Vícenásobná funkce REPLACE v Oracle

  3. Klonování databází pomocí PSDatabaseClone

  4. Jak nainstalovat modul Python MySQLdb pomocí pip?