[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; enDATEzou 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
quarteris eenNUMBERdatatype dan zou je kunnen gebruiken:CASE WHEN MOD(quarter,10) = 4 THEN quarter + 7 ELSE quarter + 1 ENDmaar dit werkt niet als je 5 kwartalen wilt optellen of kwartalen wilt aftrekken en dan wordt de logica veel gecompliceerder. - Als
quarteris eenCHARgegevenstype, 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
quarteris eenDATEdan 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.