2016-04-29 4 views
-1

Sollte ich eine Genauigkeit für das Zahlenformat verwenden? Ich weiß, dass es Portabilität gewährleistet, aber was sind weitere Vorteile der Präzision? Hat es Auswirkungen auf Indizes?Welche Vorteile bietet die Verwendung von Präzision für das NUMBER-Datenformat in ORACLE?

+0

Ich glaube, diese Art von Frage ist zu weit für SO – Aleksej

+1

Der Vorteil ist, dass Sie Dezimalzahlen speichern können, wenn Sie benötigen. –

+0

@a_horse_with_no_name, Einer meiner Freunde sagte, dass es Indizes beschleunigt. Ist es wahr? –

Antwort

1

Vorteile in Einzelheiten in der Dokumentation erläutert werden:
https://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#i16209

Wenn Sie numerische Felder angeben, ist es eine gute Idee, die Genauigkeit und Skalierung angeben.
Dies bietet zusätzliche Integritätsprüfung bei der Eingabe.


Die Präzision und die Skala von Zahlen haben keine jede mögliche Auswirkung auf Indizes, eine Speicherung und die Geschwindigkeit von Abfragen.
Die Größe der Werte in der Spalte kann sich auf eine Indexgröße und ihre Geschwindigkeit auswirken.

Aber kaum jemand weiß, dass Oracle Zahlen auf der Festplatte in eine variierende Breite speichert - kein festes witdth Format.

Es kann mit Hilfe von vsize Funktion überprüft werden, die auf der Festplatte in Byte mit einer Größe von einem Wert ergibt:
https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions213.htm

Hier ist ein einfaches Experiment:

create table my_numbers(
    my_number number 
); 

insert into my_numbers values(1); 
insert into my_numbers values(9); 
insert into my_numbers values(99); 
insert into my_numbers values(999); 
insert into my_numbers values(9999); 
insert into my_numbers values(99999); 
insert into my_numbers values(999999); 
commit; 

select my_number, vsize(my_number) 
from my_numbers; 

MY_NUMBER      VSIZE(MY_NUMBER) 
---------- --------------------------------------- 
     1          2 
     9          2 
     99          2 
     999          3 
     9999          3 
    99999          4 
    999999          4 

Und jetzt:

UPDATE my_numbers set my_number = my_number + 1; 
commit; 
select my_number, vsize(my_number) 
from my_numbers; 
MY_NUMBER      VSIZE(MY_NUMBER) 
---------- --------------------------------------- 
     2          2 
     10          2 
     100          2 
     1000          2 
    10000          2 
    100000          2 
    1000000          2 

Wie Sie sehen, haben deklarierte Genauigkeit und Skalierung keinen Einfluss auf einen Speicherplatz auf der Festplatte nach Zahlen.