Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Warum hat Oracle varchar2 eine obligatorische Größe als Definitionsparameter?

Nein, das ist überhaupt nicht dasselbe.

  1. Die Länge der Spalte ist ein nützliches Metadatum für Entwickler, die Bildschirme erstellen.
  2. In ähnlicher Weise verwenden automatische Abfragetools wie TOAD und SQL Developer die Länge der Spalte, wenn sie Ergebnisse ausgeben.
  3. Die Datenbank verwendet die Länge einer Variablen, wenn sie Speicher für PL/SQL-Sammlungen zuweist. Da dieser Speicher aus dem PGA kommt, kann die Supersizing der Variablendeklaration dazu führen, dass Programme fehlschlagen, weil der Server nicht mehr genügend Speicher hat.
  4. Es gibt ähnliche Probleme mit der Deklaration einzelner Variablen in PL/SQL-Programmen, nur dass Sammlungen dazu neigen, das Problem zu vervielfachen.
  5. Spalten mit Übergröße verursachen Probleme bei zusammengesetzten Indizes. Das Folgende ist auf einer Datenbank mit 8K-Blöcken

....

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>

Aber vor allem sind Spaltengrößen eine Form der Fehlerprüfung. Wenn die Spalte zehn Zeichen lang sein soll und ein autonomer Prozess versucht, tausend Zeichen zu laden, dann stimmt etwas nicht. Der Prozess sollte fehlschlagen, damit wir untersuchen können, warum wir Duff-Daten laden. Die Alternative ist eine Datenbank voller Müll, und wenn das gewollt wäre, hätten wir einfach jedem Excel geben sollen und damit fertig.

Es stimmt, dass es lästig sein kann, die Spaltengröße zu ändern, wenn sich herausstellt, dass wir sie unterschätzt haben. Aber es passiert nicht sehr oft, und wir können viele Probleme lindern, indem wir %TYPE- und SUBTYPE-Deklarationen in unserem PL/SQL verwenden, anstatt Variablenlängen fest zu codieren.

Zahlen sind anders. Zunächst einmal ist die maximale Größe einer Zahl viel kleiner als das Textäquivalent (38 Stellen mit garantierter Genauigkeit).

Der Hauptunterschied besteht jedoch darin, dass Oracle numerische Werte in speichert wissenschaftliche Notation es gibt also keine direkte Beziehung zwischen der arithmetischen Größe der Zahl und dem verbrauchten Speicherplatz.

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> 

Nichtsdestotrotz bleibt es eine bewährte Praxis, wo immer möglich Skalierung und Genauigkeit anzugeben, insbesondere wenn wir es beispielsweise mit ganzen Zahlen oder Geld zu tun haben.