ITPUB??ì3
ITPUB论坛 » Oracle专题深入讨论 » 偷偷问一个自己想不明白的问题(关于number类型的存储机制)

标题: 偷偷问一个自己想不明白的问题(关于number类型的存储机制)
离线 超级野人
老会员



精华贴数 2
个人空间 0
技术积分 2000 (783)
社区积分 13 (9044)
注册日期 2002-11-20
论坛徽章:1
会员2006贡献徽章     
      

发表于 2008-5-8 11:29 
偷偷问一个自己想不明白的问题(关于number类型的存储机制)

发现再oracle中number的存储并不是按照c语言的相应的数字格式来存储,而是经过一定的规则“翻译”成相应的2进制格式来存储。我就奇怪了,为什么不直接转换,而是按照自己的规则来“翻译”存储,我的意思,oracle中的数据类型完全可以按照c语言中相应的数据格式来存储呀,比如: __int 8,__int16,__int 32,float,double等等,这样在查询,运算时候可以完全不用再把存储单元中的数据“翻译“成数字,不是更加方便么?虽然oracle中的number类型要对应c语言中的多个类型,但是既然都要经过“翻译“,转换成c语言的数据格式只用“翻译”一次,而现在的方式是存储的时候“翻译”一次,取数据的时候再“翻译”一次(还愿为相应的原始数字),不是更加麻烦么?


__________________
我是野人我怕谁,我的qq:574674565
只看该作者    顶部
离线 Yong Huang
版主



精华贴数 2
个人空间 0
技术积分 3994 (347)
社区积分 120 (3015)
注册日期 2001-10-9
论坛徽章:6
现任管理团队成员ITPUB元老管理团队2006纪念徽章会员2006贡献徽章授权会员2008年新春纪念徽章
      

发表于 2008-5-9 04:59 
Oracle uses "binary coded decimal" (BCD). According to
http://en.wikipedia.org/wiki/Binary-coded_decimal
"Its main virtue is that it allows easy conversion to decimal digits for printing or display and faster decimal calculations. Its drawbacks are the increased complexity of circuits needed to implement mathematical operations and a relatively inefficient encoding"

If Oracle were to start over, would they still use BCD? Probably not. They originally chose it, well, we can say, for historical reason.

Those studying computer science can tell us more.

Yong Huang


只看该作者    顶部
离线 晶晶小妹
月是上弦


精华贴数 3
个人空间 5970
技术积分 1731 (941)
社区积分 9 (11458)
注册日期 2008-2-15
论坛徽章:4
现任管理团队成员2008北京奥运纪念徽章:跳水2008北京奥运纪念徽章:体操数据库板块每日发贴之星  
      

发表于 2008-5-9 14:30 
我觉得可能是Oracle想提高NUMBER型的精度。并且,用软件实现的数据类型,在软件内部可以对此数据类型有更多的控制。BINARY_FLOAT和BINARY_DOUBLE是硬件型的数据类型。速度比NUMBER快,但精度不如NUMBER


__________________
没有必胜的秘籍,没有方程式遵循
要赢~只有全身心的投入!



为了方便大家查阅,所有的文章都已转入空间

http://space.itpub.net/?13095417

请大家多多支持!
只看该作者    顶部
离线 Yong Huang
版主



精华贴数 2
个人空间 0
技术积分 3994 (347)
社区积分 120 (3015)
注册日期 2001-10-9
论坛徽章:6
现任管理团队成员ITPUB元老管理团队2006纪念徽章会员2006贡献徽章授权会员2008年新春纪念徽章
      

发表于 2008-5-10 01:29 
晶晶小妹, do you have performance comparison between number and binary_float, binary_double? Thanks.

Yong Huang


只看该作者    顶部
离线 zhaolinjnu
丹臣


精华贴数 0
个人空间 0
技术积分 1938 (815)
社区积分 13 (9227)
注册日期 2006-3-10
论坛徽章:5
现任管理团队成员参与2007年甲骨文全球大会(中国上海)纪念会员2007贡献徽章生肖徽章2007版:鼠ITPUB新首页上线纪念徽章 
      

发表于 2008-5-12 14:31 
使用一个统一的number类型,对用户来说,不是很方便吗?

如果要让许多用户搞懂一大堆各种不同的数字类型的区别,可能会比较难,很容易因为考虑不周,使用了长度不够的数据类型。

ORACLE这么做提高了数据类型使用的易用性,可能牺牲了一些性能(我没有实际测试过)


