表现:LEFT JOIN vs SUBQUERY

sfi*_*_29 4 postgresql optimization performance subquery left-join

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

SITES:
id
name
...

DEVICES:
id
site_id
mac_address UNIQUE
...
Run Code Online (Sandbox Code Playgroud)

给定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';
Run Code Online (Sandbox Code Playgroud)

使用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');
Run Code Online (Sandbox Code Playgroud)

在无限增长的数据库中,哪两个查询的性能最佳?我一直倾向于LEFT JOIN选择,但有兴趣知道两种速率在大型数据集上的表现如何.

Cra*_*ger 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
);
Run Code Online (Sandbox Code Playgroud)

  • 我以前从未使用过`EXISTS`,看起来它在这种情况下可能有用。来自文档:“子查询通常只会执行到足以确定是否至少返回一行,而不是一直到完成”。对我说,一旦“mac_address”匹配,“EXISTS”就会停止,而“IN”会继续。可以对数十万行产生影响。 (2认同)