[TL;DR]使用日期来存储日期,使用数字来存储数字,使用字符串来存储字符串。
资源使用情况如何?
Oracle 存储NUMBER
数据类型为每 2 位 1 个字节。
Oracle 存储CHAR
数据类型为每个 ASCII 字符 1 个字节(对于扩展集中的字符,UTF-8 和其他编码可能需要更多字节),并将用空格字符右填充字符串,以便字符串的长度完全相同。
Oracle 存储VARCHAR2
数据类型为每个 ASCII 字符 1 个字节加上字符串长度的少量开销(1 或 2 个字节)。
Oracle 存储DATE
数据类型为7 bytes https://stackoverflow.com/q/13568193/1509264(2 代表年,1 代表月、日、时、分、秒)。
基于你之前的问题 https://stackoverflow.com/q/47043564/1509264你似乎正在存储year
and quarter
假设您总是有 4 位数的年份和 1 位数的季度,那么:
-
NUMBER(5,0)
需要 3 个字节;
-
CHAR(5 CHARACTER)
需要 5 个字节;
-
VARCHAR2(5 CHARACTER)
需要 6 个字节;和
-
DATE
将占用 7 个字节。
所以只考虑内存aNUMBER(5,0)
将是最有效的。
However
一旦您开始对存储为数字/字符串的年份/季度进行算术运算,就会遇到性能问题:
例如,获取下一个季度:
- If
quarter
is a NUMBER
数据类型,那么你可以使用:CASE WHEN MOD(quarter,10) = 4 THEN quarter + 7 ELSE quarter + 1 END
但是当您想要添加 5 个季度或开始减去季度时,这无法处理,然后逻辑开始变得更加复杂。
- If
quarter
is a CHAR
数据类型,那么您可以将其转换为数字或日期并使用其中任何一种方法(字符串操作不太可能有效)。
- If
quarter
is a DATE
那么你只需要使用ADD_MONTHS( quarter, 3 )
.
The DATE
方法是自记录的并且已经存在,而NUMBER
方法只会成为您的近似值的自定义函数QUARTER
数据类型,一旦您实现了所需的所有比较和操作函数,您将有效地重写DATE
将数据类型设置为季度的 UDT,这些函数的性能将不如优化的日期函数。
不要使用不适当的数据类型——仅将日期存储为日期;数字就是数字;和字符串作为字符串。