Uma subconsulta escalar independente da consulta pai (não se refere à tabela pai) é avaliada apenas uma vez ou para cada linha, independentemente?
SELECT /* ... */
FROM
t1
WHERE
parent = (
-- is this sq evaluated once?
SELECT
t2.id
FROM t2
WHERE t2.id = 10
)
ou usando um CTE
WITH parent_id AS (
SELECT
t2.id
FROM t2
WHERE t2.id = 10
)
SELECT /* ... */
WHERE
parent = (
SELECT p.id FROM parent_id p -- is this sq evaluated once?
)
Se a resposta for que a subconsulta/CTE é avaliada para cada linha, juntar o CTE em cada linha melhoraria o desempenho?
WITH parent_id AS (
SELECT
t2.id
FROM t2
WHERE t2.id = 10
)
SELECT /* ... */
FROM
t1, parent_id
WHERE
parent = parent_id.id
Além disso, existe uma maneira de descobrir EXPLAIN ANALYZE
quantas vezes uma expressão foi avaliada?
Nota: os exemplos são arbitrários e não refletem o cenário real, portanto ignore o fato de que não faz sentido fazer uma subconsulta para descobrir um id
que já é conhecido ( 10
).
É avaliado uma vez.
EXPLAIN ANALYZE
exibirá linhas como estas:loops=1
informa que o subplano foi avaliado apenas uma vez . O manual:Com uma subconsulta correlacionada como:
(ou algo mais útil) você veria
loops=
n
, onden
é o número de linhast1
.