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

Oracle 12c - czy indeks w kolumnie „number” działa szybciej niż indeks w kolumnie „varchar”?

[TL;DR] Używaj dat do przechowywania dat, liczb do przechowywania liczb i ciągów do przechowywania ciągów.

Oracle przechowuje NUMBER typ danych jako 1 bajt na 2 cyfry.

Oracle przechowuje CHAR typ danych jako 1 bajt na znak ASCII (UTF-8 i inne kodowania mogą zająć więcej znaków w zestawach rozszerzonych) i dopełnia ciąg prawym klawiszem spacji, aby wszystkie ciągi były dokładnie tej samej długości.

Oracle przechowuje VARCHAR2 typ danych jako 1 bajt na znak ASCII plus mały narzut (1 lub 2 bajty) dla długości łańcucha.

Oracle przechowuje DATE typ danych jako 7 bajtów (2 dla roku i 1 dla każdego miesiąca, dnia, godziny, minuty, sekundy).

Na podstawie Twojego poprzedniego pytania wygląda na to, że przechowujesz year i quarter i zakładając, że zawsze będziesz mieć 4-cyfrowe lata i 1-cyfrowe kwartały, to:

  • NUMBER(5,0) zajmie 3 bajty;
  • CHAR(5 CHARACTER) zajmie 5 bajtów;
  • VARCHAR2(5 CHARACTER) zajęłoby 6 bajtów; i
  • DATE zajmie 7 bajtów.

Tak więc tylko biorąc pod uwagę pamięć jako NUMBER(5,0) byłby najbardziej wydajny.

Jednak

Jak tylko zaczniesz robić arytmetykę na roku/kwartałach przechowywanych jako liczby/ciągi, masz problemy z wydajnością:

Na przykład uzyskanie kolejnego kwartału :

  • Jeśli quarter to NUMBER typu danych możesz użyć:CASE WHEN MOD(quarter,10) = 4 THEN quarter + 7 ELSE quarter + 1 END ale to nie działa, gdy chcesz dodać 5 ćwiartek lub zacząć odejmować ćwiartki, a wtedy logika staje się znacznie bardziej skomplikowana.
  • Jeśli quarter to CHAR typu danych, możesz przekonwertować go na liczbę lub datę i użyć jednej z tych metod (manipulacja ciągami prawdopodobnie nie będzie skuteczna).
  • Jeśli quarter to DATE wtedy wystarczy użyć ADD_MONTHS( quarter, 3 ) .

DATE metoda jest samodokumentująca i już istnieje, natomiast NUMBER metoda stałaby się po prostu funkcją niestandardową do aproksymacji QUARTER typ danych, a po zaimplementowaniu wszystkich funkcji porównywania i manipulacji, których potrzebujesz, skutecznie przepiszesz DATE typ danych jako UDT dla kwartałów, a te funkcje będą mniej wydajne niż zoptymalizowane funkcje daty.

Nie używaj nieodpowiednich typów danych - po prostu przechowuj daty jako daty; liczby jako liczby; i ciągi jako ciąg.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wywoływanie Pythona z Oracle

  2. Indeks Oracle 11 tylko dla części danych

  3. Przykład replikacji strumieni Oracle krok po kroku

  4. jak łączyć ciągi?

  5. Wstawianie do Oracle i pobieranie wygenerowanego identyfikatora sekwencji