Postgresql: Optimierung der Spaltengröße für numerische Felder

8

Ich verstehe nicht, wie Postgresql (9.2) die Spaltengröße (in kb) berechnen, ich habe diese Tabellen:

%Vor%

Und ich bevölkere sie mit diesem Code, um 10000 Zeilen für jede Tabelle zu haben;

%Vor%

Nun, was ich nicht verstehe ist, wie könnte das sein:

%Vor%

Also haben die d_ * -Tabellen die gleiche Größe, auch wenn die Genauigkeit (und die Länge der gespeicherten Daten) sehr unterschiedlich ist;

Die Tabelle b1 ist kleiner als b2, auch wenn sie eine größere Genauigkeit hat.

Alle Tabellen wurden vor dem pg_total_relazion_size gelöscht (vacuum, analize).

Ich konnte keine Antwort in Postgresql-Datentypen-Dokumentationen finden, also ich Ich werde es hier fragen: Wie wächst die Größe in kb in Bezug auf die Genauigkeit der numerischen Spalten?

Im Rahmen dieser Tests, um zu entscheiden, welche Genauigkeit / Skalierung für die Speicherung von monetären Typen in der Datenbank eines CMS verwendet werden soll, hätte ich nur einen Genauigkeits- / Skalierungswert für alle Artikelpreise (nicht für die Summen, wo die Skala muss 2 Dezimalstellen haben).

Je mehr Dezimalstellen ich speichern kann, desto besser ist es für den Benutzer (also habe ich keine Beschränkungen, wenn ein Kunde 12 Dezimalstellen für bestimmte Elemente speichern möchte), aber ich möchte verstehen, wie sich diese Entscheidung auf die Datenbankgröße und -leistung auswirkt .

    
Strae 06.05.2013, 15:27
quelle

2 Antworten

15

Aus dem Handbuch :

  

Numerische Werte werden physikalisch ohne zusätzliche führende oder nachfolgende Daten gespeichert   Nullen. Somit sind die deklarierte Genauigkeit und der Umfang einer Spalte maximal,   nicht feste Zuweisungen. (In diesem Sinne ist der numerische Typ ähnlicher   varchar (n) als char (n).) Die tatsächliche Speicheranforderung beträgt zwei Bytes   für jede Gruppe von vier Dezimalstellen plus drei bis acht Bytes Overhead.

Das Ergebnis der Funktion pg_total_relation_size enthält Indizes. Die richtige Spaltengröße für jeden der Werte, die Sie einfügen, ist:

%Vor%

Wenn Sie also dem Benutzer ein Maximum von n Dezimalstellen geben wollen, definieren Sie es einfach als numeric(35, n) . Es wird den Speicherplatz nur bis zur Anzahl der vorhandenen Dezimalstellen verwenden, da nachfolgende Nullen nicht gespeichert werden.

    
Clodoaldo Neto 06.05.2013, 15:55
quelle
1

Laut Postgresql doc hat Integer 4 Bytes, bigint - 8 Bytes. Die Größe von

%Vor%

11+ (p / 2) Bytes, wobei p = Genauigkeit, s = Skalierung

Speicher bestimmt durch die Größe des numerischen Typs, keine Auffüllung. Zum Beispiel:

%Vor%     
shcherbak 12.12.2016 08:02
quelle