Příčinou pomalosti jsou špatné odhady počtu řádků, které nutí PostgreSQL zvolit spojení vnořené smyčky. Téměř všechen svůj čas strávíte indexovým skenováním na hfj_res_link , která se opakuje 1113krát.
Můj první pokus by byl ANALYZE hfj_spidx_date a uvidíme, jestli to pomůže. Pokud ano, ujistěte se, že autoanalyze zpracovává tuto tabulku častěji.
Dalším pokusem by bylo
SET default_statistics_target = 1000;
a poté ANALYZE jak je uvedeno výše. Pokud to pomůže, použijte ALTER TABLE pro zvýšení STATISTICS na hash_identity a sp_value_high sloupce.
Pokud ani to nepomůže a máte nejnovější verzi PostgreSQL, můžete zkusit rozšířenou statistiku :
CREATE STATISTICS myparamsda2_stats (dependencies)
ON hash_identity, sp_value_high FROM hfj_spidx_date;
Poté ANALYZE znovu tabulku a uvidíme, jestli to pomůže.
Pokud ani to nepomůže a odhady se nedaří získat správně, musíte zkusit jiný úhel:
CREATE INDEX ON hfj_res_link (target_resource_id, src_resource_id);
To by mělo výrazně urychlit skenování indexu a poskytnout vám dobré časy odezvy.
A konečně, pokud nic z výše uvedeného nemá žádný účinek, můžete pro tento dotaz použít krutou míru zákazu spojení vnořených smyček:
BEGIN;
SET LOCAL enable_nestloop = off;
SELECT /* your query goes here */;
COMMIT;