Postgresql LATERAL 与 INNER JOIN

Postgresql LATERAL vs INNER 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;

横向

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

我知道这里的 join 将被计算一次,然后与主请求和每个 FROM 的请求合并。


在我看来,如果 join 将几行旋转到一帧,那么它会更有效率,但如果它是 1 到 1,那么 LATERAL - 我认为对吗?

如果我没理解错的话,你是在问这两种说法中哪一种更有效。

您可以使用 EXPLAIN (ANALYZE) 自行测试,我想答案取决于数据:

  • 如果 a 中的行很少,如果 b(id) 上有索引,LATERAL 连接可能会更有效。

  • 如果a中有很多行,第一个查询可能会更有效率,因为它可以使用哈希或合并连接。