【问题标题】:oracle subquery in keyword is slow on 12c关键字中的 oracle 子查询在 12c 上很慢
【发布时间】:2023-03-18 05:20:01
【问题描述】:

相比11g,12c(目前使用12.1.0.2版本)在keyword中速度太慢了。

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

结果

  • 11g : 不到 1 秒

  • 12c:超过 10 秒

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

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 秒

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

结果

  • 11g : 不到 1 秒

  • 12c : 不到 1 秒

问题仅在“子查询中”。 INDEX 制作精良的两个表。 有人解决了这个问题吗?

【问题讨论】:

  • 问题不在 IN 子句中,但在此查询中可能是 SELECT OID FROM ID_TABLE WHERE(条件)。因此,为 ID_table 结构提供索引详细信息。表中有多少行,您可以尝试使用带 OID 的 DISTINCT 键。
  • 我现在无法提供结构,但我可以看出 SELECT OID FROM ID_TABLE WHERE(条件)与 11g 的响应速度相同。我会尝试 DISTINCT 关键字 tmrw 谢谢
  • 只是为了消除这种可能性,您能否将SELECT OID FROM ID_TABLE 替换为SELECT ID_TABLE.OID FROM ID_TABLE 并确认您获得相同的性能结果?
  • 我想我挖错了点。我发了新帖子,请检查一下。 stackoverflow.com/questions/34623779/

标签: oracle subquery


【解决方案1】:

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

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

【讨论】:

  • 你能证实这个说法吗?
  • 我会尝试阅读您的友好答案和文章。但仍然无法弄清楚为什么 12c 比 11g 慢得多。
  • 投了反对票,因为我相信你的说法已经过时了。您提供的链接是 2000 年的一个问题。今天,Oracle 足够聪明,可以在涉及的表大小允许时将 IN 重写为 EXISTS
  • 我想我挖错了点。我发了新帖子,请检查一下。 stackoverflow.com/questions/34623779/…
猜你喜欢
  • 2017-11-02
  • 2022-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 2018-06-12
  • 1970-01-01
相关资源
最近更新 更多