Sql Oracle12c-是一个';编号';列在';瓦查尔';专栏?
假设我在Oracle 12c中有一个表,其中有列:Sql Oracle12c-是一个';编号';列在';瓦查尔';专栏?,sql,oracle,indexing,numbers,Sql,Oracle,Indexing,Numbers,假设我在Oracle 12c中有一个表,其中有列: create table t1 ( a number (5,0), b varchar (5,0) d ... e ... ); 然后我在两列中插入100000000条具有相同值的记录-例如 20151 and '20152' ... (for a first record) 20152 and '20152' ... (for a second record) 20153 and '20153' ... (for a third recor
create table t1 (
a number (5,0),
b varchar (5,0)
d ...
e ...
);
然后我在两列中插入100000000条具有相同值的记录-例如
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。
问题是-当对列'a'
执行查询时,查询的执行速度是否与对列'b'
执行查询时一样快(例如,基于列'a'
或基于列'b'
或列WHERE
子句将查询与其他表连接起来)
另外-在“varchar
”列上使用索引会比在“number”列上使用索引使用更多的CPU吗
谢谢。[TL;DR]使用日期存储日期,使用数字存储数字,使用字符串存储字符串 资源使用情况如何 Oracle将
数字
数据类型存储为每2位1字节
Oracle将CHAR
数据类型存储为每ASCII字符1字节(UTF-8和其他编码可能需要更多的扩展集字符),并将使用空格字符右键填充字符串,使字符串的长度完全相同
Oracle将VARCHAR2
数据类型存储为每ASCII字符1个字节加上字符串长度的少量开销(1或2个字节)
Oracle将日期数据类型存储为(2表示年,1表示月、日、时、分、秒)
基于您似乎在存储年
和季度
,并假设您总是有4位数的年和1位数的季度,然后:
需要3个字节李>数字(5,0)
需要5个字节李>CHAR(5个字符)
需要6个字节;及VARCHAR2(5个字符)
需要7个字节DATE
数字(5,0)
将是最有效的
然而
一旦您开始对存储为数字/字符串的年度/季度进行算术运算,您就会遇到性能问题:
例如,获取下一个季度:
- 如果
是一种quarter
数据类型,那么您可以使用:NUMBER
时的情况,但当您想要添加5个季度或开始减去季度时,这无法处理,然后逻辑开始变得更加复杂当MOD(quarter,10)=4,然后quarter+7,否则quarter+1 END
- 如果
是quarter
数据类型,则可以将其转换为数字或日期,并使用其中任何一种方法(不太可能执行字符串操作)CHAR
- 如果
是季度
,则只需使用日期
添加月份(季度,3)
DATE
方法是自记录的,并且已经存在,而NUMBER
方法将成为一个自定义函数,用于近似季度
数据类型,一旦您实现了所需的所有比较和操作功能,您将有效地重写日期
数据作为季度的UDT类型,这些功能的性能将低于优化的日期功能
不要使用不合适的数据类型-只需将日期存储为日期;数字作为数字;字符串作为字符串。我认为这不是一个现实问题。两者的性能大致相同。选择对数据有意义的数据类型(特别是当您需要排序、比较和使用范围时)。我将重新设计数据库(目前正在审阅)-这样就没有性能差异了吗?资源使用情况如何?将数字存储为数字(只要它们保持在支持范围和精度内)。其他一切都是愚蠢的,我同意这一点。然而,我并没有设计包含许多表的数据库,而是根据需要重新设计了数据库。现在,如果我决定将Varchar重新设计为一个数字,那么在所有涉及的应用程序上进行更改可能会有很多工作要做。但是,如果差异非常小-也许这项努力不值得…将不会有显著的性能差异。但如果您当前将数字存储为varchar,那么这似乎是一个非常奇怪的设计决策。