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

Indexování a další:GIN indexy

PostgreSQL má několik typů indexů:B-tree, Hash, GiST, Gin a SP-GiST. Je zřejmé, že každý z nich pokrývá specifickou potřebu. Dokumentace PostgreSQL například říká o indexech GIN:

Takže indexy GIN lze použít k indexování prvků pole, hstore a tak dále.

Ale tentokrát budeme hovořit o jednom z těch modulů contrib, které poskytují více druhů operátorů, které lze použít s indexy GIN:pg_trgm.

Tento modul vytváří trigramy textových řetězců, aby mohl být použit k nalezení podobností. To umožňuje indexům podobným GIN, které používají třídu operátorů gin_trgm_ops, být používány při vyhledávání LIKE, i když je na začátku vyhledávacího vzoru nalezen zástupný znak '%' (například:název LIKE '%jaime%').

Chcete-li vytvořit index, který lze použít takto, musí být index vytvořen takto:

CREATE INDEX idx_gin ON table USING GIN (campo_texto gin_trgm_ops);

S indexem, jako je tento, jsem viděl pokles dotazů z více než 10 s na několik milisekund; než se však vrhnete na vytváření těchto indexů, zvažte problémy, které máte.

Zvažte následující dotaz "select show_trgm('Jaime Casanova');" To nám ukazuje trigramy textového řetězce, v tomto případě 15 trigramů. Není tedy těžké si představit, že tento typ indexu hodně roste a čím větší textové řetězce, tím více index roste (protože bude více trigramů). Dalším zřejmým závěrem je, že údržba tohoto typu indexů může být drahá, ve skutečnosti může výrazně ovlivnit výkon INSERT a UPDATE, zejména pokud je na stejné tabulce několik těchto indexů, aby se tento problém trochu snížil pomocí techniky zvané fastupdate byl vynalezen, který spočívá v udržování neuspořádaného seznamu nevyřízených. Takže INSERT a UPDATE místo vkládání do hlavního indexu to dělají do této dodatečné struktury, dokud nenastane VACUUM nebo dokud se nevyřízený seznam zvětší než work_mem. Nevýhody jsou:1) čtení indexu musí také číst tuto další strukturu, která může ovlivnit výkon dotazu; a 2) VLOŽENÍ nebo AKTUALIZACE může způsobit, že se nevyřízené položky příliš zvětší, a proto začnou zpracovávat nevyřízené položky, což ovlivní toto VLOŽENÍ nebo AKTUALIZACE a všechny ostatní operace probíhající souběžně na této tabulce.

Závěrem; index GIN spolu s modulem pg_trgm může výrazně pomoci při výkonu některých dotazů, neměly by však být zneužívány, protože mohou být dvousečným mečem.


  1. Použití Geekbench 3 k vyhodnocení výkonu databázového serveru

  2. String -> java.util.Date -> java.sql.Date (s časovým razítkem)

  3. Spravovaný ovladač ODP.NET se nezobrazuje v dialogovém okně Zdroj dat

  4. Jak získat číslo řádku v PostgreSQL