Welcher Füllfaktor für die Caching-Tabelle?

10

Ich habe die Tabelle stark aktualisiert / aufgerufen, in der ich serialisierte Java-Objekte speichere. Sie sind 2-3 Stunden in der Tabelle (werden in diesem Zeitraum ebenfalls aktualisiert) und dann entfernt. Die Größe des Tisches beträgt ca. 300 MB. Ich habe festgestellt, dass es sehr, sehr oft VACUUMed ist und frage mich, ob das Ändern der fillfactorhelfen würde?

Michal
quelle

Antworten:

17

Die Schlüsselwörter hier sind:

  1. "stark aktualisiert"
  2. "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 100belassen (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. VACUUMIdentifiziert tote Zeilen, die für offene Transaktionen nicht mehr sichtbar sind. Das Handbuch:

Die Standardform zum VACUUMEntfernen 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_thresholdundautovacuum_vacuum_scale_factor . VACUUMViel 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 fillfactorauf 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 UNLOGGEDTabelle :

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.

Erwin Brandstetter
quelle
Ich denke, UNLOGGED ist genau das, was ich brauche
Michal
0

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

ID      integer  -- sequential ID
Used    boolean  -- default FALSE
Object  -- whatever type is appropriate

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.

Michael Green
quelle
Soweit ich weiß, schreiben diese UPDATEs normalerweise immer noch eine ganz neue Kopie der Zeile auf die Festplatte, es sei denn, es handelt sich um ein HEISSES Update. So benötigen Sie im Laufe der Zeit immer noch GC / Staubsaugen.
Jeff Widman