sql >> Database teknologi >  >> RDS >> PostgreSQL

Postgresql - Forespørgsel kører meget hurtigere med enable_nestloop=false. Hvorfor gør planlæggeren ikke det rigtige?

Hvis forespørgselsplanlæggeren vælger suboptimale forespørgselsplaner, er der stor sandsynlighed for, at den har ufuldstændige eller vildledende oplysninger at arbejde med.

Se denne PostgreSQL Wiki-side på server tuning. Vær især opmærksom på kapitlerne om tilfældige_side_omkostninger og default_statistics_target .
Læs også de tilsvarende kapitler i manualen om Statistik Brugt af planlæggeren og Planner-omkostningskonstanter .

Mere specifikt kan det hjælpe at øge statistics target for følgende kolonner:

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;

Disse er involveret i filtrene, hvilket resulterer i

Der er flere . Tjek hver kolonne, hvor høvlen afviger meget fra estimatet. Standard er kun 100. Giver kun mening for tabeller med>> 1000 rækker. Eksperimenter med indstillingen. Kør ANALYZE på tabellerne bagefter for at ændringerne træder i kraft.

Det kan også hjælpe at oprette et delvist indekspostgres(sales_orders.retailer_id) WHERE retailer_id IS NOT NULL (afhængigt af hvor almindelige NULL-værdier er).

En anden ting, der kan hjælpe dig, er at opgradere til den seneste version 9.1. Der er sket en række væsentlige forbedringer på dette område.



  1. SQL, Hjælpetabel over tal

  2. mySQL-tæller returnerer kun ét resultat, medmindre du bruger gruppe efter

  3. Ville en begrænsning af en unik nøgle med mange felter skade MySQL-ydeevnen?

  4. MySQL – Få sidste forespørgselsomkostning ved at bruge VIS STATUS SOM 'Last_Query_Cost'