PostgreSQL LATERAL和INNER JOIN的区别

5

JOIN

SELECT *
FROM a
  INNER JOIN (
    SELECT b.id, Count(*) AS Count
    FROM b
    GROUP BY b.id ) AS b ON b.id = a.id;

LATERAL

SELECT *
FROM a,
  LATERAL (
    SELECT Count(*) AS Count
    FROM b
    WHERE a.id = b.id ) AS b;

我了解这里的join将被计算一次,然后与主请求合并,而不是针对每个FROM的请求。


我认为,如果join将几行旋转到一个框架中,那么它将更有效率,但如果是1对1,则应该使用LATERAL - 我认为是这样的?


多行或单行对于LATERAL不是很有效。当b包含许多与a中选定行无关的行时,LATERAL更有效。 - Sergey Gershkovich
停止,但不是为了达到目的而团结一致?你说如果他们没有束缚,他们会更有效 - 那么请求的意义就失去了。 - Yaroslav Malyk
1个回答

7
如果我理解正确,您正在询问哪个语句更有效。您可以使用EXPLAIN(ANALYZE)进行测试,我猜答案取决于数据:
- 如果a中的行数很少,并且b(id)上有索引,则LATERAL连接可能更有效。 - 如果a中的行数很多,则第一个查询可能更有效,因为它可以使用哈希或合并连接。

嗨 - 我进行了测试 - 如果我有10个上级记录,并且对于每个级别,我有200,000个条目 - 由于INNER的原因,我需要2.5秒来完成此操作,之后我为第一和第二级别创建了200,000个记录,使用LATERAL花费了3分钟。 - Yaroslav Malyk
当然,有道理。正如我所说,这取决于你的数据。 - Laurenz Albe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接