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 .