Er is geen verschil in prestaties. En er zijn geen verborgen optimalisaties gedaan vanwege de kracht van 2.
Het enige dat een verschil maakt in hoe dingen worden opgeslagen, is de werkelijke gegevens. 100 tekens opgeslagen in een VARCHAR2(2000) kolom worden op precies dezelfde manier opgeslagen als 100 tekens die zijn opgeslagen in een VARCHAR2(500) kolom.
Zie de lengte als een zakelijke beperking , niet als onderdeel van het gegevenstype. Het enige dat uw beslissing over de lengte zou moeten bepalen, zijn de zakelijke beperkingen met betrekking tot de gegevens die daarin worden ingevoerd.
Bewerken :de enige situatie waarin de lengte doet een verschil maken, is wanneer u een index op die kolom nodig heeft. Oudere Oracle-versies (<10) hadden wel een limiet op de sleutellengte en dat werd gecontroleerd bij het maken van de index.
Ook al is het mogelijk in Oracle 11, het is misschien niet de verstandigste keuze om een index te hebben op een waarde met 4000 tekens.
Bewerk 2 :
Dus ik was nieuwsgierig en zette een eenvoudige test op:
create table narrow (id varchar(40));
create table wide (id varchar(4000));
Daarna beide tabellen gevuld met strings bestaande uit 40 'X'. Als er inderdaad een (aanzienlijk) verschil was tussen de opslag, zou dit op de een of andere manier moeten blijken bij het ophalen van de gegevens, toch?
Beide tabellen hebben precies 1048576 rijen.
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>
Dus de volledige tafelscan voor beide tafels deed precies hetzelfde. Dus wat gebeurt er als we de gegevens daadwerkelijk selecteren?
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>
Er is een klein verschil in consistente Gets, maar dat kan te wijten zijn aan caching.