我有一个查询,如 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