Причината за бавността са лошите оценки на броя на редовете, които карат PostgreSQL да избере вложено присъединяване към цикъл. Почти цялото ви време прекарвате в сканиране на индекса на hfj_res_link
, което се повтаря 1113 пъти.
Първият ми опит ще бъде да ANALYZE hfj_spidx_date
и вижте дали това помага. Ако да, уверете се, че автоматичният анализ обработва тази таблица по-често.
Следващият опит ще бъде да
SET default_statistics_target = 1000;
и след това ANALYZE
както по-горе. Ако това помага, използвайте ALTER TABLE
за увеличаване на STATISTICS
на hash_identity
и sp_value_high
колони.
Ако и това не помогне и имате скорошна версия на PostgreSQL, можете да опитате разширена статистика :
CREATE STATISTICS myparamsda2_stats (dependencies)
ON hash_identity, sp_value_high FROM hfj_spidx_date;
След това ANALYZE
таблицата отново и вижте дали това помага.
Ако всичко това не помогне и не можете да направите правилните оценки, трябва да опитате с различен ъгъл:
CREATE INDEX ON hfj_res_link (target_resource_id, src_resource_id);
Това би трябвало значително да ускори сканирането на индекса и да ви осигури добро време за реакция.
И накрая, ако нито едно от горните няма ефект, можете да използвате грубата мярка за забрана на свързване на вложен цикъл за тази заявка:
BEGIN;
SET LOCAL enable_nestloop = off;
SELECT /* your query goes here */;
COMMIT;