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

Postgresql - Wie kann ich die Aktualisierung einer riesigen Tabelle (100 Millionen Zeilen) beschleunigen?

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 mit UPDATE 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 dem SET 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 (oder max_wal_size ab Version 9.6) auf einen hohen Wert, damit es beim UPDATE 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.