关键字中的oracle子查询在12c上很慢

时间:2016-01-05 10:47:17

标签: oracle subquery

与11g相比,12c(目前使用12.1.0.2版本)的关键字非常慢。

SELECT * FROM 
    DATA_TABLE WHERE
    OID IN (
        SELECT OID FROM ID_TABLE WHERE (condition)
    )

结果

  • 11g:1秒内

  • 12c:超过10秒

以下查询在11g和12c中都足够快(让你知道真正的问题是在子查询'查询中

SELECT OID FROM ID_TABLE WHERE (condition)

我可以通过更改查询解决此问题,如下所示

SELECT * FROM 
    DATA_TABLE D,
    (
        SELECT OID FROM ID_TABLE WHERE (condition)
    ) O
WHERE D.OID = O.OID

结果

  • 11g:1秒内

  • 12c:1秒内

OR

SELECT * FROM 
    DATA_TABLE WHERE
    OID IN (
        "AA", "BB", "CC", "DD, "EE"
    )

结果

  • 11g:1秒内

  • 12c:1秒内

问题仅出现在子查询'中。 INDEX很好地制作了两个表。 有人解决了这个问题吗?

1 个答案:

答案 0 :(得分:0)

你必须提供解释计划,以更好地评估为什么一个人的表现比另一个好。但是,通常情况下,通过将IN条件更改为EXISTS条件,您可以为此类查询获得更好或至少更具可预测性的结果:

select *
  from data_table t1
 where exists (select null
                 from id_table t2
                where t2.oid = t1.oid
                  and (other conditions))