PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Postgresql - Abfrage läuft viel schneller mit enable_nestloop=false. Warum macht der Planer nicht das Richtige?

Wenn der Abfrageplaner suboptimale Abfragepläne auswählt, stehen die Chancen gut, dass er mit unvollständigen oder irreführenden Informationen arbeiten kann.

Siehe diese PostgreSQL-Wiki-Seite zum Thema Servertuning. Achten Sie besonders auf die Kapitel zu random_page_cost und default_statistics_target .
Lesen Sie auch die entsprechenden Kapitel im Handbuch zu Statistiken Wird vom Planer verwendet und Kostenkonstanten des Planers .

Genauer gesagt könnte es hilfreich sein, das statistics target zu erhöhen für die folgenden Spalten:

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;

Diese sind an den Filtern beteiligt, die zu

führen

Es gibt mehr . Überprüfen Sie jede Spalte, in der der Hobel stark von der Schätzung abweicht. Default ist nur 100. Macht nur Sinn bei Tabellen mit>> 1000 Zeilen. Experimentieren Sie mit der Einstellung. Führen Sie ANALYZE aus auf den Tabellen danach, damit die Änderungen wirksam werden.

Es kann auch hilfreich sein, einen Teilindex zu erstellen auf postgres(sales_orders.retailer_id) WHERE retailer_id IS NOT NULL (je nachdem, wie häufig NULL-Werte vorkommen).

Eine andere Sache, die Ihnen helfen kann, ist ein Upgrade auf die neuste Version 9.1. In diesem Bereich wurden einige wesentliche Verbesserungen vorgenommen.