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

Langsomt kørende Postgres-forespørgsel

Årsagen til langsommeligheden er de dårlige rækketællingsestimater, som får PostgreSQL til at vælge en indlejret loop join. Næsten al din tid bruges på indeksscanningen på hfj_res_link , som gentages 1113 gange.

Mit første forsøg ville være at ANALYZE hfj_spidx_date og se om det hjælper. Hvis ja, så sørg for, at autoanalyse behandler den tabel oftere.

Næste forsøg ville være at

SET default_statistics_target = 1000;

og derefter ANALYZE som ovenfor. Hvis det hjælper, så brug ALTER TABLE for at øge STATISTICShash_identity og sp_value_high kolonner.

Hvis det heller ikke hjælper, og du har en nyere version af PostgreSQL, kan du prøve udvidet statistik :

CREATE STATISTICS myparamsda2_stats (dependencies)
   ON hash_identity, sp_value_high FROM hfj_spidx_date;

Derefter ANALYZE bordet igen og se om det hjælper.

Hvis alt dette ikke hjælper, og du ikke kan få estimaterne korrekte, skal du prøve en anden vinkel:

CREATE INDEX ON hfj_res_link (target_resource_id, src_resource_id);

Det burde fremskynde indeksscanningen betydeligt og give dig gode svartider.

Endelig, hvis intet af ovenstående har nogen effekt, kan du bruge cruse-målet for at forbyde indlejrede loop-joins til denne forespørgsel:

BEGIN;
SET LOCAL enable_nestloop = off;
SELECT /* your query goes here */;
COMMIT;



  1. Hvordan tæller man alle kombinerede forekomster i SQL?

  2. Opsamling af tæller fra en SQL-forespørgsel

  3. Glassfish Admin Console kaster java.lang.IllegalStateException ved oprettelse af JDBC Pool

  4. Er SET CHARACTER SET utf8 nødvendigt?