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

Postgresql – Dotaz běží mnohem rychleji s enable_nestloop=false. Proč plánovač nedělá správnou věc?

Pokud plánovač dotazů zvolí neoptimální plány dotazů, je pravděpodobné, že bude pracovat s neúplnými nebo zavádějícími informacemi.

Podívejte se na tuto stránku PostgreSQL Wiki na ladění serveru. Věnujte pozornost zejména kapitolám o random_page_cost a default_statistics_target .
Přečtěte si také odpovídající kapitoly v příručce o statistikách Používá Plánovač a Konstanty nákladů plánovače .

Přesněji řečeno, může pomoci zvýšit statistics target pro následující sloupce:

ALTER TABLE postgres.products ALTER COLUMN id SET STATISTICS 1000;
ALTER TABLE postgres.sales_orders ALTER COLUMN retailer_id SET STATISTICS 1000;
ALTER TABLE postgres.sales_orders ALTER COLUMN company_id SET STATISTICS 1000;

ALTER TABLE goods_return_notes ALTER COLUMN retailer_id SET STATISTICS 1000;
ALTER TABLE goods_return_notes ALTER COLUMN company_id SET STATISTICS 1000;

ALTER TABLE retailer_category_leaf_nodes ALTER COLUMN tree_left SET STATISTICS 1000;
ALTER TABLE channels ALTER COLUMN principal_id SET STATISTICS 1000;

Ty jsou zapojeny do filtrů, jejichž výsledkem je

Je jich další . Zkontrolujte každý sloup, kde se hoblík hodně odchyluje od odhadu. Výchozí hodnota je pouze 100. Má smysl pouze pro tabulky s>> 1000 řádky. Experimentujte s nastavením. Spusťte ANALYZE na tabulky poté, aby se změny projevily.

Může také pomoci vytvořit částečný index na postgres(sales_orders.retailer_id) WHERE retailer_id IS NOT NULL (v závislosti na tom, jak běžné jsou hodnoty NULL).

Další věc, která vám může pomoci, je upgrade na nejnovější verzi 9.1. V této oblasti došlo k řadě podstatných zlepšení.



  1. Mysql:Je praktické vytvořit samostatnou tabulku pro příspěvky každého uživatele

  2. Příklad podmínky Oracle IF

  3. PostgreSQL jak vytvořit kopii databáze nebo schématu?

  4. Problém s php seznamem objednávek / while loop