Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Preferowane długości kolumn Oracle

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.

ustaw autotrace traceonly statisticsSQL> wybierz count(*) z szerokiego;Statystyka--- -------------------------------------------------- ----- 0 wywołań rekurencyjnych 1 blok db uzyskuje zgodność 6833 otrzymuje 0 fizycznych odczytów 0 rozmiar ponownego wykonania 349 bajtów wysłanych przez SQL*Net do klienta 472 bajty odebranych przez SQL*Net od klienta 2 SQL*Net roundtrips do/od klienta 0 sortuje (pamięć) 0 sortuje (dysk) 1 wiersze przetworzoneSQL> wybierz count(*) z wąskich;Statystyki-------------------------------------------- ----------------------------- 0 wywołań rekurencyjnych 1 blok db uzyskuje zgodność 6833 otrzymuje 0 odczytów fizycznych 0 rozmiar ponownego wykonania 349 bajtów wysyłanych przez SQL *Net do klienta 472 bajty odebrane przez SQL*Net od klienta 2 SQL*Net roundtrips do/od klienta 0 sortowań (pamięć) 0 sortowań (dysk) 1 wierszy przetworzonychSQL>

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak rozwiązać problem z Oracle DBMS_LOB

  2. Jak efektywnie załadować DataFrame pandy typu mieszanego do bazy danych Oracle?

  3. Dziwny wzorzec użycia pamięci w aplikacji C# Windows Form

  4. Wydrukuj tekst w oknie arkusza roboczego Oracle SQL Developer SQL

  5. Programista PL/SQL, jak uzyskać wiersz, który spowodował niepowodzenie wstawiania?