No hay diferencia en el rendimiento. Y no se realizan optimizaciones ocultas debido a la potencia de 2.
Lo único que marca la diferencia en cómo se almacenan las cosas es el real datos. 100 caracteres almacenados en un VARCHAR2(2000)
se almacenan exactamente de la misma manera que 100 caracteres almacenados en un VARCHAR2(500)
columna.
Piense en la longitud como una restricción comercial , no como parte del tipo de datos. Lo único que debería impulsar su decisión sobre la longitud son las restricciones comerciales sobre los datos que se colocan allí.
Editar :la única situación en la que la longitud no marcar la diferencia, es cuando necesita un índice en esa columna. Las versiones anteriores de Oracle (<10) tenían un límite en la longitud de la clave y eso se verificó al crear el índice.
Aunque es posible en Oracle 11, puede que no sea la opción más inteligente tener un índice en un valor con 4000 caracteres.
Editar 2 :
Así que tenía curiosidad y configuré una prueba simple:
create table narrow (id varchar(40));
create table wide (id varchar(4000));
Luego llenó ambas tablas con cadenas compuestas por 40 'X'. Si de hecho hubo una diferencia (sustancial) entre el almacenamiento, esto debería aparecer de alguna manera al recuperar los datos, ¿verdad?
Ambas tablas tienen exactamente 1048576 filas.
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>
Entonces, el escaneo completo de la tabla para ambas tablas hizo exactamente lo mismo. Entonces, ¿qué sucede cuando realmente seleccionamos los datos?
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>
Hay una ligera diferencia en las obtenciones consistentes, pero eso podría deberse al almacenamiento en caché.