ITPub博客

首页 > 数据库 > 国内数据库 > 查询优化——查询树结构

查询优化——查询树结构

原创 国内数据库 作者:瀚高PG实验室 时间:2024-03-12 14:25:07 0 删除 编辑

瀚高数据库

文档用途

查询树作为PG优化器的输入参数,了解此类数据结构,在此基础上了解PG优化的规则。

详细信息

1.如何查看查询树

第一种方式:修改postgres.conf配置文件中下列参数,之后执行的查询语句的查询树会在日志文件中显示。

debug_print_parse = on     # 打印查询树debug_print_rewritten = off   # 打印重写之后的查询树
debug_print_plan = off      # 打印执行计划debug_pretty_print = on    # 结构化方式显示查询树结构

第二种方式:elog_node_dispaly,在gdb的时候调用,或者代码中嵌入之后再编译。比第一种方式好在可以打印多次,对比变化。

if(Debug_print_parse) //debug模式,输出parse tree树
  elog_node_display(LOG, "parse tree", root->parse,
	        Debug_pretty_print);

2. 通过具体sql看查询树

建表:

if(Debug_print_parse) //debug模式,输出parse tree树
  elog_node_display(LOG, "parse tree", root->parse,
	        Debug_pretty_print);

SQL:

SELECT * FROM student LEFT JOIN SCORE ON TRUE LEFT JOIN COURSE ON SCORE.cno = COURSE.cno;

查询树结构:


image.png

查询树展开(有的字段没显示):

https://github.com/nullemp/postgres_notes/blob/master/image/sample13.node.jpg

3. 通过查询树认识查询树中的各个节点

RangeTblEntry:描述了查询中出现的表,即FROM子句中的表。

jointree:PG显示指定了两个表的关系,即使用了join关键字,使用JoinExpr来表示连接关系,表示连接关系需要使用表相关信息,需要RangeTblRef。

RangeTblRef:索引RangeTblEntry中表的位置的结构。

FromExpr:表示隐式的连接关系,PG中用逗号连接的两个表,比如下边:

SQL:

SELECT * FROM STUDENT, SCORE LEFT JOIN COURSE ON SCORE.cno = COURSE.cno;


image.png

join优先级高于逗号,上图中JOINEXPR表示表2 表3的连接关系,然后在跟表1做内连接。

优化器中子查询提升会对jointree指向的递归结构进行调整,递归的入口是FROMEXPR中的fromlist,出口是RangeTbLRef。

图中还有其它的节点类型,比如TARGETENTRY, VAR,在子连接提升中介绍。






来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69994931/viewspace-3008739/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: PostGIS简单使用
请登录后发表评论 登录
全部评论
瀚高PG实验室(Highgo PG Lab)依托于瀚高DBA运维团队及瀚高数据库PG内核研发团队,旨在深入研究PostgreSQL技术、使用技巧、内核探秘、PG教学等,并进行分享。欢迎大家关注、交流。

注册时间:2021-02-18

  • 博文量
    184
  • 访问量
    126050