Å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 STATISTICS
på hash_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;