Postgresql 横向与内部联接

Yar*_*lyk 3 sql postgresql join lateral

加入

SELECT *
FROM a
  INNER JOIN (
    SELECT b.id, Count(*) AS Count
    FROM b
    GROUP BY b.id ) AS b ON b.id = a.id;
Run Code Online (Sandbox Code Playgroud)

SELECT *
FROM a,
  LATERAL (
    SELECT Count(*) AS Count
    FROM b
    WHERE a.id = b.id ) AS b;
Run Code Online (Sandbox Code Playgroud)

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


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

Lau*_*lbe 5

如果我理解正确,您会问这两个语句中哪一个更有效。

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

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

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