Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle12c-是一个';编号';列在';瓦查尔';专栏?_Sql_Oracle_Indexing_Numbers - Fatal编程技术网

Sql Oracle12c-是一个';编号';列在';瓦查尔';专栏?

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

假设我在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 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位数的季度,然后:

  • 数字(5,0)
    需要3个字节
  • CHAR(5个字符)
    需要5个字节
  • VARCHAR2(5个字符)
    需要6个字节;及
  • DATE
    需要7个字节
因此,仅考虑内存a
数字(5,0)
将是最有效的

然而 一旦您开始对存储为数字/字符串的年度/季度进行算术运算,您就会遇到性能问题:

例如,获取下一个季度:

  • 如果
    quarter
    是一种
    NUMBER
    数据类型,那么您可以使用:
    当MOD(quarter,10)=4,然后quarter+7,否则quarter+1 END
    时的情况,但当您想要添加5个季度或开始减去季度时,这无法处理,然后逻辑开始变得更加复杂
  • 如果
    quarter
    CHAR
    数据类型,则可以将其转换为数字或日期,并使用其中任何一种方法(不太可能执行字符串操作)
  • 如果
    季度
    日期
    ,则只需使用
    添加月份(季度,3)
DATE
方法是自记录的,并且已经存在,而
NUMBER
方法将成为一个自定义函数,用于近似
季度
数据类型,一旦您实现了所需的所有比较和操作功能,您将有效地重写
日期
数据作为季度的UDT类型,这些功能的性能将低于优化的日期功能


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

我认为这不是一个现实问题。两者的性能大致相同。选择对数据有意义的数据类型(特别是当您需要排序、比较和使用范围时)。我将重新设计数据库(目前正在审阅)-这样就没有性能差异了吗?资源使用情况如何?将数字存储为数字(只要它们保持在支持范围和精度内)。其他一切都是愚蠢的,我同意这一点。然而,我并没有设计包含许多表的数据库,而是根据需要重新设计了数据库。现在,如果我决定将Varchar重新设计为一个数字,那么在所有涉及的应用程序上进行更改可能会有很多工作要做。但是,如果差异非常小-也许这项努力不值得…将不会有显著的性能差异。但如果您当前将数字存储为varchar,那么这似乎是一个非常奇怪的设计决策。