[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ů; aDATEzabere 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
quarterjeNUMBERdatový typ, pak byste mohli použít:CASE WHEN MOD(quarter,10) = 4 THEN quarter + 7 ELSE quarter + 1 ENDale tohle nejde, když chcete přidat 5 čtvrtin nebo začít odečítat čtvrtiny a pak se logika začne mnohem komplikovat. - Pokud
quarterjeCHARdatový 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
quarterjeDATEpak 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.