对于Oracle中的NUMBER列,是否指定长度帮助性能?

时间:2010-11-15 23:17:20

标签: sql oracle

NUMBER,NUMBER(3)和NUMBER(10)之间的表现是否有任何真正的差异? RDBMS是否不使用32位来存储值,而只是在看作字符串时限制数据的长度?

一位同事辩论说,使用NUMBER(10)和NUMBER / NUMBER(11)会更有效率,认为 n 是字节数而不是长度字符数据。通常我同意在保证行数不超过10 ^ n左右的情况下限制列大小,但是对于这个特定的数据库,行数的限制实际上是“尽可能多”,例如2 ^ 32或〜40亿,即使我们永远不会达到这个数额。提出这种情况的“最低最大值”似乎毫无意义,浪费时间,我认为使用NUMBER而不指定长度会更简单并且不会受到惩罚。我是对的吗?

3 个答案:

答案 0 :(得分:11)

从技术上讲,您没有定义长度,而是定义精度和比例。

相同的数值(例如100,4.3)采用相同的内部值,无论定义列的精度和比例如何。

列可以容纳的最大值由BOTH精度和比例确定。也就是说,您可以将值100存储在NUMBER(3,0)列中,但不能存储在NUMBER(3,1)列中。

通常,如果列不存储小数,则比例应为零。请记住,如果您尝试将10.12存储在NUMBER(3,0)中,它将存储值10.它不会出错(因为如果确实如此,您将很难存储三分之一的值)任何东西)。如果您希望它出错,您希望允许更高的比例并使用约束来阻止它被使用。

我也相信你也应该尝试使用'合理'的精确度。如果你在一千年内每秒存储一千个值,你仍然适合14位数。如果我看到一列NUMBER(14,0),那么我知道在我的屏幕或打印输出上我应该允许显示14个数字字符。如果我只看到NUMBER或NUMBER(38,0),那么我没有得到任何指导,可能会猜到14个字符。如果他们开始在那里放16个字符的信用卡号码,我就错了。这就是为什么我不想猜测。

同样在PL / SQL中,它们的PLS_INTEGER数据类型最多可达2147483647.如果我看到NUMBER(9,0)列,我知道我可以将它放入PLS_INTEGER中。当他们想要确定在将数据提取/推送到数据库时使用的数据类型,规模和精度时,可能会对Java或.Net等进行类似的考虑。

答案 1 :(得分:8)

使用NUMBER(1)NUMBER(10)时没有任何区别。存储要求是相同的,取决于您存储在其中的数据。

唯一可能的性能差异在NUMBER()NUMBER(N)之间,因为后者必须在存储时检查大小。但这是微不足道的,甚至可能无法衡量。

答案 2 :(得分:4)

关于32位 - 没有。在Oracle中,NUMBER类型是一个可变长度的基数为10的浮点值,保证精度为38位。请参阅the Oracle docsthis AskTom question

< 肥皂盒>

事实上,我认为NUMBER实际上是Oracle中 The Best Things 之一。我读过这样的说法:“任何需要开发人员知道并关心数字变量中位数的产品(语言,数据库等)都不适合业务编程”并完全同意。编写会计软件的人有没有的理由来说明他们的值是否适合32位缩放的小数,或双倍长度的ANSI浮点数是否会导致问题(他们会),或围绕计算机中数字问题的无数其他问题。数字太重要了,不能太高效。因人而异。

< /肥皂盒>

分享并享受。