子查询选择语句与内连接

时间:2016-01-02 13:56:47

标签: sql performance database-performance

我对这两个使用速度更快,更常见并且最适合记忆的陈述感到困惑

select p.id, p.name, w.id, w.name 
from person p 
inner join work w on w.id = p.wid 
where p.id in (somenumbers)
vs

select p.id, p.name, (select id from work where id=p.wid) , (select name from work where id=p.wid)
from person p 
where p.id in (somenumbers)

这个想法的全部意思是,如果我拥有庞大的数据库,并且我想进行内部联接,那么对于johin工作表和人员表会占用内存和较少的性能,但是子查询选择状态它只会选择一个这个时间最好的时间

4 个答案:

答案 0 :(得分:3)

首先,两个查询相同。第一个过滤掉work中没有匹配行的任何行。

等效的第一个查询使用left join

select p.id, p.name, w.id, w.name 
from person p left join
     work w
     on w.id = p.wid 
where p.id in (somenumbers);

然后,第二个查询可以简化为:

select p.id, p.name, p.wid,
       (select name from work where w.id = p.wid)
from person p 
where p.id in (somenumbers);

work中已存在person中的ID时,没有理由在person(id, wid, name)中查找。

如果您想要优化查询,那么您需要work(id, name)work上的索引。

使用这些索引,两个查询应该具有基本相同的性能。子查询将使用work上的索引从where获取行,person子句将使用{{1}}上的索引。任何一个查询都应该快速且可扩展。

答案 1 :(得分:2)

第二个示例中的子查询将为每一行执行一次,这将执行得非常糟糕。也就是说,一些优化器可以能够将它转换为你的连接 - YMMV。

一般来说,一个好的规则是:更喜欢连接到子查询。

答案 2 :(得分:1)

与子查询相比,

连接提供更好的性能。如果Int列上有连接或连接列上的索引提供最佳性能。

select p.id, p.name, w.id, w.name 
from person p 
inner join work w on w.id = p.wid 
where p.id in (somenumbers)

答案 3 :(得分:0)

这实际上取决于您要如何优化查询(包括但不限于添加/删除/重新排序索引),

我发现使连接飙升的设置可能会使子查询遭受损失,反之亦然。因此,将它们与相同的设置进行比较没有太多意义。

我选择使用join并对其进行优化。在我的最佳状态设置中,很少会丢失子查询,但是非常易于阅读。

当供应商将大量查询以及带有子查询的数据塞入系统时。除非性能开始下降,否则由于我其他工作的查询优化问题,根本就不值得去改变它们。