La causa de la lentitud son las malas estimaciones de recuento de filas que hacen que PostgreSQL elija una unión de bucle anidado. Casi todo su tiempo se gasta en el escaneo de índice en hfj_res_link
, que se repite 1113 veces.
Mi primer intento sería ANALYZE hfj_spidx_date
y ver si eso ayuda. En caso afirmativo, asegúrese de que Autoanalyze trate esa tabla con más frecuencia.
El próximo intento sería
SET default_statistics_target = 1000;
y luego ANALYZE
como anteriormente. Si eso ayuda, use ALTER TABLE
para aumentar las STATISTICS
en la hash_identity
y sp_value_high
columnas.
Si eso tampoco ayuda y tiene una versión reciente de PostgreSQL, puede probar con estadísticas extendidas :
CREATE STATISTICS myparamsda2_stats (dependencies)
ON hash_identity, sp_value_high FROM hfj_spidx_date;
Luego ANALYZE
la mesa de nuevo y ver si eso ayuda.
Si todo eso no ayuda y no puede obtener las estimaciones correctas, debe probar con un ángulo diferente:
CREATE INDEX ON hfj_res_link (target_resource_id, src_resource_id);
Eso debería acelerar considerablemente la exploración del índice y brindarle buenos tiempos de respuesta.
Finalmente, si nada de lo anterior tiene ningún efecto, puede usar la medida crucial de no permitir uniones de bucles anidados para esta consulta:
BEGIN;
SET LOCAL enable_nestloop = off;
SELECT /* your query goes here */;
COMMIT;