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;