Performance 性能:左连接vs子查询

Performance 性能:左连接vs子查询,performance,postgresql,optimization,subquery,left-join,Performance,Postgresql,Optimization,Subquery,Left Join,我使用的是PostgreSQL 9.3,有以下表格(简化为仅显示相关字段): 给定特定设备的mac\u地址,我想获得相关站点的详细信息。我有以下两个问题: 使用左联接: SELECT s.* FROM sites s LEFT JOIN devices d ON s.id = d.site_id WHERE d.mac_address = '00:00:00:00:00:00'; 使用子查询: SELECT s.* FROM sites s WHERE s.id IN (SELECT d.si

我使用的是PostgreSQL 9.3,有以下表格(简化为仅显示相关字段):

给定特定设备的
mac\u地址
,我想获得相关
站点
的详细信息。我有以下两个问题:

使用左联接:

SELECT s.* FROM sites s
LEFT JOIN devices d ON s.id = d.site_id
WHERE d.mac_address = '00:00:00:00:00:00';
使用子查询:

SELECT s.* FROM sites s
WHERE s.id IN (SELECT d.site_id FROM devices d WHERE d.mac_address = '00:00:00:00:00:00');

对于无限增长的数据库,这两个查询中哪一个具有最佳性能?我一直倾向于使用
LEFT JOIN
选项,但我想知道这两种速率在大数据集上的性能如何。

通常不会有任何区别,因为它们应该产生相同的查询计划。至少,存在一个
子查询
<在中的code>并没有始终得到智能优化

对于子查询,通常应首选
存在(…)
而不是在(…)中使用


EXPLAIN
自己检查一下。或者更好:使用
EXPLAIN-analyze
。另外:如果你在
设备中有多行使用相同的mac_地址,那么这两个语句做的事情就不一样了。我认为它们甚至会生成不同的结果集,因此它们是不可比较的。@Caramiriel我相信它们返回的结果集是“相同的”。伙计们,我们在浪费彼此的时间-解决方案在前两条评论中提供。我们停止聊天,然后开始检查
EXPLAIN
;-)怎么样由于
mac\u地址
是唯一的,我不认为
IN
EXISTS
会有很大的区别。我以前从未使用过
EXISTS
,看起来它在这种情况下可能有用。从文档中可以看出:“子查询通常只执行到足以确定是否返回至少一行的程度,而不是一直执行到完成为止”。告诉我,
存在
将在匹配
mac\U地址
后停止,其中
中的as
将继续。可以在数十万行上产生影响。
SELECT s.* FROM sites s
WHERE s.id IN (SELECT d.site_id FROM devices d WHERE d.mac_address = '00:00:00:00:00:00');
SELECT s.*
FROM sites s
WHERE EXISTS (
  SELECT 1
  FROM devices d
  WHERE d.mac_address = '00:00:00:00:00:00'
    AND d.site_id = s.id
);