Oracle在具有大量元组的表上的SUB查询执行策略

时间:2019-04-07 22:49:14

标签: sql oracle join oracle11g subquery

我们有一个表,该表具有很多行(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中选择类型执行多少次?

2 个答案:

答案 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通常会为优化器提供更多选择-更多选择通常意味着查询速度更快。