[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; iDATEzajmie 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
quartertoNUMBERtypu danych możesz użyć:CASE WHEN MOD(quarter,10) = 4 THEN quarter + 7 ELSE quarter + 1 ENDale to nie działa, gdy chcesz dodać 5 ćwiartek lub zacząć odejmować ćwiartki, a wtedy logika staje się znacznie bardziej skomplikowana. - Jeśli
quartertoCHARtypu 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
quartertoDATEwtedy 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.