我有一个查询,类似于 select * from table1其中:iparam为null或iparam = field1;
在field1上有一个非唯一索引,但oracle(11g)不想使用它。据我所知,它不是在运行时优化查询,而是在编译时。我在存储过程中使用此类查询。我想知道,如果有办法,告诉oracle,使用索引?
我知道“提示”,但我想在所有项目中使用某些东西,比如一些优化器参数,以便在运行时优化查询。
答案 0 :(得分:1)
其中:iparam为null或:iparam = field1;
Oracle无法提前知道您是否将传递NULL值:iparam 如果这样做,全扫描是访问数据的最佳方式。如果不这样做,索引可能会更好。您可以使用IF将此语句拆分为两部分,然后就不会产生歧义。
如果要比较很多字段,动态sql可能是更好的方法。
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部分用于轻松使用USING。
答案 1 :(得分:0)
在程序包编译时确定执行计划是不正确的。它将在查询实际执行之前确定。
优化程序如何决定运行查询取决于很多事情。最重要的是统计数据的可用性。这些为优化器提供了一些东西。表中有多少条记录。索引中有多少个不同的值。
这是一篇更详细的文章: http://joco.name/2014/01/05/why-wouldnt-oracle-use-a-perfectly-valid-index/