[TL;DR] Používejte data k ukládání dat, čísla k ukládání čísel a řetězce k ukládání řetězců.
Oracle ukládá NUMBER
datový typ jako 1 bajt na 2 číslice.
Oracle ukládá CHAR
datový typ jako 1 bajt na znak ASCII (kódování UTF-8 a další kódování může trvat déle pro znaky v rozšířených sadách) a doplní řetězec vpravo mezerami, takže všechny řetězce budou přesně stejně dlouhé.
Oracle ukládá VARCHAR2
datový typ jako 1 bajt na znak ASCII plus malá režie (1 nebo 2 bajty) pro délku řetězce.
Oracle ukládá DATE
datový typ jako 7 bajtů
(2 pro rok a 1 pro každý měsíc, den, hodinu, minutu, sekundu).
Na základě vašeho předchozího dotazu
zdá se, že ukládáte year
a quarter
a za předpokladu, že budete mít vždy čtyřciferné roky a jednociferné čtvrtletí:
NUMBER(5,0)
bude trvat 3 bajty;CHAR(5 CHARACTER)
by trvalo 5 bajtů;VARCHAR2(5 CHARACTER)
zabere 6 bajtů; aDATE
zabere 7 bajtů.
Tedy pouze uvažovat paměť jako NUMBER(5,0)
by bylo nejúčinnější.
Nicméně
Jakmile začnete provádět aritmetiku pro rok/čtvrtletí uložené jako čísla/řetězce, dostanete se do problémů s výkonem:
Například získání dalšího čtvrtletí :
- Pokud
quarter
jeNUMBER
datový typ, pak byste mohli použít:CASE WHEN MOD(quarter,10) = 4 THEN quarter + 7 ELSE quarter + 1 END
ale tohle nejde, když chcete přidat 5 čtvrtin nebo začít odečítat čtvrtiny a pak se logika začne mnohem komplikovat. - Pokud
quarter
jeCHAR
datový typ, pak jej můžete převést na číslo nebo datum a použít některou z těchto metod (manipulace s řetězci pravděpodobně nebude účinná). - Pokud
quarter
jeDATE
pak stačí použítADD_MONTHS( quarter, 3 )
.
DATE
metoda je samodokumentující a již existuje, zatímco NUMBER
metoda by se jen stala vlastní funkcí pro vaši aproximaci QUARTER
datový typ a jakmile implementujete všechny potřebné porovnávací a manipulační funkce, efektivně přepíšete DATE
datový typ jako UDT pro čtvrtletí a tyto funkce budou méně výkonné než funkce optimalizovaného data.
Nepoužívejte nevhodné datové typy – pouze ukládejte data jako data; čísla jako čísla; a řetězce jako řetězec.