加快oracle sql删除查询[重复]
Posted
技术标签:
【中文标题】加快oracle sql删除查询[重复]【英文标题】:Speed up a oracle sql delete query [duplicate] 【发布时间】:2014-06-21 13:08:02 【问题描述】:我想知道这个查询的最佳替代查询是什么。 (从性能方面)
delete from CDR where anum not in (select msisdn from subs)
or bnum not in (select msisdn from subs)
此外,如果您可以引入多个可以以相同方式工作的查询,那就太好了。请注意 anum 和 bnum 不能为空。
【问题讨论】:
你的索引是什么? 如果您想要更快地删除并在之后重新创建它们,通常您会放弃约束。 索引在subs(msisdn)、CDR(anum)和CDR(bnum)上。 您当前的查询速度慢吗? 可能重复***.com/q/3672285/1741542 【参考方案1】:也许是这个:
delete from
(select cdr.*
from cdr
left outer join subs a on a.msisdn = cdr.anum
left outer join subs b on b.msisdn = cdr.bnum
where a.msisdn is null or b.msisdn is null);
或
delete from cdr
where rowid <>all
(select cdr.rowid
from cdr
join subs a on a.msisdn = cdr.anum
join subs b on b.msisdn = cdr.bnum)
或
delete from cdr
where not exists
(select 'x'
from cdr
join subs a on a.msisdn = cdr.anum
join subs b on b.msisdn = cdr.bnum)
问题是你查询的是不存在的东西,因此总是很难 使用索引。
【讨论】:
您的查询不等同于 OP 的 你确定吗?我认为期望的结果是相同的。 Ali 希望删除所有主叫方电话号码或被叫方电话号码不属于所有用户电话号码的所有计费数据记录。此查询中的所有列都不是 NULL,如果它们正确地模拟现实。 考虑当 anum 在 subs 中时的情况,而 bnum 不在(现在不谈论空值)。原始查询将删除此行(由于 OR 条件),您的not exists
不会(因为 select 'x' from subs where msisdn in (anum, bnum)
返回 1 行用于 anum)
你说得对,我修改了我的说法。但是,我不认为它比最初的更快。
那么这个问题的有效查询是什么?是否可以在两个不同的查询中更改它?我的意思是一个查询将是您提到的第一个(您编辑的那个)和第二个用于删除具有@Wernfried 提到的条件的行。以上是关于加快oracle sql删除查询[重复]的主要内容,如果未能解决你的问题,请参考以下文章