it-swarm.com.de

Temporäre PostgreSQL-Tabellen

Ich muss 2,5 Millionen Mal eine Abfrage durchführen. Diese Abfrage generiert einige Zeilen, die ich brauche, um AVG(column) und dann diesen AVG zu verwenden, um die Tabelle aus allen unterdurchschnittlichen Werten herauszufiltern. Ich muss dann INSERT diese gefilterten Ergebnisse in eine Tabelle einfügen.

Der einzige Weg, so etwas mit vernünftiger Effizienz zu tun, scheint darin zu bestehen, ein TEMPORARY TABLE für jeden Abfrage-Postmaster-Python-Thread. Ich hoffe nur, dass diese TEMPORARY TABLEs werden (überhaupt) nicht auf der Festplatte gespeichert und verbleiben im Arbeitsspeicher (RAM), es sei denn, sie haben nicht genügend Arbeitsspeicher.

Ich würde gerne wissen, ob bei einer temporären Tabelle Schreibvorgänge auf der Festplatte auftreten (die die INSERTS beeinträchtigen würden, d. H. Langsamer bis vollständiger Vorgang).

66

Beachten Sie, dass in Postgres das Standardverhalten für temporäre Tabellen darin besteht, dass sie nicht automatisch gelöscht werden und die Daten beim Festschreiben erhalten bleiben. Sehen ON COMMIT .

Temporäre Tabellen sind jedoch am Ende einer Datenbanksitzung gelöscht :

Temporäre Tabellen werden automatisch am Ende einer Sitzung oder optional am Ende der aktuellen Transaktion gelöscht.

Es gibt mehrere Überlegungen, die Sie berücksichtigen müssen:

  • Wenn Sie eine temporäre Tabelle am Ende einer Transaktion explizit DROP erstellen möchten, erstellen Sie sie mit dem Befehl CREATE TEMPORARY TABLE ... ON COMMIT DROP Syntax.
  • Bei Vorhandensein eines Verbindungspools kann eine Datenbanksitzung mehrere Clientsitzungen umfassen. Um Konflikte in CREATE zu vermeiden, sollten Sie Ihre temporären Tabellen löschen - entweder bevor Sie eine Verbindung zum Pool wiederherstellen (z. B. indem Sie alles in einer Transaktion ausführen und ON COMMIT DROP Erstellungssyntax), oder nach Bedarf (durch Voranstellen eines beliebigen CREATE TEMPORARY TABLE Anweisung mit einem entsprechenden DROP TABLE IF EXISTS, was den Vorteil hat, auch außerhalb von Transaktionen zu arbeiten, z.B. wenn die Verbindung im Auto-Commit-Modus verwendet wird.)
  • Wie viel davon passt in den Arbeitsspeicher, während die temporäre Tabelle verwendet wird, bevor es zu einem Überlauf auf der Festplatte kommt? Siehe die temp_buffers Option in postgresql.conf
  • Was sollte ich sonst noch beachten, wenn ich häufig mit temporären Tabellen arbeite? Nachdem Sie temporäre Tabellen DROPPED haben, wird ein Staubsauger empfohlen, um alle toten Tupel aus dem Katalog zu entfernen. Postgres saugt bei Verwendung der Standardeinstellungen (auto_vacuum).

Auch unabhängig von Ihrer Frage (aber möglicherweise projektbezogen): Denken Sie daran, dass, wenn Sie Abfragen für eine temporäre Tabelle ausführen müssen, after Sie sie ausgefüllt haben, sie eine gute ist Idee, entsprechende Indizes zu erstellen und ein ANALYZE für die fragliche temporäre Tabelle auszugeben after Sie sind mit dem Einfügen fertig. Standardmäßig geht das kostenbasierte Optimierungsprogramm davon aus, dass eine neu erstellte temporäre Tabelle ~ 1000 Zeilen enthält. Dies kann zu einer schlechten Leistung führen, wenn die temporäre Tabelle tatsächlich Millionen von Zeilen enthält.

102
vladr

Temporäre Tabellen bieten nur eine Garantie - sie werden am Ende der Sitzung gelöscht. Für einen kleinen Tisch haben Sie wahrscheinlich die meisten Ihrer Daten im Hintergrundgeschäft. Für eine große Tabelle garantiere ich, dass Daten regelmäßig auf die Festplatte geschrieben werden, da das Datenbankmodul mehr Arbeitsspeicher für andere Anforderungen benötigt.

BEARBEITEN: Wenn Sie nur temporäre RAM-Tabellen benötigen, können Sie einen Tabellenbereich für Ihre Datenbank auf einem RAM Datenträger (/ dev/shm funktioniert) erstellen. Dies reduziert die Menge von Datenträger-E/A, aber beachten Sie, dass dies derzeit nicht ohne einen physischen Datenträgerschreibvorgang möglich ist, da die DB-Engine die Tabellenliste beim Erstellen der temporären Tabelle in einen stabilen Speicher löscht.

15
Adam Hawes