2014-06-16 20 views
9

L'ho cercato ma non riesco a trovare una risposta definitiva alla mia domanda ...Dimensione memoria Oracle NUMBER (p)?

Ho bisogno di sapere qual è la dimensione di archiviazione di un campo numero (p) in Oracle.

Esempi: NUMBER (1), NUMERO (3), NUMERO (8), NUMERO (10) ecc ...

risposta

26

all'archiviazione utilizzata dipende dal valore numerico effettivo, nonché dalla precisione e dalla scala della colonna della colonna.

I Oracle 11gR2 concepts guide says:

Oracle Database archivia i dati numerici in formato a lunghezza variabile. Ogni valore è memorizzato in notazione scientifica, con 1 byte utilizzato per memorizzare l'esponente. Il database utilizza fino a 20 byte per memorizzare la mantissa, che è la parte di un numero in virgola mobile che contiene le sue cifre significative. Oracle Database non memorizza gli zeri iniziali e finali.

Il 10gR2 guide goes further:

Tenendo conto di ciò, la dimensione di colonna in byte per un particolare numero valore dato numerico (p), dove p è la precisione di un dato valore, può essere calcolato con la seguente formula:

ROUND((length(p)+s)/2))+1 

dove s è uguale a zero se il numero è positivo, e s è uguale a 1 se il numero è negativo.

L'infinito positivo e negativo (generato solo all'importazione dal database Versione 5 di Oracle) viene memorizzato utilizzando rappresentazioni univoche. L'infinito zero e negativo richiedono 1 byte ciascuno; infinito positivo richiede 2 byte.

Se si ha accesso a My Oracle Support, sono disponibili ulteriori informazioni nella nota 1031902.6.

You can see the actual storage used with vsize or dump.

create table t42 (n number(10)); 

insert into t42 values (0); 
insert into t42 values (1); 
insert into t42 values (-1); 
insert into t42 values (100); 
insert into t42 values (999); 
insert into t42 values (65535); 
insert into t42 values (1234567890); 

select n, vsize(n), dump(n) 
from t42 
order by n; 

      N VSIZE(N)       DUMP(N) 
------------ ---------- --------------------------------- 
     -1   3   Typ=2 Len=3: 62,100,102 
      0   1     Typ=2 Len=1: 128 
      1   2    Typ=2 Len=2: 193,2 
     100   2    Typ=2 Len=2: 194,2 
     999   3   Typ=2 Len=3: 194,10,100 
     65535   4   Typ=2 Len=4: 195,7,56,36 
1234567890   6 Typ=2 Len=6: 197,13,35,57,79,91 

noti che la memorizzazione varia a seconda del valore, anche se sono tutti in una colonna number(10), e che due numeri a 3 cifre può essere necessario diverse quantità di stoccaggio.

+2

+1 Grazie per avermi introdotto alla funzione 'dump'! Mi aiuta nel debug di alcuni bug di Oracle (client library). –

1
NUMBER 
999...(38 9's) x10125 
maximum value Can be represented to full 38-digit precision (the mantissa). 

-999...(38 9's) x10125 
minimum value Can be represented to full 38-digit precision (the mantissa). 


Precision 38 significant digits ==> NUMBER(38) is the max 

consultare here e può anche essere here

+0

grazie per la risposta. Ma come posso calcolare quanti byte occupa un numero di tre cifre? –

0

Il tipo di dati number in Oracle è un tipo di dati speciale di lunghezza variabile come varchar. Quindi se si memorizzano gli stessi dati in number(5) e number(20), la memorizzazione è la stessa come dichiarare una colonna come varchar(100) e varchar(200).

Pertanto, specificare il parametro p in number(p,s) non ha alcun effetto sulle dimensioni della memoria ed è solo per l'applicazione del vincolo sui dati. Ma specificare il parametro s può ridurre le dimensioni arrotondando i dati.

la dimensione minima di memorizzazione del tipo di dati numerici è 1 byte e il massimo è 21 byte. Pertanto, se non si desidera applicare il vincolo, utilizzare il tipo di dati number senza parametro p.

Problemi correlati