Oracle 中 INTEGER 与 NUMBER 的当前状态

6 oracle oracle-12c

我正在使用 Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64 位生产,我正在尝试决定使用INTEGERNUMBER将包含LONG来自 Java的整数字段。

以供参考:

Long.BYTES = 8
Long.SIZE = 64
Long.MAX_VALUE = 9223372036854775807 / 2^63-1
Run Code Online (Sandbox Code Playgroud)

我从Stack Overflow 上的一个答案中找到了一篇相对较旧的博客文章,该文章表明您永远不应该真正使用,因为与使用. 即使只是ID列。INTEGERNUMBER

INTEGER 总是比 NUMBER 慢。由于整数是具有附加约束的数字。强制执行约束需要额外的 CPU 周期。我从未观察到任何差异,但是当我们在 INTEGER 列上加载数百万条记录时可能会有所不同。如果我们需要确保输入是整数,那么 INTEGER 是最好的选择。否则,我们可以坚持使用 NUMBER 数据类型。

这篇文章还指出“INTEGER 等价于 NUMBER(38,0)”,这是我已经知道的。我无法确定它是否与提出的可能的性能问题等效。

  1. 我确实想确保所有值都只是整数。
  2. 我将定期处理数百万行并加入此列,因为它将成为数百个表的外键。

Oracle文档说,

INTEGERINT并且SMALLINT都映射到NUMBER(p,0)

因此,我打算NUMBER(38,0)像往常一样使用许多旧数据库和表,我正在从中导入数据,实际上将这些ID信息存储在 a 中,VARCHAR(50)并且由于人们添加前缀/后缀字符来指示状态,因此数据非常可怕;喜欢z343234意味着禁用。所以我试图在新系统中清理这些数据,并不允许以前的开发人员/业务分析师所做的变态。我不关心保存损坏的标志和其他数据,只关心数字部分。

我使用了许多不同的数据库引擎,我跟不上最新的习惯用法。

这些性能问题实际上是 10 年后需要关注的问题吗?

Mic*_*utz 5

博客

该帖子背后的逻辑是如此荒谬,值得讽刺的回答。

Oracle 执行“它是一个整数吗?” 在等待对磁盘的 I/O 调用以返回验证主键约束所需的数据时进行检查。

我相信这个性能增强是在 Oracle 版本 2 中实现的。

实际上,执行这种检查所需的时钟周期数微不足道,很容易隐藏在计算机正常运行的噪音中。即使在 VAX/VMS 上,您也可能无法测量性能差异。(远比“10 年”大得多)

INTEGER vs NUMBER vs PLS_INTEGER

正如你所看到INTEGERNUMBER(38,0)。应该没有可测量的性能差异。

当您谈论PLS_INTEGERvs时,可能会有所不同NUMBER。我见过的大多数证明这一点的基准都是计算密集型的。由于您没有使用此值进行微分方程,因此“性能增益”不适用于您的情况。

我建议你坚持INTEGERNUMBER(38,0)

数据模型建议

数字和标志应该在两个不同的列中。随意使用virtual column(第 3 列)取回原始字符串。我建议您将原始字符串值记录在“评论/注释”之类的字段中,以便人类可以搜索它,以防您的virtual column逻辑与人类实际输入的内容相匹配。