Considere este trecho:
create table tbl_1(name text);
create table tbl_2(name text);
create function my_insert(_name text) returns text
language sql
as $$
insert into tbl_2(name)
values (_name);
select _name;
$$;
explain analyse
with x as (select name from tbl_1)
,y as (select my_insert(x.name) from x)
select 0
;
retorna
Result (cost=12.72..12.72 rows=1 width=4) (actual time=0.001..0.001 rows=1 loops=1)
CTE x
-> Seq Scan on tbl_1 (cost=0.00..12.72 rows=1360 width=32) (never executed)
Planning Time: 0.053 ms
Execution Time: 0.013 ms
Agora eu posso entender porque a cláusula x
não está sendo executada (e também y
é claro), mas o plano não menciona nada sobre o que aconteceu com cláusula y
.
Isso me leva a suspeitar que o analisador de consulta está emitindo uma consulta que não contém a cláusula y
.
Como posso confirmar isso? Como posso ver o que o analisador está emitindo aqui? Como alternativa, como ver qual consulta o planejador avaliou?
O analisador de consulta emite árvores de consulta e o planejador de consulta emite planos. Ambos podem ser mostrados com mais detalhes com as configurações
debug_print_parse
e .debug_print_plan
Da documentação :No caso da consulta na pergunta,
y
aparentemente é eliminada. É o trabalho do planejador, não do analisador. A saída do log comdebug_print_parse
mostraria isso, porque isso é antes de ser eliminado, ao contrário da saída comdebug_print_plan
, na qual não deveria estar presente.No entanto, o resultado de
EXPLAIN
sem menção à avaliaçãoy
deve ser uma prova suficiente de que o planejador a eliminou.