Parametry nákladů plánovače
To mi říká, že vaše random_page_cost a seq_page_cost se pravděpodobně mýlí. Pravděpodobně používáte úložiště s rychlými náhodnými I/O – buď proto, že většina databáze je uložena v mezipaměti RAM, nebo proto, že používáte SSD, SAN s mezipamětí nebo jiné úložiště, kde jsou náhodné vstupy a výstupy ze své podstaty rychlé.
Zkuste:
SET random_page_cost = 1;
SET seq_page_cost = 1.1;
výrazně snížit rozdíly v nákladových parametrech a poté znovu spustit. Pokud se to stane, zvažte změnu těchto parametrů v postgresql.conf. .
Vaše odhady počtu řádků jsou rozumné, takže to nevypadá jako problém se špatným odhadem plánovače nebo problém se špatnou statistikou tabulky.
Nesprávný dotaz
Váš dotaz je také nesprávný. OFFSET 0 LIMIT 1 bez ORDER BY přinese nepředvídatelné výsledky, pokud nemáte zaručeno, že budete mít přesně jednu shodu, v takovém případě OFFSET ... LIMIT ... klauzule jsou zbytečné a lze je zcela odstranit.
Obvykle je mnohem lepší formulovat takové dotazy jako SELECT max(...) nebo SELECT min(...) kde je to možné; PostgreSQL bude mít tendenci používat index k pouhému získání požadované hodnoty, aniž by prováděl drahé skenování tabulky nebo skenování indexu a řazení.
Tipy
BTW, pro budoucí otázky má PostgreSQL wiki nějaké dobré informace v kategorii výkonu a průvodce kladením dotazů s pomalým dotazem .