sql - oracle索引 - Oracle 12c-在“数字”列上的索引比在“varchar”列上的索引执行得更快?



oracle drop index (1)

[TL; DR]使用日期来存储日期,数字来存储数字和字符串来存储字符串。

资源使用情况如何?

Oracle将NUMBER数据类型存储为每2位1个字节。

Oracle将CHAR数据类型存储为每个ASCII字符1个字节(UTF-8和其他编码可能需要扩展集中的字符更多),并将字符串右侧填充空格字符,以使字符串长度完全相同。

Oracle将VARCHAR2数据类型存储为每个ASCII字符1个字节,以及字符串长度的小开销(1或2个字节)。

Oracle将DATE数据类型存储为7个字节 (年份为2,月份,日期,小时,分钟,秒为1)。

基于你以前的问题,你似乎在存储yearquarter并假设你总是有4位数和1位数的季度:

  • NUMBER(5,0)需要3个字节;
  • CHAR(5 CHARACTER)需要5个字节;
  • VARCHAR2(5 CHARACTER)需要6个字节; 和
  • DATE需要7个字节。

所以只考虑NUMBER(5,0)记忆效率最高。

然而

只要你开始在数字/字符串存储的年份/季度做算术,那么你会遇到性能问题:

例如,获得下一季度:

  • 如果quarterNUMBER数据类型,那么你可以使用: CASE WHEN MOD(quarter,10) = 4 THEN quarter + 7 ELSE quarter + 1 END但是当你想要增加5个季度或者开始减去季度然后逻辑开始变得更加复杂。
  • 如果quarter是一个CHAR数据类型,那么你可以将它转换为数字或日期,并使用这些方法(字符串操作不可能是高性能的)。
  • 如果quarterDATE那么你只需要使用ADD_MONTHS( quarter, 3 )

DATE方法是自我记录的,并且已经存在,而NUMBER方法只是为了近似QUARTER数据类型而成为一个自定义函数,一旦实现了所有需要的比较和处理函数,您将有效地将DATE数据类型重写为一个用于宿舍的UDT,那些功能将比优化的日期函数少。

不要使用不适当的数据类型 - 只是将日期存储为日期; 数字作为数字; 和字符串作为字符串。

假设我在Oracle 12c中有一个表,

create table t1 (
a number (5,0),
b varchar (5,0)
d ...
e ...
);

然后我插入两个具有相同值的列中的100,000,000条记录 - 例如

20151 and '20152' ... (for a first record)
20152 and '20152' ... (for a second record)
20153 and '20153' ... (for a third record)
...

然后我在列'a'上添加索引1,在列'b'.上添加索引2 'b'.

问题是 - 对列'b'执行列'a'时,查询执行的速度是否同样快(例如,使用基于列'a'其他表或基于列'b'或其他表中的WHERE子句join查询列)?

另外 - 会使用' varchar '列上的索引 - 使用更多的CPU比使用'数字'列索引?

谢谢。





numbers