Oracle mutliple左外部仅联接max()行

时间:2018-11-29 15:18:31

标签: oracle join optimization subquery max

我有一条语句经常被安静地使用,但是表现却很差。 所以我想尽可能地优化它。该声明由各个部分和联合组成。

以下是非常昂贵的一部分。

select * 
from rc050 F
LEFT OUTER JOIN
    (SELECT fi_nr,
      fklz,
      rvc_status,
      lfdnr,
      txt
    FROM rc0531 temp
    WHERE lfdnr =
      (SELECT MAX(lfdnr) FROM rc0531 WHERE fi_nr = temp.fi_nr AND fklz = temp.fklz
      )
    ) SUB_TABLE1
  ON F.fklz   = SUB_TABLE1.fklz
  AND F.fi_nr = SUB_TABLE1.fi_nr
LEFT OUTER JOIN
    (SELECT fi_nr,
      fklz,
      rvc_status,
      lfdnr,
      txt
    FROM rc0532 temp
    WHERE lfdnr =
      (SELECT MAX(lfdnr) FROM rc0532 WHERE fi_nr = temp.fi_nr AND fklz = temp.fklz
      )
    ) SUB_TABLE2
  ON F.fklz   = SUB_TABLE2.fklz
  AND F.fi_nr = SUB_TABLE2.fi_nr
LEFT OUTER JOIN
    (SELECT fi_nr,
      fklz,
      rvc_status,
      lfdnr,
      txt
    FROM rc05311 temp
    WHERE lfdnr =
      (SELECT MAX(lfdnr)
      FROM rc05311
      WHERE fi_nr = temp.fi_nr
      AND fklz    = temp.fklz
      )
    ) SUB_TABLE11
  ON F.fklz   = SUB_TABLE11.fklz
  AND F.fi_nr = SUB_TABLE11.fi_nr
where F.fklz != ' '

这是我必须从这些rc0531 ... rc05311表中加载的部分 最新的条目是什么。这些表共有11个,因此已细分。 如您所见,我当前正在通过子查询连接每个表,并且只需要最新的条目,因此我需要一个额外的子查询来获取max(lfdnr)。

到目前为止,这一切都很好,但是我想知道是否有更有效的方法来执行此操作。

在我的主要选择中,我需要能够处理这些表中每个表的每一列。

你们有什么建议吗?

目前,它在1.3万秒内对13k行进行了运行,以获得不错的提升,该速度应降至0.1秒左右。再次,这只是在充满无效声明的较大语句中的一个问题。

2 个答案:

答案 0 :(得分:1)

不可能优化SQL 查询。 Oracle将接受您的查询,并确定用于确定所需信息的执行计划。您可能会完全重写查询,并且如果它导致相同的执行计划,您将获得完全相同的性能。要调整查询,您需要确定execution plan

根据这些表的选择性,您可能会受益于这些表(在(fi_nr, fklz)列或什至在(fi_nr, fklz, lfdnr)上的索引)。无法从这些信息中预先告知,您只需要尝试即可。

您还应该删除select *并仅选择所需的列。如果可以从索引中仅获取所需的信息,则Oracle无需检索实际的表行。

答案 1 :(得分:0)

从替换左连接:

const a = new function () {
  this.greeting = 'Hello'
  this.greet = this.greeting + ' John'
}()

console.log(a.greet)

对此:

LEFT OUTER JOIN (
    SELECT fi_nr,fklz,rvc_status,lfdnr,txt FROM rc0531 temp
    WHERE lfdnr = (SELECT MAX(lfdnr) FROM rc0531 WHERE fi_nr = temp.fi_nr AND fklz = temp.fklz)
    ) SUB_TABLE1
  ON F.fklz   = SUB_TABLE1.fklz
  AND F.fi_nr = SUB_TABLE1.fi_nr

让我知道是否可以达到0.1秒,我想它会成功

相关问题