О подзапросах в предложении FROM
:
Подзапрос будет не выполняться для каждой возвращаемой строки; это не имело бы смысла в этих случаях.
В трех представленных вами случаях PostgreSQL даже сгладит подзапрос: оптимизатор понимает, что подзапрос не нужен, и соответствующим образом преобразует запросы.
Используйте EXPLAIN
со своими запросами, чтобы увидеть это в действии.
О CTE:
В отличие от подзапросов в предложении FROM
, CTE выступает в качестве барьера оптимизации , то есть оптимизатор не пытается сгладить его или выдвинуть в него условия.
Скорее, выполняется CTE и материализуется результат , а запрос выполняет сканирование CTE материализованного результата.
Опять же, используйте EXPLAIN
, чтобы увидеть его в действии.
В сообществе PostgreSQL предпринимаются попытки снять ограничение (или функцию, потому что это способ управления оптимизатором), что CTE всегда материализуются.