我有一個查詢,如 select * from table1其中:iparam爲null或iparam = field1;帶有嵌套條件的Oracle索引
在field1上有一個非唯一索引,但oracle(11g)不想使用它。據我所知,它不是在運行時優化查詢,而是在編譯時。我在存儲過程中使用這樣的查詢。我想知道,如果有辦法告訴oracle,使用索引?
我知道「提示」,但我想在所有項目上使用某些優化器參數,以在運行時優化查詢。
我有一個查詢,如 select * from table1其中:iparam爲null或iparam = field1;帶有嵌套條件的Oracle索引
在field1上有一個非唯一索引,但oracle(11g)不想使用它。據我所知,它不是在運行時優化查詢,而是在編譯時。我在存儲過程中使用這樣的查詢。我想知道,如果有辦法告訴oracle,使用索引?
我知道「提示」,但我想在所有項目上使用某些優化器參數,以在運行時優化查詢。
執行計劃是在包編譯時確定的。它將在查詢實際執行之前確定。
優化程序如何決定運行查詢取決於很多事情。首先是統計數據的可用性。這些優化器可以繼續。表中有多少條記錄。索引中有多少個不同的值。
下面是進入更詳細地文章: http://joco.name/2014/01/05/why-wouldnt-oracle-use-a-perfectly-valid-index/
其中: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。
我的問題是,我有一個巨大的查詢,約30這樣的條件...你能給我和例子,如: select * from table 1 where(:param1 is null或:param1 = field1)和(:param2爲空或:param2 = field2)和(:param3爲null或:param3 = field3)和(:param4爲null或:param4 = field4) 我的任務是優化查詢... –
編輯答案澄清。 – jva
可能的重複這個http://stackoverflow.com/questions/29630354/stored-procedure-sql-execution-plan/29634329#29634329。 (問同一天) – ibre5041