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

Postgres kombinující více indexů

Nevím, jestli Pg dokáže kombinovat index GiST a běžné indexy b-stromu se skenováním indexu bitmapy, ale mám podezření, že ne. Nejlepšího výsledku můžete dosáhnout bez přidání user_id sloupec k vašemu indexu GiST (a následně jeho větší a pomalejší pro další dotazy, které nepoužívají user_id ).

Jako experiment můžete:

CREATE EXTENSION btree_gist;
CREATE INDEX ix_coords_and_user_id ON test USING GIST (coords, user_id);

což pravděpodobně povede k velkému indexu, ale může tento dotaz posílit - pokud to funguje. Uvědomte si, že udržování takového indexu výrazně zpomalí INSERT a UPDATE s. Pokud zahodíte staré ix_coords vaše dotazy budou používat ix_coords_and_user_id i když nefiltrují podle user_id , ale bude pomalejší než ix_coords . Zachování obou způsobí, že INSERT a UPDATE zpomalení ještě horší.

Viz btree-gist

(Zastaralé úpravou na otázku, která otázku úplně změní; při zápisu měl uživatel vícesloupcový index, který se nyní rozdělil na dva samostatné ):

Zdá se, že nefiltrujete nebo neřadíte podle user_id , pouze create_date . Pg nebude (nemůže?) používat pouze druhý termín vícesloupcového indexu, jako je (user_id, create_date) , potřebuje také použít první položku.

Pokud chcete indexovat create_date , vytvořte pro něj samostatný index. Pokud používáte a potřebujete (user_id, create_date) index a obecně nepoužívejte pouze user_id sám, zjistěte, zda můžete obrátit pořadí sloupců. Alternativně vytvořte dva nezávislé indexy (user_id) a (create_date) . Když jsou potřeba oba sloupce, Pg může kombinovat dva nezávislé indexy pomocí skenování indexu bitmapy.



  1. Prohledejte všechny sloupce, všechny tabulky pro konkrétní hodnotu

  2. Příkaz SQL - Jak lze zlepšit rychlost indexováním

  3. uložené procedury a problém s mysql_insert_id

  4. Zpracování výjimek vnořených procedur Pl/SQL