2015-04-15 54 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