2013-10-09 163 views
0

我經常運行這個查詢,我想優化它。查詢優化和級聯

select 
    number || ' ' || name 
from tasks 
where upper(number || ' ' || name) like '%VALUE%' 

我創建了一個指標,但它採取了同樣的時間,而不指數

create index name on tasks (upper(number || ' ' || name)) 

是否還有其他選擇嗎?

+0

你檢查查詢計劃?索引是否被使用? – mustaccio

+0

該索引未被使用 – user49126

+3

該索引不會被使用,因爲您在VALUE之前有一個百分比,您正在強制進行全面掃描,並且您無法對此進行多少處理。無論如何,你爲什麼連接在一起? VALUE是什麼樣的值,並且你是否將它連接起來?你爲什麼要在字符串的任何位置查找VALUE? – Ben

回答

2

如果你確定條件有足夠的選擇性使用索引,然後來證明你可能想嘗試促進與下面的index fast full scan

select /*+ INDEX_FFS(tasks your_index_name) */ 
     number || ' ' || name 
from tasks 
where upper(number || ' ' || name) like '%VALUE%' 

編輯:

我似乎記得推廣IFFS的另一種方式是:

select number || ' ' || name 
from tasks 
where rowid in (
     select rowid 
     from tasks 
     where upper(number || ' ' || name) like '%VALUE%') 

令人驚訝的是,前者的效率幾乎沒有那麼低。