[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; iDATE
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
toNUMBER
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
toCHAR
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
toDATE
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.