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

Jak donutím Postgres, aby používal konkrétní index?

Za předpokladu, že se ptáte na běžnou funkci "index hinting", kterou najdete v mnoha databázích, PostgreSQL takovou funkci neposkytuje. Toto bylo vědomé rozhodnutí týmu PostgreSQL. Dobrý přehled o tom, proč a co můžete dělat místo toho, najdete zde. Důvody jsou v zásadě ty, že jde o hack výkonu, který má tendenci způsobovat další problémy později, jak se vaše data mění, zatímco optimalizátor PostgreSQL může přehodnotit plán na základě statistik. Jinými slovy, to, co může být dobrým plánem dotazů dnes, pravděpodobně nebude dobrým plánem dotazů pro všechny časy a indexové rady si vynucují konkrétní plán dotazů pro všechny časy.

Jako velmi tupé kladivo, užitečné pro testování, můžete použít enable_seqscan a enable_indexscan parametry. Viz:

  • Zkoumání použití indexu
  • enable_ parametry

Tyto položky nejsou vhodné pro trvalé produkční použití . Pokud máte problémy s výběrem plánu dotazů, měli byste si prohlédnout dokumentaci pro sledování problémů s výkonem dotazů. Nenastavujte pouze enable_ params a odejít.

Pokud nemáte velmi dobrý důvod pro použití indexu, Postgres možná dělá správnou volbu. Proč?

  • U malých tabulek je rychlejší provádět sekvenční skenování.
  • Postgres nepoužívá indexy, když se datové typy správně neshodují, možná budete muset zahrnout vhodná přetypování.
  • Problémy může způsobovat nastavení plánovače.

Viz také tento starý příspěvek v diskusní skupině.



  1. Vytvořte vypočítaný sloupec pomocí dat z jiné tabulky

  2. Sdružování připojení pomocí Pgbouncer na PostgreSQL 9.0

  3. Dotaz k získání pouze čísel z řetězce

  4. Dotaz serveru SQL pro získání seznamu sloupců v tabulce spolu s omezeními typu dat, NOT NULL a PRIMARY KEY