我有一条语句经常被安静地使用,但是表现却很差。 所以我想尽可能地优化它。该声明由各个部分和联合组成。
以下是非常昂贵的一部分。
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秒左右。再次,这只是在充满无效声明的较大语句中的一个问题。
答案 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秒,我想它会成功