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 INSERT
diese gefilterten Ergebnisse in eine Tabelle eintragen.
Die einzige Möglichkeit, so etwas mit angemessener Effizienz zu tun, scheint darin zu bestehen, TEMPORARY TABLE
für jeden Abfrage-Postmaster-Python-Thread einen zu erstellen . Ich hoffe nur, dass diese TEMPORARY TABLE
s (ü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).
quelle
Antworten:
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 :
Es gibt mehrere Überlegungen, die Sie berücksichtigen müssen:
DROP
am Ende einer Transaktion explizit eine temporäre Tabelle erstellen möchten , erstellen Sie diese mit derCREATE TEMPORARY TABLE ... ON COMMIT DROP
Syntax.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 dieON COMMIT DROP
Erstellungssyntax verwenden) oder nach Bedarf (indem Sie einerCREATE TEMPORARY TABLE
Anweisung eine beliebige Anweisung voranstellen) eine entsprechendeDROP 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.)temp_buffers
Option inpostgresql.conf
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
ANALYZE
die 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.quelle
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.
quelle