考虑这个片段:
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
;
返回
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
现在我可以理解为什么该子句x
没有被执行(y
当然也可以),但该计划没有提到任何关于发生了什么的事情y
。
这让我怀疑查询解析器正在发出一个不包含该子句的查询y
。
我怎样才能确认这一点?我怎样才能看到解析器在这里发出了什么?或者,如何查看规划器评估的查询?
查询解析器发出查询树,查询规划器发出计划。
debug_print_parse
两者都可以通过和debug_print_plan
设置更详细地显示。从文档中:在问题中的查询的情况下,
y
显然被消除了。这是计划者的工作,而不是解析器的工作。带有 的日志输出debug_print_parse
会显示它,因为那是在它被消除之前,与带有 的输出相反debug_print_plan
,它不应该出现在其中。但是,
EXPLAIN
没有提及评估的结果y
应该足以证明计划者已经消除了它。