Oracle
 sql >> Database >  >> RDS >> Oracle

Perché Oracle varchar2 ha una dimensione obbligatoria come parametro di definizione?

No, non è affatto la stessa cosa.

  1. La lunghezza della colonna è metadati utili per gli sviluppatori che creano schermate.
  2. Strumenti di query automatici simili come TOAD e SQL Developer utilizzano la lunghezza della colonna durante il rendering dei risultati.
  3. Il database utilizza la lunghezza di una variabile durante l'allocazione della memoria per le raccolte PL/SQL. Poiché quella memoria esce dal PGA, il sovradimensionamento della dichiarazione della variabile può causare il fallimento dei programmi perché il server ha esaurito la memoria.
  4. Ci sono problemi simili con la dichiarazione di singole variabili nei programmi PL/SQL, è solo che le raccolte tendono a moltiplicare il problema.
  5. Le colonne sovradimensionate creano problemi per gli indici composti. Quanto segue è su un database con 8K blocchi

....

SQL> create table t23 (col1 varchar2(4000), col2 varchar2(4000))
  2  /

Table created.

SQL> create index t23_i on t23(col1,col2)
  2  /
create index t23_i on t23(col1,col2)
                      *
ERROR at line 1:
ORA-01450: maximum key length (6398) exceeded


SQL>

Ma soprattutto, le dimensioni delle colonne sono una forma di controllo degli errori. Se la colonna dovrebbe essere lunga dieci caratteri e qualche processo autonomo sta tentando di caricare un migliaio di caratteri, allora qualcosa non va. Il processo dovrebbe fallire, quindi possiamo indagare sul motivo per cui stiamo caricando i dati Duff. L'alternativa è un database pieno di spazzatura e, se era quello che volevamo, avremmo dovuto semplicemente fornire a tutti Excel e farcela.

È vero che cambiare la dimensione della colonna quando risulta che abbiamo sottovalutato può essere noioso. Ma non succede molto spesso e possiamo mitigare un sacco di problemi usando le dichiarazioni %TYPE e SUBTYPE nel nostro PL/SQL invece di codificare le lunghezze variabili.

I numeri sono diversi. Per cominciare, la dimensione massima di un numero è molto più piccola dell'equivalente testuale (38 cifre di precisione garantita).

Ma la differenza fondamentale è che Oracle memorizza i valori numerici in notazione scientifica quindi non esiste una relazione diretta tra la dimensione aritmetica del numero e lo spazio di archiviazione che consuma.

SQL> select vsize(123456789012345678901) n1
  2         , vsize(999999999999999999999999999999) n2
  3         , vsize(0.000000000000000000001) n3
  4         , vsize(1000000000000000000000000) n4
  5  from dual
  6  /

        N1         N2         N3         N4
---------- ---------- ---------- ----------
        12         16          2          2

SQL> 

Tuttavia, è buona norma specificare la scala e la precisione ove possibile, specialmente quando si tratta di numeri interi, diciamo, o di denaro.