我对这两个使用速度更快,更常见并且最适合记忆的陈述感到困惑
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工作表和人员表会占用内存和较少的性能,但是子查询选择状态它只会选择一个这个时间最好的时间
答案 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并对其进行优化。在我的最佳状态设置中,很少会丢失子查询,但是非常易于阅读。
当供应商将大量查询以及带有子查询的数据塞入系统时。除非性能开始下降,否则由于我其他工作的查询优化问题,根本就不值得去改变它们。