Die Schlüsselwörter hier sind:
- "stark aktualisiert"
- "in der Tabelle für 2-3 Stunden".
Punkt 1. ist ein Hinweis auf einen niedrigeren Füllfaktor, während 2. das Gegenteil ist. Dies verbessert die Leistung, wenn mehrere Zeilenversionen auf derselben Datenseite gespeichert sind. HEISSE Updates würden das erreichen. Lesen Sie hier oder hier . Sie benötigen etwas Spielraum auf der Datenseite - wie tote Tupel oder Platz, der von fillfactor
<100 reserviert wird . Sie können jedoch nur dann ihre Sache tun, wenn kein Index eine der aktualisierten Spalten enthält , was für Ihren Fall zutreffen sollte.
Ein weiterer wichtiger Faktor wäre hier die Tupelgröße (im Vergleich zu Ihrer Seitengröße (die meistens 8 KB beträgt). Weitere Details in dieser verwandten Antwort:
Wenn die Tupelgröße 4 kb oder mehr beträgt, wäre eine Reduzierung des Füllfaktors zwecklos, da auf einer Datenseite niemals mehr als ein Tupel vorhanden sein kann. Sie können es auch bei 100
belassen (was sowieso die Standardeinstellung ist). Jedoch sind einige Datentypen „geröstetem“ und gespeichert out-of-line , wenn sie eine maximale Größe nicht überschreiten, so dass viel Tupeln in dem Haupt Beziehung fork erfordern selten sind.
Was auch immer Sie tun, VACUUM
wird oft ausgeführt. Und das ist im Allgemeinen eine gute Sache, darüber würde ich mir keine Sorgen machen. Sie erstellen viele tote Tupel. VACUUM
Identifiziert tote Zeilen, die für offene Transaktionen nicht mehr sichtbar sind. Das Handbuch:
Die Standardform zum VACUUM
Entfernen von Dead Row-Versionen in Tabellen und Indizes markiert den verfügbaren Speicherplatz für die zukünftige Wiederverwendung .
Meine kühne Betonung.
Sie können mit den Einstellungen pro Tabelle für Autovakuum spielen , um es weniger (oder mehr) häufig nur für diesen Tisch auszulösen:
Die Standardschwellenwerte und Skalierungsfaktoren werden übernommen
postgresql.conf
, es ist jedoch möglich, sie tabellenweise zu überschreiben .
Meine kühne Betonung. Insbesondere mit autovacuum_vacuum_threshold
undautovacuum_vacuum_scale_factor
. VACUUM
Viel laufen könnte tatsächlich eine gute Idee sein, anstatt eine sehr niedrige fillfacter
. Das hängt von den Zugriffsmustern ab. Wenn alle Tupel beispielsweise 3 Stunden leben und jedes mehrmals aktualisiert wird, würde ich den Wert immer noch fillfactor
auf etwa 50 senken . Sie müssen den Sweet Spot testen und finden.
Alternativen
Abgesehen davon, da Ihre Daten zunächst volatil zu sein scheinen: Verwenden Sie eine UNLOGGED
Tabelle :
In nicht protokollierte Tabellen geschriebene Daten werden nicht in das Vorausschreibprotokoll geschrieben (siehe Kapitel 29 ), wodurch sie erheblich schneller als normale Tabellen sind. Sie sind jedoch nicht absturzsicher : Eine nicht protokollierte Tabelle wird nach einem Absturz oder einem unsauberen Herunterfahren automatisch abgeschnitten. Der Inhalt einer nicht protokollierten Tabelle wird auch nicht auf Standby-Server repliziert.
Meine kühne Betonung. Verwenden Sie dies nicht, wenn Ihr Server abstürzen könnte und Sie die Daten danach noch benötigen. Wenn es sich jedoch um Sitzungsdaten für Webanwendungen handelt, ist dies möglicherweise ein akzeptabler Preis.
Oder noch radikaler: Verwenden Sie einen Schlüsselwertspeicher wie Redis, wenn Sie auf die Funktionen und die Sicherheit eines RDBMS insgesamt verzichten können.
Ich würde ein Schlüsselwert-DBMS vorschlagen, aber ich werfe dies aus Interesse heraus.
Führen Sie anstelle von INSERT & DELETE-Anweisungen nur UPDATEs aus.
Die Tabellenstruktur wird so etwas wie sein
Die Objektspalte hat eine feste Länge, um Teilungen und Zeilenverschiebungen zu vermeiden. Passen Sie die Größe dieser Spalte an Ihre Objekte an und füllen Sie eine Seite auf der Festplatte effizient aus.
Füllen Sie Ihre Tabelle mit so vielen Zeilen, wie Sie benötigen, und einigen weiteren vor.
Wenn ein Objekt geschrieben werden soll, suchen Sie eine Zeile mit Used = False und aktualisieren Sie diese Zeile. Wenn ein Objekt zerstört werden soll, setzen Sie es auf "False". Es wird kein Müll erstellt und daher keine Speicherbereinigung.
Natürlich müssen viele, viele Ausnahmebedingungen behandelt werden (Zeilenüberlauf, Tabellenüberlauf, Race-Bedingungen für die ID-Verwendung usw.), aber keine sind unüberwindbar.
quelle