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

Von Oracle bevorzugte Spaltenlängen

Es gibt keinen Unterschied in der Leistung. Und es gibt keine versteckten Optimierungen aufgrund der Potenz von 2.

Das einzige, was einen Unterschied macht, wie Dinge gespeichert werden, ist das tatsächliche Daten. 100 Zeichen gespeichert in einem VARCHAR2(2000) Spalte werden genauso gespeichert wie 100 Zeichen, die in einem VARCHAR2(500) gespeichert sind Spalte.

Betrachten Sie die Länge als Geschäftseinschränkung , nicht als Teil des Datentyps. Die einzige Sache, die Ihre Entscheidung über die Länge beeinflussen sollte, sind die geschäftlichen Beschränkungen bezüglich der Daten, die dort eingegeben werden.

Bearbeiten :die einzige Situation, in der die Länge es tut einen Unterschied machen, ist, wenn Sie einen Index für diese Spalte benötigen. Ältere Oracle-Versionen (<10) hatten eine Beschränkung der Schlüssellänge, die beim Erstellen des Index überprüft wurde.

Auch wenn es in Oracle 11 möglich ist, ist es vielleicht nicht die klügste Wahl, einen Index für einen Wert mit 4000 Zeichen zu haben.

Bearbeiten 2 :

Also war ich neugierig und richtete einen einfachen Test ein:

create table narrow (id varchar(40));
create table wide (id varchar(4000));

Füllen Sie dann beide Tabellen mit Zeichenfolgen, die aus 40 'X' bestehen. Wenn es tatsächlich einen (wesentlichen) Unterschied zwischen der Speicherung gab, sollte sich dies beim Abrufen der Daten irgendwie zeigen, oder?

Beide Tabellen haben genau 1048576 Zeilen.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> set autotrace traceonly statistics
SQL> select count(*) from wide;


Statistics
----------------------------------------------------------
          0  recursive calls
          1  db block gets
       6833  consistent gets
          0  physical reads
          0  redo size
        349  bytes sent via SQL*Net to client
        472  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL> select count(*) from narrow;


Statistics
----------------------------------------------------------
          0  recursive calls
          1  db block gets
       6833  consistent gets
          0  physical reads
          0  redo size
        349  bytes sent via SQL*Net to client
        472  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL>

Der vollständige Tabellenscan für beide Tabellen hat also genau dasselbe bewirkt. Was passiert also, wenn wir die Daten tatsächlich auswählen?

SQL> select * from wide;

1048576 rows selected.


Statistics
----------------------------------------------------------
          4  recursive calls
          2  db block gets
      76497  consistent gets
          0  physical reads
          0  redo size
   54386472  bytes sent via SQL*Net to client
     769427  bytes received via SQL*Net from client
      69907  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
    1048576  rows processed

SQL> select * from narrow;

1048576 rows selected.


Statistics
----------------------------------------------------------
          4  recursive calls
          2  db block gets
      76485  consistent gets
          0  physical reads
          0  redo size
   54386472  bytes sent via SQL*Net to client
     769427  bytes received via SQL*Net from client
      69907  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
    1048576  rows processed

SQL>

Es gibt einen kleinen Unterschied bei den konsistenten Gets, aber das könnte am Caching liegen.