Няма разлика в производителността. И няма скрити оптимизации, направени поради силата на 2.
Единственото нещо, което прави разлика в това как се съхраняват нещата, е реалното данни. 100 знака, съхранени в VARCHAR2(2000) колона се съхраняват точно по същия начин като 100 знака, съхранени в VARCHAR2(500) колона.
Мислете за дължината като за бизнес ограничение , а не като част от типа данни. Единственото нещо, което трябва да ръководи решението ви относно дължината, са бизнес ограниченията относно данните, които се поставят там.
Редактиране :единствената ситуация, в която дължината прави направи разлика, е когато имате нужда от индекс на тази колона. По-старите версии на Oracle (<10) имаха ограничение за дължината на ключа и това беше проверено при създаването на индекса.
Въпреки че е възможно в Oracle 11, може да не е най-мъдрият избор да имате индекс на стойност с 4000 знака.
Редактиране 2 :
Така че бях любопитен и настроих прост тест:
create table narrow (id varchar(40));
create table wide (id varchar(4000));
След това попълни и двете таблици с низове, съставени от 40 'X'. Ако наистина е имало (съществена) разлика между хранилището, това трябва да се покаже по някакъв начин при извличане на данните, нали?
И двете таблици имат точно 1048576 реда.
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>
Така че пълното сканиране на таблици и за двете таблици направи точно същото. И така, какво се случва, когато всъщност изберем данните?
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>
Има малка разлика в последователните получавания, но това може да се дължи на кеширане.