【问题标题】:Oracle index with nested conditions具有嵌套条件的 Oracle 索引
【发布时间】:2015-06-21 08:50:08
【问题描述】:

我有一个查询,例如 select * from table1 where :iparam is null or iparam = field1;

在 field1 上有一个非唯一索引,但 oracle (11g) 不想使用它。据我了解,它不是在运行时优化查询,而是在编译时优化查询。我在存储过程中使用这样的查询。我想知道,是否有办法告诉 oracle 使用索引?

我知道“提示”,但我想在所有项目中使用一些东西,比如一些优化器参数,以优化运行时的查询。

【问题讨论】:

标签: oracle indexing oracle11g runtime


【解决方案1】:

执行计划不是在编译包的时候就确定的。它将在查询实际执行之前确定。

优化器如何决定运行查询取决于很多因素。最重要的是统计数据的可用性。这些给优化器一些东西。表中有多少条记录。索引中有多少个不同的值。

这是一篇更详细的文章: http://joco.name/2014/01/05/why-wouldnt-oracle-use-a-perfectly-valid-index/

【讨论】:

    【解决方案2】:

    其中 :iparam 为 null 或 :iparam = field1;

    Oracle 无法提前知道您是否将为 :iparam 传递 NULL 值 如果这样做,则完全扫描是访问数据的最佳方式。如果你不这样做,索引可能会更好。你可以用 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。

    【讨论】:

    • 我的问题是,我有一个巨大的查询,有大约 30 个这样的条件......你能给我举个例子吗,比如: select * from table 1 where (:param1 is null or :param1 = field1) and (:param2 is null or :param2 = field2) and (:param3 is null or :param3 = field3) and (:param4 is null or :param4 = field4) 我的任务是优化这样的查询。 .
    • 已编辑答案以澄清。
    猜你喜欢
    • 2023-04-04
    • 2011-03-24
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 2012-08-24
    相关资源
    最近更新 更多