La causa della lentezza sono le stime di conteggio delle righe errate che fanno sì che PostgreSQL scelga un join di ciclo nidificato. Trascorri quasi tutto il tuo tempo nella scansione dell'indice su hfj_res_link
, che si ripete 1113 volte.
Il mio primo tentativo sarebbe ANALYZE hfj_spidx_date
e vedi se questo aiuta. Se sì, assicurati che l'analisi automatica tratti quella tabella più frequentemente.
Il prossimo tentativo sarebbe quello di
SET default_statistics_target = 1000;
e poi ANALYZE
come sopra. Se questo aiuta, usa ALTER TABLE
per aumentare le STATISTICS
su hash_identity
e sp_value_high
colonne.
Se anche questo non aiuta e hai una versione recente di PostgreSQL, puoi provare statistiche estese :
CREATE STATISTICS myparamsda2_stats (dependencies)
ON hash_identity, sp_value_high FROM hfj_spidx_date;
Quindi ANALYZE
di nuovo la tabella e vedi se questo aiuta.
Se tutto ciò non aiuta e non riesci a ottenere le stime corrette, devi provare un'angolazione diversa:
CREATE INDEX ON hfj_res_link (target_resource_id, src_resource_id);
Ciò dovrebbe accelerare notevolmente la scansione dell'indice e darti buoni tempi di risposta.
Infine, se nessuno dei precedenti ha alcun effetto, puoi utilizzare la misura cruse di non consentire i join di loop nidificati per questa query:
BEGIN;
SET LOCAL enable_nestloop = off;
SELECT /* your query goes here */;
COMMIT;