代码之家  ›  专栏  ›  技术社区  ›  Jake Petroules

对于Oracle中的数字列,指定长度是否有助于提高性能?

  •  8
  • Jake Petroules  · 技术社区  · 15 年前

    数字、数字(3)和数字(10)在性能上真的有什么区别吗?难道RDBMS不使用32位来存储值,而只是在将数据看作字符串时限制数据的长度吗?

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

    3 回复  |  直到 15 年前
        1
  •  11
  •   Gary Myers    15 年前

    从技术上讲,你不定义长度,而是定义精度和刻度。

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

    列可以容纳的最大值是由精度和规模决定的。也就是说,可以将值100存储在数字(3,0)列中,但不能存储在数字(3,1)列中。

    通常,如果列不应该存储小数,那么小数位数应该为零。记住,如果您试图将10.12存储在一个数字(3,0)中,它将存储值10。它不会出错(因为如果出错了,你很难在任何东西中存储三分之一的值)。如果你想让它出错,你需要允许更高的比例,并使用一个约束来停止它的使用。

    我也相信你应该试着使用一个“合理”的精度。如果你在一千年中每秒存储一千个值,你仍然可以在14位之内。如果我看到一列数字(14,0),那么我知道在我的屏幕或打印输出中应该允许显示14个数字字符。如果我只看到数字或数字(38,0),那么我还没有得到任何指导,可能会猜出14个字符。如果他们把16个字符的信用卡号码放进去,我就错了。所以我不喜欢猜测。

    同样在PL/SQL中,它们有一个PLS_INTEGER数据类型,其值高达2147483647。如果我看到一列数字(9,0),我知道我可以把它放入一个PLS_整数。当Java或.Net等应用程序想要确定将数据拉入/推送到数据库时要使用的数据类型、规模和精度时,可能会有类似的考虑。

        2
  •  8
  •   Wolph    15 年前

    你用什么都没关系 NUMBER(1) 或 NUMBER(10) . 存储需求是相同的,取决于存储在其中的数据。

    性能上唯一可能的区别是 NUMBER() 和 NUMBER(N) 因为后者在存储时必须检查大小。但这是如此微不足道,甚至可能是无法衡量的。

        3
  •  4
  •   Bob Jarvis - Слава Україні    15 年前

    对于Oracle中的32位数字,数字类型是一个可变长度的基10浮点值,保证精度为38位。见 the Oracle docs 和 this AskTom question .

    < 肥皂盒 >

    事实上,我认为数字实际上是 最好的东西 在甲骨文里。我读过一个真理,大意是“任何产品(语言、数据库等)需要开发人员知道和关心数字变量中的位数都不适合商业编程”,并完全同意这一点。有 不 有人在编写会计软件时,会对其值是否适合32位小数、双长度ANSI浮点是否可能导致问题(他们会)或围绕计算机中的数字问题的无数其他问题发出嘘声的原因。数字太重要了,没有效率可言。YMMV公司。

    < /肥皂盒 >

    分享和享受。