Няма разлика в производителността. И няма скрити оптимизации, направени поради силата на 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>
Има малка разлика в последователните получавания, но това може да се дължи на кеширане.