Temporäre PostgreSQL-Tabellen

75

Ich muss 2,5 Millionen Mal eine Abfrage durchführen. Diese Abfrage generiert einige Zeilen, die ich benötige, AVG(column)und verwendet diese dann AVG, um die Tabelle aus allen unterdurchschnittlichen Werten zu filtern. Ich muss dann INSERTdiese gefilterten Ergebnisse in eine Tabelle eintragen.

Die einzige Möglichkeit, so etwas mit angemessener Effizienz zu tun, scheint darin zu bestehen, TEMPORARY TABLEfür jeden Abfrage-Postmaster-Python-Thread einen zu erstellen . Ich hoffe nur, dass diese TEMPORARY TABLEs (überhaupt) nicht auf der Festplatte gespeichert werden und im Speicher (RAM) verbleiben, es sei denn, sie haben nicht genügend Arbeitsspeicher.

Ich würde gerne wissen, ob eine TEMPORARY TABLE Schreibvorgänge auf der Festplatte verursacht (was die INSERTS stören würde, dh den gesamten Prozess verlangsamen).

Nicholas Leonard
quelle
5
Und was genau ist deine Frage hier?
Tim
Lol sorry. Ich möchte wissen, ob bei einer TEMPORARY TABLE Festplattenschreibvorgänge auftreten (die die INSERTS stören würden, dh den gesamten Prozess verlangsamen). Danke!
Nicholas Leonard
Ok, ich habe es gerade durchgelesen. Es scheint, dass die TEMPORARY TABLE tatsächlich einen gewissen Overhead beim Schreiben von Datenträgern verursacht ... Ich frage mich dennoch, ob eine Kopie der gesamten Tabelle auf dem Datenträger gespeichert ist oder ob nur Metadaten erhalten bleiben.
Nicholas Leonard

Antworten:

116

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 beibehalten werden. Siehe ON COMMIT.

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

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

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

  • Wenn Sie DROPam Ende einer Transaktion explizit eine temporäre Tabelle erstellen möchten , erstellen Sie diese mit der CREATE TEMPORARY TABLE ... ON COMMIT DROPSyntax.
  • Bei vorhandenem Verbindungspooling kann eine Datenbanksitzung mehrere Clientsitzungen umfassen. Um Konflikte zu vermeiden CREATE, sollten Sie Ihre temporären Tabellen löschen - entweder bevor Sie eine Verbindung zum Pool wiederherstellen (z. B. indem Sie alles innerhalb einer Transaktion ausführen und die ON COMMIT DROPErstellungssyntax verwenden) oder nach Bedarf (indem Sie einer CREATE TEMPORARY TABLEAnweisung eine beliebige Anweisung voranstellen) eine entsprechende DROP TABLE IF EXISTS, die 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 während der Verwendung der temporären Tabelle in den Speicher, bevor sie auf die Festplatte überläuft? Siehe die temp_buffersOption inpostgresql.conf
  • Was sollte ich mir sonst noch Sorgen machen, wenn ich oft mit temporären Tabellen arbeite? Nachdem Sie temporäre Tische DROPped haben, wird ein Vakuum empfohlen, um alle toten Tupel aus dem Katalog zu entfernen. Postgres saugt bei Verwendung der Standardeinstellungen ( auto_vacuum) automatisch etwa alle 3 Minuten für Sie .

Auch unabhängig von Ihrer Frage (aber möglicherweise im Zusammenhang mit Ihrem Projekt): Beachten Sie, dass es eine gute Idee ist, geeignete Indizes zu erstellen und ein on auszugeben, wenn Sie nach dem Auffüllen Abfragen für eine temporäre Tabelle ausführen müssen ANALYZEdie betreffende temporäre Tabelle, nachdem Sie mit dem Einfügen fertig sind. 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.

vladr
quelle
Gutes Zeug. Danke. Ich habe eigentlich nur eine temporäre Tabelle verwendet, da ich zwei verschiedene SELECTs darauf ausführen musste (also wäre eine Analyse meiner Meinung nach nicht wert). Ich habe die Operationen mit vielen temp_buffers versehen, aber da TEMP-Tabellen von vielen Python-Threads erstellt und gelöscht wurden, ...
Nicholas Leonard
postgres verbrauchte immer mehr RAM, als das Skript seine Arbeit erledigte. Ich fand heraus, dass die Begrenzung der Anzahl der Python-Threads (die auf einem Client-Computer ausgeführt werden) auf etwas mehr als die Anzahl der CPU-Kerne die besten (effizientesten und effektivsten) Ausführungszeiten ergab. Nochmals vielen Dank für Sie Weisheit Vlad.
Nicholas Leonard
1
Selbst wenn Sie nur zweimal SELECT für die temporäre Tabelle auswählen und jedes Mal, wenn Sie die temporäre Tabelle erstellen, einige Millisekunden in eine Indexerstellung + ANALYSE investieren, können Sie Tonnen sparen, wenn Sie andere Tabellen mit der temporären Tabelle verbinden. Fügen Sie die Abfragen manuell in PgAdminIII und ein Verwenden Sie die Funktion "Abfragen / Erklären (F7)".
Vladr
"Ja wirklich?" Ok, ich glaube, ich musste jemanden bitten, es zu versuchen, da es nicht intuitiv zu sein scheint (die Einrichtungskosten scheinen sich nicht zu lohnen). Wie auch immer, ich danke Ihnen und werde versuchen, das nächste Mal die ANALYSE zu analysieren. Ich sehe bereits den Wert von TEMP INDEXs Gedanken. Dennoch frage ich mich, ob eine ANALYSE wirklich ...
Nicholas Leonard
1
Der ANALYZE-Overhead beträgt durchschnittlich 100 ms, und Sie können ihn pro Tabelle / Spalte konfigurieren. Sie benötigen unbedingt eine ANALYSE, damit der Optimierer keine dummen Annahmen trifft, vorausgesetzt, eine Tabelle mit Millionen Zeilen enthält nur 100 Zeilen und
scannt
19

Temporäre Tabellen bieten nur eine Garantie: Sie werden am Ende der Sitzung gelöscht. Für eine kleine Tabelle haben Sie wahrscheinlich die meisten Ihrer Daten im Hintergrundspeicher. Für eine große Tabelle garantiere ich, dass Daten regelmäßig auf die Festplatte geschrieben werden, da das Datenbankmodul mehr Arbeitsraum 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 einer RAM-Festplatte erstellen (/ dev / shm funktioniert). Dies reduziert die Menge an Festplatten-E / A, aber beachten Sie, dass dies derzeit nicht möglich ist, ohne dass eine physische Festplatte geschrieben wird. Die DB-Engine löscht die Tabellenliste beim Erstellen der temporären Tabelle in einen stabilen Speicher.

Adam Hawes
quelle
1
temporäre Tabellen sind auch nicht WAL-protokolliert rhaas.blogspot.com/2010/05/…
Shusson