Numerisch vs Ganzzahl für eine Spaltengröße und Leistung

10

Ich habe eine Anwendung, die eine PostgreSQL-Tabelle verwendet. Die Tabelle ist sehr groß (Milliarden von Zeilen) und hat eine Spalte, die eine ganze Zahl ist.

Das integerkönnen bis zu 6 Ziffern sein, dh 0-999.999, keine Negative.

Ich dachte darüber nach, es zu ändern numeric(6,0).

Wäre das eine gute Idee? Würde numeric(6,0)weniger Bytes dauern? Wie wäre es mit der Leistung (diese Tabelle wird viel abgefragt)?

Ofiris
quelle

Antworten:

11

Wäre das eine gute Idee?

Nein.

würde numeric(6,0)weniger Bytes dauern?

Nein.

test=> SELECT pg_column_size(INT4 '999999'), pg_column_size(NUMERIC(6,0) '999999');
 pg_column_size | pg_column_size 
----------------+----------------
              4 |             10
(1 row)

Wie wäre es mit der Leistung (diese Tabelle wird viel abgefragt)?

Langsamer. Es wird als binär codierte Dezimalzahl gespeichert, da es sich um einen beliebigen Genauigkeitswert handelt.

Craig Ringer
quelle
Alle waren sich einig, da eine numerische Randnotiz einen Vorteil hat, da sie automatisch die Domain 0-999999 erzwingt. Dies kann jedoch mit einer separaten Einschränkung im int-Fall gelöst werden
Lennart
1
Gibt es ein Problem beim Ändern einer numericSpalte in int?
Racer SQL
@RacerSQL Ja, wenn Sie Werte haben, die die int-Größe überschreiten.
DylanYoung
5

Die endgültige Antwort lautet Nein zu allen Ihren Fragen. Ganzzahl ist immer der richtige Weg für alles, wofür Sie es verwenden können. (Geld zum Beispiel)

Denken Sie eine Minute darüber nach. Wenn das Datenbankmodul auf eine Ganzzahl stößt, wird diese sehr effizient verarbeitet, da nicht viel interpretiert wird. Es ist eine ganze Zahl. Der numerische Typ verhält sich eher wie eine Zeichenfolge. Der Motor muss zuerst herausfinden, welche Teile vor und nach dem Dezimalpunkt liegen, und sie entsprechend massieren, um numerische Operationen auszuführen.

Die Verwendung einer Ganzzahl ist immer effizienter als eine numerische Zahl, obwohl numerische Typen für Menschen häufig bequemer sind.

stubsthewizard
quelle
Ich bin anderer Meinung, wenn es um Geld geht. Die Verwendung einer skalierten Ganzzahl wie das Speichern von Dezenten (1000 pro Dollar) ist in Ordnung, aber umständlich. Die Verwendung wird schnell praktischer NUMERIC. Eine skalierte Ganzzahl ist jedoch viel besser als die Verwendung eines Gleitkommawerts für das Geld.
Craig Ringer
2
@CraigRinger Ich glaube nicht, dass du mit mir nicht einverstanden bist! Ich bin damit einverstanden, dass die Verwendung einer Dezimalstelle für Geld für den Entwickler immer weniger umständlich ist, aber die Frage ist die Effizienz der Abfrage, oder? Der Umgang mit ganzen Zahlen ist immer schneller. Außerdem können Sie beim Schreiben von Bankanträgen auf einige seltsame Rundungsprobleme stoßen, die die meisten Menschen nicht interessieren würden, die aber für Banken sehr wichtig sind. Daher stimme ich Ihnen auch zu, dass Sie Gleitkomma nicht auch für Geld verwenden!
Stubsthewizard
1
Guter Punkt beim Runden. Ich wünschte, PostgreSQL hätte Unterstützung für Rundungsrichtlinien. Ich wünsche es nicht genug, um es zu implementieren;)
Craig Ringer