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

Postgresql 9.x:Index pro optimalizaci dotazů „xpath_exists“ (XMLEXISTS)

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 .




  1. Jak resetovat zastavovací slova v MYSQL?

  2. MYSQL - získáte řádek za každý rok s celkovým součtem za každý měsíc

  3. dbms_output.put_line

  4. SET DATEFIRST – Nastavte první den v týdnu na SQL Serveru