查询优化——查询树结构

本文详细介绍了瀚高数据库中查询树的作用,包括查看方法、SQL示例以及RangeTblEntry、jointree、RangeTblRef和FromExpr等关键节点的含义。通过实例探讨了PG优化器的规则和SQL查询的执行过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

瀚高数据库
目录
文档用途
详细信息

文档用途
查询树作为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看查询树
建表:

CREATE TABLE student (sno INT primary key, sname VARCHAR(10) , ssex INT);

CREATE TABLE course (cno INT primary key , cname VARCHAR(10) , tno INT);

CREATE TABLE score (sno INT, cno INT, degree INT);

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,在子连接提升中介绍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值