PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Langsam laufende Postgres-Abfrage

Die Ursache für die Langsamkeit sind die schlechten Schätzungen der Zeilenanzahl, die dazu führen, dass PostgreSQL einen Nested-Loop-Join wählt. Fast Ihre gesamte Zeit verbringen Sie mit dem Indexscan auf hfj_res_link , die 1113 Mal wiederholt wird.

Mein erster Versuch wäre ANALYZE hfj_spidx_date und sehen, ob das hilft. Wenn ja, stellen Sie sicher, dass Autoanalyze diese Tabelle häufiger behandelt.

Der nächste Versuch wäre,

SET default_statistics_target = 1000;

und dann ANALYZE wie oben. Wenn das hilft, verwenden Sie ALTER TABLE um die STATISTICS zu erhöhen auf der hash_identity und sp_value_high Spalten.

Wenn das auch nicht hilft und Sie eine neuere Version von PostgreSQL haben, können Sie es mit erweiterten Statistiken versuchen :

CREATE STATISTICS myparamsda2_stats (dependencies)
   ON hash_identity, sp_value_high FROM hfj_spidx_date;

Dann ANALYZE die Tabelle erneut und sehen Sie, ob das hilft.

Wenn das alles nicht hilft und Sie die Schätzungen nicht korrekt erhalten, müssen Sie einen anderen Blickwinkel versuchen:

CREATE INDEX ON hfj_res_link (target_resource_id, src_resource_id);

Das sollte den Index-Scan erheblich beschleunigen und Ihnen gute Antwortzeiten geben.

Wenn keiner der oben genannten Punkte eine Wirkung hat, könnten Sie schließlich die Cruse-Maßnahme anwenden, Nested-Loop-Joins für diese Abfrage zu verbieten:

BEGIN;
SET LOCAL enable_nestloop = off;
SELECT /* your query goes here */;
COMMIT;