Orsaken till långsamheten är de dåliga radräkningsuppskattningarna som gör att PostgreSQL väljer en kapslad loop-join. Nästan all din tid spenderas på indexskanningen på hfj_res_link
, som upprepas 1113 gånger.
Mitt första försök skulle vara att ANALYZE hfj_spidx_date
och se om det hjälper. Om ja, se till att autoanalyze behandlar den tabellen oftare.
Nästa försök skulle vara att
SET default_statistics_target = 1000;
och sedan ANALYZE
som ovan. Om det hjälper, använd ALTER TABLE
för att öka STATISTICS
på hash_identity
och sp_value_high
kolumner.
Om det inte heller hjälper, och du har en ny version av PostgreSQL, kan du prova utökad statistik :
CREATE STATISTICS myparamsda2_stats (dependencies)
ON hash_identity, sp_value_high FROM hfj_spidx_date;
Sedan ANALYZE
tabellen igen och se om det hjälper.
Om allt detta inte hjälper och du inte kan få uppskattningarna korrekta, måste du prova en annan vinkel:
CREATE INDEX ON hfj_res_link (target_resource_id, src_resource_id);
Det borde påskynda indexsökningen avsevärt och ge dig bra svarstider.
Slutligen, om inget av ovanstående har någon effekt, kan du använda cruse-måttet för att inte tillåta kapslade loop-kopplingar för den här frågan:
BEGIN;
SET LOCAL enable_nestloop = off;
SELECT /* your query goes here */;
COMMIT;