測試NUMBER型別的效能

oracle_db發表於2012-05-31
Oracle NUMBER 型別使用的CPU 時間遠高於浮點數型別。從NUMBER 型別得到的答案比從浮點數得到的答案“精確“得多。但是如果你在對科學資料執行資料探勘或進行復雜的數值分析,這種精度損失往往是可以接受的,另外可能會得到非常顯著的效能提升。


測試:

建立測試表
SQL> drop table t;

Table dropped.

SQL> create table t(num_type number,
  2  float_type binary_float,
  3  double_type binary_double)
  4  /

Table created.
匯入測試資料
SQL> insert /*+ append */ into t
  2  select rownum,rownum,rownum
  3  from all_objects;

50193 rows created.

SQL> commit;

Commit complete.

SQL> alter session set events '10046 trace name context forever,level 12';

Session altered.

對列進行相同操作
SQL> select sum(ln(num_type)) from t;

             SUM(LN(NUM_TYPE))
------------------------------
                        493084

SQL> select sum(ln(float_type)) from t;

SUM(LN(FLOAT_TYPE))
-------------------
         4.931E+005

SQL> select sum(ln(double_type)) from t;

SUM(LN(DOUBLE_TYPE))
--------------------
          4.931E+005

SQL> 
檢視10046對應報告

select sum(ln(num_type)) 
from
 t


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        2      1.03       1.01          0        171          0           1
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        4      1.04       1.01          0        171          0           1

select sum(ln(float_type)) 
from
 t


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.01       0.01          0          1          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        2      0.05       0.05          0        170          0           1
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        4      0.07       0.07          0        171          0           1

select sum(ln(double_type)) 
from
 t


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          1          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        2      0.05       0.05          0        170          0           1
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        4      0.06       0.06          0        171          0           1

但這並不是說就不要使用NUMBER型別,只是在對NUMBER型別進行大的計算時,可以改寫為其它方法,如使用 CAST,


select sum(ln(cast( num_type as binary_double ) )) 
from
 t


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.01       0.01          0          1          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        2      0.07       0.07          0        170          0           1
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        4      0.09       0.09          0        171          0           1

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15720542/viewspace-731545/,如需轉載,請註明出處,否則將追究法律責任。

相關文章