2012-02-17 76 views
0

我有一列定義爲數字(10,3),並且此列已編入索引。我想知道如果我把這個列轉換成一個整數,索引是否會更好地執行。我將不得不以10^7倍數,並在我的代碼中除以10^7。但我不知道是否有必要?什麼是浮點列上的oracle索引性能影響?

謝謝,

回答

4

這幾乎肯定不會有明顯的差異。

該索引可能稍微更緊湊,因爲整數表示可能略小於固定點表示。例如,數字1234需要3個字節的存儲空間,而數字1.234需要4個字節的存儲空間。有時候,反過來會是正確的,固定點值將需要更少的存儲空間,但整數表示的可能性會比反向值小100倍。你可以看到自己被填充表與前1個百萬個整數和第一百萬個整數雖然指數將是性能稍微更緊湊由1000

SQL> create table int_test(int_col number(38,0), fixed_col number(10,3)); 

Table created. 

SQL> insert into int_test 
    2 select level, level/1000 
    3  from dual 
    4 connect by level <= 1000000; 

1000000 rows created. 

SQL> select sum(vsize(int_col)) int_col_total_size, 
    2   sum(vsize(fixed_col)) fixed_col_total_size 
    3 from int_test; 

INT_COL_TOTAL_SIZE FIXED_COL_TOTAL_SIZE 
------------------ -------------------- 
      3979802    4797983 

SQL> ed 
Wrote file afiedt.buf 

    1 select count(*) int_larger_than_fixed 
    2 from int_test 
    3* where vsize(int_col) > vsize(fixed_col) 
SQL>/

INT_LARGER_THAN_FIXED 
--------------------- 
       8262 

SQL> ed 
Wrote file afiedt.buf 

    1 select count(*) fixed_larger_than_int 
    2 from int_test 
    3* where vsize(int_col) < vsize(fixed_col) 
SQL>/

FIXED_LARGER_THAN_INT 
--------------------- 
       826443 

分,那纔開始發揮作用,如果你對索引結構進行大範圍掃描或快速全掃描。索引中的整數值級別不太可能,因此單行查找只需要儘可能多的I/O。而且您很想在索引上執行大範圍掃描。數據更緊湊的事實也可能會增加某些塊的爭用。

因此,我的猜測是該索引在磁盤上使用的空間會稍少,但您很難注意到性能差異。如果您每次都進行額外的乘法和除法運算,那麼額外消耗的CPU可能會取消您可能獲得的任何邊際I/O優勢。如果您的應用程序恰好執行比平均速度更快的全面掃描索引,則可能會看到一些減少的I/O。