Da Sie zwei große Tabellen verbinden und es keine Bedingungen gibt, die Zeilen herausfiltern könnten, ist die einzige effiziente Join-Strategie ein Hash-Join, und kein Index kann dabei helfen.
Zuerst wird eine der Tabellen sequenziell gescannt, aus der eine Hash-Struktur aufgebaut wird, dann wird die andere Tabelle sequenziell gescannt, und der Hash wird für jede gefundene Zeile sondiert. Wie könnte irgendein Index dabei helfen?
Sie können damit rechnen, dass ein solcher Vorgang lange dauert, aber es gibt einige Möglichkeiten, wie Sie den Vorgang beschleunigen können:
-
Entfernen Sie alle Indizes und Beschränkungen auf
tx_input1
Bevor Sie beginnen. Ihre Anfrage ist eines der Beispiele, bei denen ein Index überhaupt nicht hilft, sondern schmerzt Leistung, da die Indizes zusammen mit der Tabelle aktualisiert werden müssen. Erstellen Sie die Indizes und Einschränkungen neu, nachdem Sie mitUPDATE
fertig sind . Abhängig von der Anzahl der Indizes in der Tabelle können Sie einen ordentlichen bis massiven Leistungsgewinn erwarten. -
Erhöhen Sie
work_mem
Parameter für diese eine Operation mit demSET
Befehl so hoch wie du kannst. Je mehr Speicher die Hash-Operation verwenden kann, desto schneller ist sie. Bei einer so großen Tabelle werden Sie wahrscheinlich immer noch temporäre Dateien haben, aber Sie können immer noch einen ordentlichen Leistungsgewinn erwarten. -
Erhöhen Sie
checkpoint_segments
(odermax_wal_size
ab Version 9.6) auf einen hohen Wert, damit es beimUPDATE
weniger Checkpoints gibt Betrieb. -
Stellen Sie sicher, dass die Tabellenstatistiken für beide Tabellen korrekt sind, damit PostgreSQL eine gute Schätzung für die Anzahl der zu erstellenden Hash-Buckets erstellen kann.
Nach dem UPDATE
, wenn es eine große Anzahl von Zeilen betrifft, sollten Sie in Betracht ziehen, VACUUM (FULL)
auszuführen auf tx_input1
um die resultierende Tabellenaufblähung loszuwerden. Dadurch wird die Tabelle für längere Zeit gesperrt, also tun Sie dies während eines Wartungsfensters. Es wird die Größe der Tabelle reduzieren und als Folge sequentielle Scans beschleunigen.