[TL;DR] Gebruik datums om datums op te slaan, getallen om getallen op te slaan en tekenreeksen om tekenreeksen op te slaan.
Oracle slaat het NUMBER
op gegevenstype als 1 byte per 2 cijfers.
Oracle slaat de CHAR
. op gegevenstype als 1 byte per ASCII-teken (UTF-8 en andere coderingen kunnen meer nodig hebben voor tekens in uitgebreide sets) en zal de tekenreeks met spatietekens naar rechts opvullen, zodat de tekenreeksen allemaal exact dezelfde lengte hebben.
Oracle slaat de VARCHAR2
. op datatype als 1 byte per ASCII-teken plus een kleine overhead (1 of 2 bytes) voor de stringlengte.
Oracle slaat de DATE
op gegevenstype als 7 bytes
(2 voor jaar en 1 voor maand, dag, uur, minuut, seconde).
Gebaseerd op je vorige vraag
je lijkt year
op te slaan en quarter
en ervan uitgaande dat je altijd 4-cijferige jaren en 1-cijferige kwartalen hebt, dan:
NUMBER(5,0)
zou 3 bytes in beslag nemen;CHAR(5 CHARACTER)
zou 5 bytes in beslag nemen;VARCHAR2(5 CHARACTER)
zou 6 bytes in beslag nemen; enDATE
zou 7 bytes in beslag nemen.
Dus alleen beschouwend geheugen als een NUMBER(5,0)
zou het meest efficiënt zijn.
Echter
Zodra je begint te rekenen met jaar/kwartalen die zijn opgeslagen als getallen/tekenreeksen, krijg je prestatieproblemen:
Bijvoorbeeld het volgende kwartaal ontvangen:
- Als
quarter
is eenNUMBER
datatype dan zou je kunnen gebruiken:CASE WHEN MOD(quarter,10) = 4 THEN quarter + 7 ELSE quarter + 1 END
maar dit werkt niet als je 5 kwartalen wilt optellen of kwartalen wilt aftrekken en dan wordt de logica veel gecompliceerder. - Als
quarter
is eenCHAR
gegevenstype, dan kunt u het converteren naar een getal of een datum en een van deze methoden gebruiken (het manipuleren van strings is waarschijnlijk niet effectief). - Als
quarter
is eenDATE
dan hoef je alleen maarADD_MONTHS( quarter, 3 )
. te gebruiken .
De DATE
methode is zelfdocumenterend en bestaat al, terwijl de NUMBER
methode zou gewoon een aangepaste functie worden voor uw benadering van een QUARTER
gegevenstype en zodra u alle benodigde vergelijkings- en manipulatiefuncties hebt geïmplementeerd, hebt u de DATE
effectief herschreven gegevenstype als een UDT voor kwartalen en die functies zullen minder presteren dan de geoptimaliseerde datumfuncties.
Gebruik geen ongepaste gegevenstypen - sla datums gewoon op als datums; nummers als nummers; en strings als string.