写这样的查询有多好?

时间:2017-03-24 11:22:05

标签: sql database oracle query-performance

select 
a,
b,
(select x from table3 where id = z.id) as c,
d
from 
table1 z, table2 zz
where z.id = zz.id;

我知道可以像下面这样轻松简化查询:

select a,
b,
c.x,
d
from
table1 z,table2 zz, table3 c,
where z.id = zz.id and z.id = c.id;

但我想知道在case1中发生的性能影响或额外执行是什么,或者它们都具有相同的性能?要求知识。

4 个答案:

答案 0 :(得分:1)

即使table3为空,带有相关子查询的第一个查询也将始终返回数据。您需要外部联接才能获得相同的结果:

select a,
       b,
       c.x,
       d
from table1 z
join table2 zz on z.id = zz.id
left join table3 c on z.id = c.id

答案 1 :(得分:1)

使用join,查询更具可读性

但表现相同

select a,
b,
c.x,
d
from table1 z
join table2 zz on z.id = zz.id
join table3 c on z.id = c.id;

答案 2 :(得分:1)

如果你想使用相关的子查询(很好),你应该这样做:

select a, b,
       (select t3.x from table3 t3 where t3.id = z.id) as c,
       d
from table1 z join
     table2 zz
     on z.id = zz.id;

重要变化:

  • 限定所有列名称(我不知道abd来自哪里。)
  • 使用明确的join

您也可以将此查询编写为:

select a, b, t3.x, d
from table1 z join
     table2 zz
     on z.id = zz.id left join
     table3 t3
     on t3.id = z.id;

此查询与前一个查询略有不同。如果子查询返回多行,则前一个将返回错误。这个将把每个这样的值放在不同的列中。

也就是说,Oracle优化器非常好。如果有任何明显的性能差异,我会感到惊讶。

答案 3 :(得分:1)

如果子查询基于单个输入返回单个值,则它是标量子查询。标量子查询可以提高查询的性能。它将在几个基本条件下完成。首先,如果z.id具有相对较少的可能值。如果我记得的话,标量子查询处理将缓存多达254个值。其次,如果查询的其余部分返回相对较多的行。在这种情况下,如果您只返回几行,则缓存将没有机会提供帮助。但是如果你返回很多行,那么缓存的好处就会增加。

其他人已经强调了您的原始查询不完全等同。

在此处查看有关标量子查询的更多信息 - > Scalar Subqueries