[TL;DR] Използвайте дати за съхраняване на дати, числа за съхраняване на числа и низове за съхраняване на низове.
Oracle съхранява NUMBER
тип данни като 1 байт на 2 цифри.
Oracle съхранява CHAR
тип данни като 1 байт на ASCII знак (UTF-8 и други кодировки може да отнемат повече за знаци в разширени набори) и ще допълни низа отдясно със знаци за интервал, така че всички низове да са с еднаква дължина.
Oracle съхранява VARCHAR2
тип данни като 1 байт на ASCII знак плюс малка надбавка (1 или 2 байта) за дължината на низа.
Oracle съхранява DATE
тип данни като 7 байта
(2 за година и 1 за всеки месец, ден, час, минута, секунда).
Въз основа на ваш предишен въпрос
изглежда, че съхранявате year
и quarter
и ако приемем, че винаги ще имате 4-цифрени години и 1-цифрени тримесечия, тогава:
NUMBER(5,0)
ще отнеме 3 байта;CHAR(5 CHARACTER)
ще отнеме 5 байта;VARCHAR2(5 CHARACTER)
ще отнеме 6 байта; иDATE
ще отнеме 7 байта.
Така че само паметта се разглежда като NUMBER(5,0)
би било най-ефективно.
Въпреки това
Веднага след като започнете да правите аритметика на година/тримесечия, съхранени като числа/низове, тогава ще изпаднете в проблеми с производителността:
Например получаване на следващото тримесечие:
- Ако
quarter
еNUMBER
тип данни, тогава можете да използвате:CASE WHEN MOD(quarter,10) = 4 THEN quarter + 7 ELSE quarter + 1 END
но това не работи, когато искате да добавите 5 четвърти или да започнете да изваждате четвърти и тогава логиката започва да става много по-сложна. - Ако
quarter
еCHAR
тип данни, тогава бихте могли да ги конвертирате в число или дата и да използвате някой от тези методи (манипулирането на низове вероятно няма да бъде ефективно). - Ако
quarter
еDATE
тогава просто трябва да използватеADD_MONTHS( quarter, 3 )
.
DATE
методът е самодокументиращ се и вече съществува, докато NUMBER
просто ще се превърне в персонализирана функция за вашето приближение на QUARTER
тип данни и след като приложите всички функции за сравнение и манипулиране, от които се нуждаете, ефективно ще пренапишете DATE
тип данни като UDT за тримесечия и тези функции ще бъдат по-малко ефективни от оптимизираните функции за дата.
Не използвайте неподходящи типове данни - просто съхранявайте датите като дати; числата като числа; и низове като низ.