Przyczyną spowolnienia są złe oszacowania liczby wierszy, które powodują, że PostgreSQL wybiera zagnieżdżone sprzężenie w pętli. Prawie cały czas spędzasz na skanowaniu indeksu na hfj_res_link
, który jest powtarzany 1113 razy.
Moją pierwszą próbą byłoby ANALYZE hfj_spidx_date
i zobacz, czy to pomaga. Jeśli tak, upewnij się, że autoanaliza traktuje tę tabelę częściej.
Następna próba to
SET default_statistics_target = 1000;
a następnie ANALYZE
jak powyżej. Jeśli to pomoże, użyj ALTER TABLE
aby zwiększyć STATISTICS
na hash_identity
i sp_value_high
kolumny.
Jeśli to też nie pomoże, a masz najnowszą wersję PostgreSQL, możesz wypróbować rozszerzone statystyki :
CREATE STATISTICS myparamsda2_stats (dependencies)
ON hash_identity, sp_value_high FROM hfj_spidx_date;
Następnie ANALYZE
ponownie stół i zobacz, czy to pomoże.
Jeśli to wszystko nie pomoże i nie możesz uzyskać prawidłowych szacunków, musisz spróbować pod innym kątem:
CREATE INDEX ON hfj_res_link (target_resource_id, src_resource_id);
Powinno to znacznie przyspieszyć skanowanie indeksu i zapewnić dobre czasy odpowiedzi.
Na koniec, jeśli żadne z powyższych nie ma żadnego efektu, możesz użyć miary cruse, która nie zezwala na łączenie zagnieżdżonych pętli dla tego zapytania:
BEGIN;
SET LOCAL enable_nestloop = off;
SELECT /* your query goes here */;
COMMIT;