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
中有很多行,第一个查询可能会更有效率,因为它可以使用哈希或合并连接。
加入
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
中有很多行,第一个查询可能会更有效率,因为它可以使用哈希或合并连接。