【发布时间】:2019-02-13 12:50:55
【问题描述】:
我有两个结构如下的表
INPUTFILELOG 列为
FILE_ID
RECORD_SEQ
ACCOUNT
CHILD_ACCOUNT
PURGE 列为
ACCOUNT
DATE
DETAILS
查询
delete from INPUTFILELOG il
where exists
( select 1 from PURGE po
where po.account = ':NUMBER'
and ( po.account = il.account OR po.account = il.child_account ) )
即使 PURGE.ACCOUNT 和 INPUTFILELOG.ACCOUNT 和 INPUTFILELOG.CHILD_ACCOUNT 上有索引,上述查询的性能也很差。有人可以 请帮忙?
更新
我尝试了以下查询。它看起来不错吗?有没有更好的处理方法?
delete from INPUTLOG sif
where exists
( select t.fileno, t.rec
from ( SELECT sif2.FILE_ID as fileno, sif2.RECORD_SEQ as rec
FROM purge po
INNER JOIN INPUTLOG sif2
ON ( po.ACCOUNT = sif2.ACCOUNT
OR po.ACCOUNT = sif2.CHILD_ACCOUNT )
where po.account = ':NUMBER' ) t
WHERE sif.FILE_ID = t.FILEno
AND sif.record_seq = t.rec)
【问题讨论】:
-
请将代码格式化为代码。看看你的其他帖子如何做到这一点。
-
嗨 Ram,一些提示:1)如果您将删除转换为选择和检查,这是否也需要时间 - 在这种情况下,这很好地表明查询肯定是坏的,否则还有有可能是删除操作需要时间,而不是查询的错误。 2)这个糟糕的查询实际上删除了多少数据,那么大吗? 3)发布查询的执行计划并验证是否有改进的机会。
-
嗨,我错过了一些要点 1) 当只包含一个条件(在 OR 中)时,查询性能会提高。如果两者都包括在内,则会发生 INPUTFILELOG 的全表扫描。 2) 对于作为主变量传递的每个帐户,大约有 100 条记录被删除。 3 ) 相同的查询在 DB2 上运行良好。
-
account对于purge表来说是唯一的还是可以有重复的? -
是的帐户在清除表中是唯一的
标签: oracle performance indexing