考虑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。请原谅伪代码。
答案 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);
此时的纯猜想,但我猜第二个可能更好,因为它减少了子查询中返回的数据量,所以基本上......它会在生成结果的过程中减少数据集。