zoukankan      html  css  js  c++  java
  • 对oracle数字类型的研究

        Oracle的数字类型主要有number,binary_float,binary_double三类,其他的像int,number(p,s)等等大多数都是由这些引申出来的。这部分的理解主要来自oracle11g编程艺术。

        其中提到的一个很有意思的东西就是number是软件模拟运算,而binary类型则是硬件直接运算,所以在性能方便的差距还是很大的,我们以事实说话。

       

     SELECT * FROM NUMTABLE;

    里面的数字是1----77760,类型分别为number,binary_float,binary_double。

    我们做如下运算:

    SELECT SUM(LN(NUM_TYPE)) FROM NUMTABLE;

    第一次执行花费时间:4.384s     第二次执行:3.884s

    SELECT SUM(LN(float_type)) FROM NUMTABLE;

    第一次执行花费时间:0.125s     第二次执行:0.078s

    结论:可以直观的看出两个数字类型在处理方便的性能差距,还是很明显的,性能差距在50倍以上。

    但是我们不要高兴的太早了,binary类型的缺点就是精度太低,所以如果是对数据精度有很高的要求,就不能用了。

    举例:

    create table numtable2 (
    num_type number,
    float_type binary_float,
    double_type binary_float);

    insert into numtable2 values(1234567890.0987654321,1234567890.0987654321,1234567890.0987654321);

    commit;

    SELECT * FROM NUMTABLE2;

    NUM_TYPE                     |FLOAT_TYPE                  |DOUBLE_TYPE
    ---------------------- ---|--------------------- ----|--------------------
    12,3456,7890.09876543 |12,3456,7940.00000000|12,3456,7940.00000000

    那么,有没有一种适中的方法,玩么解决呢?在oracle11g编程艺术中,提出了CAST,自己测试了,虽然cast将number强制转换为binary得到了结果,但是和number运算的结果还是有细小的差异的,看来金融方面还是不能适用。

    文章中有问题的地方还请大家指正,共同进步。

    Email:goodboybing@163.com

  • 相关阅读:
    jvm误区--动态对象年龄判定
    jmeter入门实例
    七牛云的文件上传和下载
    layer.prompt添加多个输入框
    zero copy图解
    java枚举的线程安全及序列化
    java单例模式
    ubuntu16.04 python3.5 opencv的安装与卸载(转载)
    独家git clone 加速方法
    apt get update无法正常使用解决方案(转载)
  • 原文地址:https://www.cnblogs.com/leafcb/p/3708884.html
Copyright © 2011-2022 走看看