【发布时间】:2018-01-06 12:00:06
【问题描述】:
我一直在处理一个运行缓慢的查询,类似于以下内容
select
count(*)
from
a
join b
on a.akey = b.akey
join c
on b.bkey = c.bkey
left join d
on c.ykey = d.ykey
and b.xkey = d.xkey
where
a.idkey = 'someid'
这个查询需要 130 秒才能运行 'someid'
如果我删除左连接的任一条件,查询将在
我已确定此特定记录 (someid) 的问题。有大量匹配的 d.xkey 值(~5 000 000)。我已经进行了一些测试,并将此记录的相关 d.xkey 值修改为更多唯一值,从而将运行时间缩短到
这是我目前正在使用的修复程序。
select
count(*)
from
a
join b
on a.akey = b.akey
join c
on b.bkey = c.bkey
left join d
on c.ykey = d.ykey
where
a.idkey = 'someid'
and (
b.xkey = d.xkey
OR b.xkey is null
OR not exists (
select
dd.xkey
from
d dd
where
dd.xkey = b.xkey
and dd.ykey = c.ykey
)
)
此查询运行时间不到 1 秒。
我的问题是,为什么这比左连接快这么多?
就结果而言,我的新查询是否与旧查询相同?
【问题讨论】:
-
请出示解释计划。 orafaq.com/wiki/Explain_Plan
-
两个查询的 SQL 监视器报告将比解释计划更有益。 oracle.com/technetwork/database/manageability/…
-
@BobC - 毫无疑问,但是 SQL Monitor 需要 Oracle Tuning Pack,这是企业版的额外收费。除非您确定他们为获得该包许可的组织工作,否则您不应建议人们使用此功能。