从表中连接表或连接select *的效率

时间:2016-03-09 18:35:06

标签: sql oracle join

考虑Oracle SQL中的这种情况

    select * from a join b;

VS

    select * from a join (select * from b);

VS

    select * from a join (select col1 from b); 

假设在最后一个场景中b中至少有5列。

在这种情况下,通过选择直接加入或加快加入会更快吗?

如果使用select的连接不是选择所有列而是选择其中的一小部分,那该怎么办呢。

P.S。请原谅伪代码。

2 个答案:

答案 0 :(得分:2)

前两个是完全相同的,除非你的意思是与复杂的查询进行比较。在那种情况下

 select * from a join (select * from b where col1 = 1);

等于此

select * from a join b
where b.col1 = 1;

上次查询

select * from a join (select col1 from b); 

通常问题不在于

 (select col1 from b)

问题是在第一个选择中使用*,只需将字段数减少到您需要提高性能的最小值。

 select * from a ....

答案 1 :(得分:0)

很可能你的第一个和第二个选择是在引擎盖下做同样的事情。实际上,通过连接(select * from b)方法可能会失去一些内部优化。

假设您的b表中包含大量数据,选择该数据的子集将优化性能。这可能是由于您在外部查询上使用select *这一事实,如果您没有限制所述连接,则会从连接中获取所有列。现在假设第四个选项:

select a.*, b.col1 from a join b;

了解上述内容是否优于:

会很有趣
select * from a join (select col1 from b);

此时的纯猜想,但我猜第二个可能更好,因为它减少了子查询中返回的数据量,所以基本上......它会在生成结果的过程中减少数据集。