我正在使用 Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64 位生产,我正在尝试决定使用INTEGER或NUMBER将包含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)”,这是我已经知道的。我无法确定它是否与提出的可能的性能问题等效。
在Oracle文档说,
INTEGER,INT并且SMALLINT都映射到NUMBER(p,0)
因此,我打算NUMBER(38,0)像往常一样使用许多旧数据库和表,我正在从中导入数据,实际上将这些ID信息存储在 a 中,VARCHAR(50)并且由于人们添加前缀/后缀字符来指示状态,因此数据非常可怕;喜欢z343234意味着禁用。所以我试图在新系统中清理这些数据,并不允许以前的开发人员/业务分析师所做的变态。我不关心保存损坏的标志和其他数据,只关心数字部分。
我使用了许多不同的数据库引擎,我跟不上最新的习惯用法。
该帖子背后的逻辑是如此荒谬,值得讽刺的回答。
Oracle 执行“它是一个整数吗?” 在等待对磁盘的 I/O 调用以返回验证主键约束所需的数据时进行检查。
我相信这个性能增强是在 Oracle 版本 2 中实现的。
实际上,执行这种检查所需的时钟周期数微不足道,很容易隐藏在计算机正常运行的噪音中。即使在 VAX/VMS 上,您也可能无法测量性能差异。(远比“10 年”大得多)
正如你所看到INTEGER的NUMBER(38,0)。应该没有可测量的性能差异。
当您谈论PLS_INTEGERvs时,可能会有所不同NUMBER。我见过的大多数证明这一点的基准都是计算密集型的。由于您没有使用此值进行微分方程,因此“性能增益”不适用于您的情况。
我建议你坚持INTEGER或NUMBER(38,0)
数字和标志应该在两个不同的列中。随意使用virtual column(第 3 列)取回原始字符串。我建议您将原始字符串值记录在“评论/注释”之类的字段中,以便人类可以搜索它,以防您的virtual column逻辑与人类实际输入的内容相匹配。
| 归档时间: |
|
| 查看次数: |
5556 次 |
| 最近记录: |