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первый запрос, вероятно, будет более эффективным, поскольку он может использовать хеш или объединение слиянием.

Другие вопросы по тегам