2017-04-20 21 views
0

我有一個名爲t(abc varchar2(50),xyz varchar2(50),..etc)的表,並在列abc上啓用了索引。 Oracle使用索引userfunction(a)需要很長時間。這是一個動態查詢形成的可以有另一個條件,必須使用abc索引,所以我不想使用no_index提示。Oracle在sql查詢中沒有函數調用的索引

select *from t 
where 
userfunction(a) = 0 
and exists (select 1 from tab where t.abc='' ...etc) 
and ..etc 

我試圖通過移動功能,以嵌套查詢重新編寫與嵌套查詢的查詢,但甲骨文是重新書寫,並在第一仍在執行userfunction(a)和查詢花費很長一段時間。

select *from (
    select *from t 
    where 
    and exists (select 1 from tab where t.abc='' ...etc) 
    ..etc 
    ) 
userfunction(a) = 0 

也嘗試使用WITH子句,但沒有運氣。

任何想法的oracle不使用索引用戶函數調用或where子句中的某些條件?

+0

什麼是用戶功能? –

+2

'userfunction(a)'或'userfunction(abc)'?我不認爲問題在於Oracle使用索引來訪問數據。但也許它可以使用更合適的索引。這將有助於查看整個查詢。另外:'userfunction'是確定性的(即,如果我稱之爲明年,我是否會得到相同的結果)? –

+0

它是userfunction(abc)。這不是確定性的。基本上它是非常昂貴的功能,我希望這隻能在最後和子句中調用。 – user1181858

回答

0

您的查詢在邏輯上不一致:您參考表t和選項卡,但只能查詢t。假設你在寫選項卡時意味着t,我不明白爲什麼需要使用子查詢的exists子句。當子查詢中的表達式評估爲TRUE時,EXISTS將僅返回TRUE;那麼爲什麼不在t的主查詢中使用該表達式呢?