2015-04-15 112 views
0

我有一個查詢,如 select * from table1其中:iparam爲null或iparam = field1;帶有嵌套條件的Oracle索引

在field1上有一個非唯一索引,但oracle(11g)不想使用它。據我所知,它不是在運行時優化查詢,而是在編譯時。我在存儲過程中使用這樣的查詢。我想知道,如果有辦法告訴oracle,使用索引?

我知道「提示」,但我想在所有項目上使用某些優化器參數,以在運行時優化查詢。

+0

可能的重複這個http://stackoverflow.com/questions/29630354/stored-procedure-sql-execution-plan/29634329#29634329。 (問同一天) – ibre5041

回答

1

其中:IPARAM爲空或:IPARAM = FIELD1;

甲骨文沒有提前知道,如果你傳遞NULL值的方式:IPARAM 如果你這樣做,完全掃描訪問數據的最佳方式。如果你不這樣做,索引可能會更好。你可以使用IF將這個陳述分爲兩部分,那麼就不會有歧義。

如果你有很多字段要比較,動態sql migh是一個更好的方法。

IF :param1 IS NOT NULL THEN 
    v_sql := v_sql||' and field1 = :param1'; 
ELSE 
    v_sql := v_sql||' and nvl(:param1,1) = 1'; 
END IF; 

ELSE部分用於easyer使用USING。

+0

我的問題是,我有一個巨大的查詢,約30這樣的條件...你能給我和例子,如: select * from table 1 where(:param1 is null或:param1 = field1)和(:param2爲空或:param2 = field2)和(:param3爲null或:param3 = field3)和(:param4爲null或:param4 = field4) 我的任務是優化查詢... –

+0

編輯答案澄清。 – jva