Nie ma różnicy w wydajności. I nie ma żadnych ukrytych optymalizacji ze względu na moc 2.
Jedyną rzeczą, która robi różnicę w sposobie przechowywania rzeczy, jest rzeczywista dane. 100 znaków przechowywanych w VARCHAR2(2000)
kolumna jest przechowywana dokładnie tak samo jak 100 znaków przechowywanych w VARCHAR2(500)
kolumna.
Pomyśl o długości jako ograniczeniu biznesowym , a nie jako część typu danych. Jedyną rzeczą, która powinna kierować Twoją decyzją o długości, są ograniczenia biznesowe dotyczące umieszczanych tam danych.
Edytuj :jedyna sytuacja, w której długość ma znaczenie zrobić różnicę, gdy potrzebujesz indeksu w tej kolumnie. Starsze wersje Oracle (<10) miały limit długości klucza, co zostało sprawdzone podczas tworzenia indeksu.
Mimo że jest to możliwe w Oracle 11, może nie być najmądrzejszym wyborem, aby mieć indeks wartości z 4000 znaków.
Edytuj 2 :
Byłem więc ciekawy i przygotowałem prosty test:
create table narrow (id varchar(40));
create table wide (id varchar(4000));
Następnie wypełniłem obie tabele ciągami składającymi się z 40 'X'. Jeśli rzeczywiście istniała (znacząca) różnica między pamięcią masową, powinno to się jakoś pokazać podczas pobierania danych, prawda?
Obie tabele mają dokładnie 1048576 wierszy.
Tak więc pełne skanowanie tabeli dla obu tabel zrobiło dokładnie to samo. Co się dzieje, gdy faktycznie wybieramy dane?
SQL> wybierz * z szerokiego;wybrano 1048576 wierszy.Statystyka----------------------------------- ----------------------- 4 wywołania rekurencyjne 2 blok db uzyskuje spójność 76497 otrzymuje 0 odczytów fizycznych 0 rozmiar ponownego wykonania 54386472 bajty wysyłane przez SQL*Net do klienta 769427 bajtów otrzymane przez SQL*Net od klienta 69907 SQL*Net roundtrips do/od klienta 0 sortuje (pamięć) 0 sortuje (dysk) 1048576 przetworzonych wierszySQL> wybierz * z zawężenia;wybrano 1048576 wierszy.Statystyka---------- ------------------------------------------------ 4 rekurencyjne wywołania 2 db blok uzyskuje zgodność z 76485 otrzymuje 0 fizycznych odczytów 0 rozmiar ponownego wykonania 54386472 bajtów wysłanych przez SQL*Net do klienta 769427 bajtów odebranych przez SQL*Net od klienta 69907 SQL*Net roundtrips do/od klienta 0 sortuje (pamięć) 0 sortuje (dysk ) 1048576 przetworzonych wierszySQL>
Istnieje niewielka różnica w spójnych pobraniach, ale może to być spowodowane buforowaniem.