性能:LEFT JOIN 与 SUBQUERY
Performance: LEFT JOIN vs SUBQUERY
我正在使用 PostgreSQL 9.3 并具有以下表格(已简化为仅显示相关字段):
SITES:
id
name
...
DEVICES:
id
site_id
mac_address UNIQUE
...
鉴于特定设备的 mac_address
,我想获取关联的 site
的详细信息。我有以下两个查询:
使用左连接:
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
选项,但很想知道这两种速率在大型数据集上的表现如何。
通常不会有任何区别,因为它们应该产生相同的查询计划。至少,一个 EXISTS
子查询会; IN
并非总是智能优化。
对于子查询,您通常应该更喜欢 EXISTS (...)
.
,而不是使用 IN (...)
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
);
我正在使用 PostgreSQL 9.3 并具有以下表格(已简化为仅显示相关字段):
SITES:
id
name
...
DEVICES:
id
site_id
mac_address UNIQUE
...
鉴于特定设备的 mac_address
,我想获取关联的 site
的详细信息。我有以下两个查询:
使用左连接:
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
选项,但很想知道这两种速率在大型数据集上的表现如何。
通常不会有任何区别,因为它们应该产生相同的查询计划。至少,一个 EXISTS
子查询会; IN
并非总是智能优化。
对于子查询,您通常应该更喜欢 EXISTS (...)
.
IN (...)
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
);