我们有一个表,该表具有很多行(150,000+),并且必须基于对另一个表的SUB查询来选择每一行。 SUB查询返回的值独立于此表中的列。那么,oracle将为每个元组运行SUB查询吗?
示例
TableZ
id,
location
表A (超过15万)
name,
id,
type
TableB
type,
color
查询
select * from TableZ
join
(select name, id, type from TableA where type is null or type in
(select type from TableB where color='red')
) tblA_RED on TableZ.id=tblA_RED.id
我的问题是,SUB查询将在执行color ='red'的TableB中选择类型执行多少次?
答案 0 :(得分:1)
通常,数据库引擎仅处理一次查询 (从TableB中选择其中颜色为'red'的类型) ,并使用结果创建与(选择名称,id,类型为null的TableA中的类型或类型(从TableB中的color ='red'中选择类型)),最后通过与TableZ联接来执行外部选择。
您可能想在查询中添加与TableB相似的查询类型
(select distinct type from TableB where color='red')
这可能会带来更好的性能
答案 1 :(得分:0)
您问题的具体答案是Oracle应该只对子查询进行一次评估。
但是,您的查询带有不必要的子查询。您可以从以下内容开始:
select z.*, a.name, a.id, a.type
from TableZ z join
TableA a
on z.id = a.id
where a.type in (select b.type from TableB b where b.color = 'red');
这不太可能影响性能,但是可以简化您的工作。接下来,TableB
似乎没有重复的值,所以我建议:
select z.*, a.name, a.id, a.type
from TableZ z join
TableA a
on z.id = a.id left join
TableB b
on b.type = a.type
where b.color = 'red' or a.type is null;
将查询定为join
通常会为优化器提供更多选择-更多选择通常意味着查询速度更快。