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;
LATERAL
SELECT *
FROM a,
LATERAL (
SELECT Count(*) AS Count
FROM b
WHERE a.id = b.id ) AS b;
Я понимаю, что здесь соединение будет вычисляться один раз, а затем объединяться с основным запросом против запроса для каждого FROM.
Мне кажется, что если объединение будет вращать несколько строк в одном кадре, то это будет более эффективным, но если это будет 1 к 1, то LATERAL - я думаю, правильно?
1 ответ
Решение
Если я вас правильно понимаю, вы спрашиваете, какое из двух утверждений более эффективно.
Вы можете проверить это самостоятельно, используя EXPLAIN (ANALYZE)
и я думаю, что ответ зависит от данных:
Если в
a
,LATERAL
объединение, вероятно, будет более эффективным, если наb(id)
,Если в
a
первый запрос, вероятно, будет более эффективным, поскольку он может использовать хеш или объединение слиянием.