PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Füllfaktor für einen sequentiellen Index, der PK ist

FILLFACTOR

Nur mit INSERT und SELECT Sie sollten einen FILLFACTOR verwenden von 100 überall.

Es hat keinen Sinn, Spielraum pro Speicherblock zu lassen, wenn Sie nicht mit UPDATE "wackeln". s.

Der Mechanismus hinter FILLFACTOR ist sehr einfach. INSERT s füllen jede Datenseite (normalerweise ein 8-kb-Blöcke) nur bis zu dem Prozentsatz, der durch den FILLFACTOR deklariert ist Einstellung. Auch immer dann, wenn Sie VACUUM FULL ausführen oder CLUSTER auf dem tisch wird der gleiche spielraum pro block wieder hergestellt. Idealerweise ermöglicht dies UPDATE s zum Speichern neuer Zeilenversionen auf derselben Datenseite, was einen erheblichen Leistungsschub beim Umgang mit vielen UPDATE bieten kann s. Auch vorteilhaft in Kombination mit H.O.T. Aktualisierungen :

Wenn es keine gibt Updates, verschwenden Sie dafür keinen Platz und setzen Sie FILLFACTOR = 100 .

Grundlegende Informationsquelle:das Handbuch zu CREATE TABLE oder CREATE INDEX .

Sonstige Optimierung

Aber Sie können etwas anderes tun - da scheinst du ein Optimist zu sein ... :)

CREATE TABLE dev_transactions
( transaction_id serial PRIMARY KEY,
  gateway integer NOT NULL,
  moment timestamp NOT NULL,
  transaction_type smallint NOT NULL,
  status smallint NOT NULL,
  device integer NOT NULL,
  controler smallint NOT NULL,
  token integer,
  et_mode character(1));

Dadurch wird Ihre Tabelle hinsichtlich Datenabgleich optimiert und vermeidet Padding für einen typischen 64-Bit-Server und spart ein paar Bytes, im Durchschnitt wahrscheinlich nur 8 Bytes - mit "column tetris:

kann man normalerweise nicht viel herausquetschen

Behalten Sie außerdem NOT NULL bei Spalten am Anfang der Tabelle für einen sehr kleinen Leistungsbonus.

Außerdem hat Ihre Tabelle 9 Spalten . Dies bedeutet zusätzliche 8 Bytes für die erweiterte NULL-Bitmap - was in die anfängliche 1-Byte-NULL-Bitmap für nur 8 Spalten passen würde .
Wenn Sie et_mode definieren und token NOT NULL , alle Spalten sind NOT NULL und die NULL-Bitmap wird überhaupt verwendet, wodurch 8 Bytes frei werden.
Das funktioniert sogar pro Zeile, wenn Sie die Spalten nicht mit NOT NULL deklarieren . Wenn alle Spalten Werte haben, gibt es für diese Zeile kein NULL-Bitmap. In Ihrem Fall führt dies zu dem paradoxen Effekt, dass Werte für et_mode ausgefüllt werden und token kann Ihre Speichergröße kleiner machen oder zumindest gleich bleiben:

Grundlegende Informationsquelle:das Handbuch zum physischen Datenbankspeicher .

Vergleichen Sie die Größe der Zeilen (mit Werten gefüllt) mit Ihrer ursprünglichen Tabelle, um einen endgültigen Beweis zu erhalten:

SELECT pg_column_size(t) FROM dev_transactions t;