Oracle基於函式的索引

azzotest發表於2015-09-01
Oracle基於函式的索引
 
  比如執行如下一條SQL語句:select * from emp where upper(ename) = 'KING',即使在ename上建立了索引,還是會全表掃描emp表,將裡面的ename欄位改成大寫跟常量KING進行比較。如果我們建立一個基於函式的索引,比如:create index emp_upper_idx on emp(upper(ename)); 這個時候,我們只需要按區間掃描小部分資料,然後獲取rowid取訪問表中的資料,這個速度是比較快的。
 
      基於函式的索引,類似於普通的索引,只是普通的索引是建立在列上,而它是建立在函式上。當然這回對插入資料有一定影響,因為需要透過函式計算一下,然後生成索引。但是插入資料一般都是少量插入,而查詢資料一般資料量比較大。為了最佳化查詢速度,稍微降低點插入速度是可以承擔的。

      函式索引還有一個功能,只對部分行建立索引。假設有一個很大的表,有一列叫做FLAG,只可能取Y和N。假設大部分資料是Y,小部分資料是N,我們需要將N修改成Y。如果建立一個普通索引,這個索引會非常大,而且將N修改成Y的時候,維護這個索引開銷會很大。不過這個表聽起來比較適合點陣圖索引,但這是一個事物系統(OLTP),可能有很多人同時插入記錄,或者進行修改。那麼點陣圖索引也不適合。所以,如果我們只是在值為N的行上建立索引,就比較好辦了。
 
      只在值為N的行建立索引SQL:create index flag_index on big_table(case flag when 'N' then 'N' end);這樣一個索引大小會大大降低,而且維護成本也會很低的。前提是我們只對值為N的行感興趣。
 

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

相關文章