表现:LEFT JOIN vs SUBQUERY

时间:2015-10-22 06:55:37

标签: performance postgresql optimization subquery left-join

我正在使用PostgreSQL 9.3并拥有以下表格(简化为仅显示相关字段):

SITES:
id
name
...

DEVICES:
id
site_id
mac_address UNIQUE
...

鉴于特定设备的mac_address,我想获取相关site的详细信息。我有以下两个问题:

使用LEFT JOIN:

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';

使用SUBQUERY:

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选项,但有兴趣知道两种速率在大型数据集上的表现。

1 个答案:

答案 0 :(得分:5)

它通常不会有任何区别,因为它们应该导致相同的查询计划。至少,EXISTS子查询会; IN并不像智能优化一样。

对于子查询,您通常不应使用IN (...),而应使用EXISTS (...)

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
);