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)?

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.


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.