__________________
--------------------------------------------------------
路漫漫其修远兮,吾将上下而求索

我的blog:Data & Architecture DBA
http://zhaolinjnu.blog.sohu.com

TAOBAO DBA TEAM BLOG
只看该作者    顶部
离线 honggazi
SAP-FI
无敌新人


来自 黑龙江
精华贴数 0
个人空间 0
技术积分 1409 (1177)
社区积分 3598 (367)
注册日期 2006-4-11
论坛徽章:1
授权会员     
      

发表于 2008-5-12 16:08 
学习


只看该作者    顶部
离线 晶晶小妹
月是上弦


精华贴数 3
个人空间 5970
技术积分 1731 (941)
社区积分 9 (11458)
注册日期 2008-2-15
论坛徽章:4
现任管理团队成员2008北京奥运纪念徽章:跳水2008北京奥运纪念徽章:体操数据库板块每日发贴之星  
      

发表于 2008-5-13 23:37 
建一个表:
create table nfd (n number, f binary_float, d binary_double);

插入一些行:
insert /*+append*/ into nfd select rownum,rownum,rownum from dba_objects;
commit;
insert /*+append*/ into nfd select rownum+11372,rownum+11372,rownum+11372 from dba_objects;
commit;
insert /*+append*/ into nfd select rownum+22748,rownum+22748,rownum+22748 from dba_objects;
commit;
sid=39 pid=18> select count(*) from nfd;
  COUNT(*)
----------
     34110
总共有34110行。

打开计时:
set timing on

我先试验了求和:
sid=39 pid=18> select sum(n*n) from nfd;
  SUM(N*N)
----------
1.3232E+13
已用时间:  00: 00: 00.03
执行多次上面的命令后,时间稳定在0.03秒。
对其他两列也做同样的运算,时间差不多。可能是行太少,差别不明显,把操作换成复杂点的:

sid=39 pid=18> select sum(ln(n)) from nfd;
SUM(LN(N))
----------
321915.626
已用时间:  00: 00: 02.74
NUMBER型的列用时2.74秒。

sid=39 pid=18> select sum(ln(f)) from nfd;
SUM(LN(F))
----------
3.219E+005
已用时间:  00: 00: 00.04
binary_float型的列用时0.04秒。
binary_double型的列也是0.04秒。


__________________
没有必胜的秘籍,没有方程式遵循
要赢~只有全身心的投入!



为了方便大家查阅,所有的文章都已转入空间

http://space.itpub.net/?13095417

请大家多多支持!
只看该作者    顶部
离线 Yong Huang
版主



精华贴数 2
个人空间 0
技术积分 3994 (347)
社区积分 120 (3015)
注册日期 2001-10-9
论坛徽章:6
现任管理团队成员ITPUB元老管理团队2006纪念徽章会员2006贡献徽章授权会员2008年新春纪念徽章
      

发表于 2008-5-14 04:53 


QUOTE:
原帖由 晶晶小妹 于 2008-5-13 09:37 发表
...
sid=39 pid=18> select sum(ln(n)) from nfd;
SUM(LN(N))
----------
321915.626
已用时间:  00: 00: 02.74
NUMBER型的列用时2.74秒。

sid=39 pid=18> select sum(ln(f)) from nfd;
SUM(LN(F))
----------
3.219E+005
已用时间:  00: 00: 00.04
binary_float型的列用时0.04秒。
binary_double型的列也是0.04秒。

Thanks for the test. It's quite impressive. I'll remember to use binary_float and binary_double when the app needs fast computation.

For completeness, Note:311971.1 talks about the performance enhancement of these data types new in 10g. Note:291024.1 says the two data types can't be exported by the old export tool (exp) when transporting a tablespace and expdp must be used. I'm not sure if there's any other limitation. If anybody finds any, please post a message to this thread.

Yong Huang


只看该作者    顶部
离线 wisdomone1
圣甲会员
希望会员


精华贴数 0
个人空间 0
技术积分 2359 (655)
社区积分 60 (4359)
注册日期 2007-3-15
论坛徽章:4
授权会员数据库板块每日发贴之星数据库板块每日发贴之星数据库板块每日发贴之星  
      

发表于 2008-5-22 00:07 
学习.


只看该作者    顶部
离线 huanhuanlove



精华贴数 0
个人空间 0
技术积分 2 (224020)
社区积分 0 (1778075)
注册日期 2008-5-22
论坛徽章:0
      
      

发表于 2008-5-22 17:54 
版主英文水平真牛。。。。


只看该作者    顶部
相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问