Postgresql源码(95)优化器关键数据结构实例

news2024/11/25 10:10:49

1 测试数据

drop table student;
create table student(sno int primary key, sname varchar(10), ssex int);
insert into student values(1, 'stu1', 0);
insert into student values(2, 'stu2', 1);
insert into student values(3, 'stu3', 1);
insert into student values(4, 'stu4', 0);

drop table course;
create table course(cno int primary key, cname varchar(10), tno int);
insert into course values(1, 'meth', 10);
insert into course values(2, 'english', 11);

drop table teacher;
create table teacher(tno int primary key, tname varchar(10), tsex int);
insert into teacher values(10, 'te1', 1);
insert into teacher values(11, 'te2', 0);

drop table score;
create table score (sno int, cno int, degree int);
insert into score values (1, 10, 100);
insert into score values (1, 11, 89);
insert into score values (2, 10, 99);
insert into score values (2, 11, 90);
insert into score values (3, 10, 87);
insert into score values (3, 11, 20);
insert into score values (4, 10, 60);
insert into score values (4, 11, 70);

2 列属性VAR实例

SELECT st.sname FROM STUDENT st WHERE st.sno = ANY(SELECT sno FROM SCORE WHERE st.sno=sno);


-- 结果
 sname 
-------
 stu1
 stu2
 stu3
 stu4


-- 计划
                           QUERY PLAN                            
-----------------------------------------------------------------
 Seq Scan on student st  (cost=0.00..19562.50 rows=550 width=38)
   Filter: (SubPlan 1)
   SubPlan 1
     ->  Seq Scan on score  (cost=0.00..35.50 rows=10 width=4)
           Filter: (st.sno = sno)

PLANNER前后结果对比:
在这里插入图片描述

3 表RangeTblEntry实例

SELECT * 
FROM STUDENT 
  LEFT JOIN SCORE ON TRUE,
  (SELECT * FROM TEACHER) AS t,
  COURSE,(VALUES (1, 1)) AS NUM(x, y), 
  GENERATE_SERIES(1, 10) AS GS(z);


-- 结果
 sno | sname | ssex | sno | cno | degree | tno | tname | tsex | cno |  cname  | tno | x | y | z  
-----+-------+------+-----+-----+--------+-----+-------+------+-----+---------+-----+---+---+----
   1 | stu1  |    0 |   1 |  10 |    100 |  10 | te1   |    1 |   1 | meth    |  10 | 1 | 1 |  1
   1 | stu1  |    0 |   1 |  11 |     89 |  10 | te1   |    1 |   1 | meth    |  10 | 1 | 1 |  1
   1 | stu1  |    0 |   2 |  10 |     99 |  10 | te1   |    1 |   1 | meth    |  10 | 1 | 1 |  1
   1 | stu1  |    0 |   2 |  11 |     90 |  10 | te1   |    1 |   1 | meth    |  10 | 1 | 1 |  1
   1 | stu1  |    0 |   3 |  10 |     87 |  10 | te1   |    1 |   1 | meth    |  10 | 1 | 1 |  1
   1 | stu1  |    0 |   3 |  11 |     20 |  10 | te1   |    1 |   1 | meth    |  10 | 1 | 1 |  1
   1 | stu1  |    0 |   4 |  10 |     60 |  10 | te1   |    1 |   1 | meth    |  10 | 1 | 1 |  1
   1 | stu1  |    0 |   4 |  11 |     70 |  10 | te1   |    1 |   1 | meth    |  10 | 1 | 1 |  1
   2 | stu2  |    1 |   1 |  10 |    100 |  10 | te1   |    1 |   1 | meth    |  10 | 1 | 1 |  1
   2 | stu2  |    1 |   1 |  11 |     89 |  10 | te1   |    1 |   1 | meth    |  10 | 1 | 1 |  1
   2 | stu2  |    1 |   2 |  10 |     99 |  10 | te1   |    1 |   1 | meth    |  10 | 1 | 1 |  1


-- 计划
                                           QUERY PLAN                                           
------------------------------------------------------------------------------------------------
 Nested Loop Left Join  (cost=0.00..339571526494.35 rows=27152400000000 width=162)
   ->  Nested Loop  (cost=0.00..166526458.85 rows=13310000000 width=142)
         ->  Nested Loop  (cost=0.00..151435.10 rows=12100000 width=96)
               ->  Nested Loop  (cost=0.00..161.35 rows=11000 width=50)
                     ->  Function Scan on generate_series gs  (cost=0.00..0.10 rows=10 width=4)
                     ->  Materialize  (cost=0.00..26.50 rows=1100 width=46)
                           ->  Seq Scan on teacher  (cost=0.00..21.00 rows=1100 width=46)
               ->  Materialize  (cost=0.00..26.50 rows=1100 width=46)
                     ->  Seq Scan on course  (cost=0.00..21.00 rows=1100 width=46)
         ->  Materialize  (cost=0.00..26.50 rows=1100 width=46)
               ->  Seq Scan on student  (cost=0.00..21.00 rows=1100 width=46)
   ->  Materialize  (cost=0.00..40.60 rows=2040 width=12)
         ->  Seq Scan on score  (cost=0.00..30.40 rows=2040 width=12)

PLANNER前后对比:
在这里插入图片描述

3 连接键JoinExpr实例

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

-- 结果
 sno | sname | ssex | sno | cno | degree | cno | cname | tno 
-----+-------+------+-----+-----+--------+-----+-------+-----
   1 | stu1  |    0 |   1 |  10 |    100 |     |       |    
   2 | stu2  |    1 |   1 |  10 |    100 |     |       |    
   3 | stu3  |    1 |   1 |  10 |    100 |     |       |    
   4 | stu4  |    0 |   1 |  10 |    100 |     |       |    
   1 | stu1  |    0 |   1 |  11 |     89 |     |       |    
   2 | stu2  |    1 |   1 |  11 |     89 |     |       |    
   3 | stu3  |    1 |   1 |  11 |     89 |     |       |    
   4 | stu4  |    0 |   1 |  11 |     89 |     |       |    
   1 | stu1  |    0 |   2 |  10 |     99 |     |       |    
   2 | stu2  |    1 |   2 |  10 |     99 |     |       |    
   3 | stu3  |    1 |   2 |  10 |     99 |     |       |    
   4 | stu4  |    0 |   2 |  10 |     99 |     |       |    
   1 | stu1  |    0 |   2 |  11 |     90 |     |       |    
   2 | stu2  |    1 |   2 |  11 |     90 |     |       |    
   3 | stu3  |    1 |   2 |  11 |     90 |     |       |    
   4 | stu4  |    0 |   2 |  11 |     90 |     |       |    
   1 | stu1  |    0 |   3 |  10 |     87 |     |       |    
   2 | stu2  |    1 |   3 |  10 |     87 |     |       |    
   3 | stu3  |    1 |   3 |  10 |     87 |     |       |    
   4 | stu4  |    0 |   3 |  10 |     87 |     |       |    
   1 | stu1  |    0 |   3 |  11 |     20 |     |       |    
   2 | stu2  |    1 |   3 |  11 |     20 |     |       |    
   3 | stu3  |    1 |   3 |  11 |     20 |     |       |    
   4 | stu4  |    0 |   3 |  11 |     20 |     |       |    
   1 | stu1  |    0 |   4 |  10 |     60 |     |       |    
   2 | stu2  |    1 |   4 |  10 |     60 |     |       |    
   3 | stu3  |    1 |   4 |  10 |     60 |     |       |    
   4 | stu4  |    0 |   4 |  10 |     60 |     |       |    
   1 | stu1  |    0 |   4 |  11 |     70 |     |       |    
   2 | stu2  |    1 |   4 |  11 |     70 |     |       |    
   3 | stu3  |    1 |   4 |  11 |     70 |     |       |    
   4 | stu4  |    0 |   4 |  11 |     70 |     |       |

-- 计划
                                  QUERY PLAN                                   
-------------------------------------------------------------------------------
 Nested Loop  (cost=34.75..28144.28 rows=2244000 width=104)
   ->  Hash Left Join  (cost=34.75..70.53 rows=2040 width=58)
         Hash Cond: (score.cno = course.cno)
         ->  Seq Scan on score  (cost=0.00..30.40 rows=2040 width=12)
         ->  Hash  (cost=21.00..21.00 rows=1100 width=46)
               ->  Seq Scan on course  (cost=0.00..21.00 rows=1100 width=46)
   ->  Materialize  (cost=0.00..26.50 rows=1100 width=46)
         ->  Seq Scan on student "le盯"  (cost=0.00..21.00 rows=1100 width=46)

PLANNER前:
在这里插入图片描述

5 自然连接键FromExpr实例

SELECT * FROM STUDENT, SCORE, COURSE WHERE STUDENT.sno = SCORE.sno;

-- 结果
 sno | sname | ssex | sno | cno | degree | cno |  cname  | tno 
-----+-------+------+-----+-----+--------+-----+---------+-----
   1 | stu1  |    0 |   1 |  10 |    100 |   1 | meth    |  10
   1 | stu1  |    0 |   1 |  10 |    100 |   2 | english |  11
   1 | stu1  |    0 |   1 |  11 |     89 |   1 | meth    |  10
   1 | stu1  |    0 |   1 |  11 |     89 |   2 | english |  11
   2 | stu2  |    1 |   2 |  10 |     99 |   1 | meth    |  10
   2 | stu2  |    1 |   2 |  10 |     99 |   2 | english |  11
   2 | stu2  |    1 |   2 |  11 |     90 |   1 | meth    |  10
   2 | stu2  |    1 |   2 |  11 |     90 |   2 | english |  11
   3 | stu3  |    1 |   3 |  10 |     87 |   1 | meth    |  10
   3 | stu3  |    1 |   3 |  10 |     87 |   2 | english |  11
   3 | stu3  |    1 |   3 |  11 |     20 |   1 | meth    |  10
   3 | stu3  |    1 |   3 |  11 |     20 |   2 | english |  11
   4 | stu4  |    0 |   4 |  10 |     60 |   1 | meth    |  10
   4 | stu4  |    0 |   4 |  10 |     60 |   2 | english |  11
   4 | stu4  |    0 |   4 |  11 |     70 |   1 | meth    |  10
   4 | stu4  |    0 |   4 |  11 |     70 |   2 | english |  11

-- 计划

                                  QUERY PLAN                                  
------------------------------------------------------------------------------
 Nested Loop  (cost=34.75..28144.28 rows=2244000 width=104)
   ->  Hash Join  (cost=34.75..70.53 rows=2040 width=58)
         Hash Cond: (score.sno = student.sno)
         ->  Seq Scan on score  (cost=0.00..30.40 rows=2040 width=12)
         ->  Hash  (cost=21.00..21.00 rows=1100 width=46)
               ->  Seq Scan on student  (cost=0.00..21.00 rows=1100 width=46)
   ->  Materialize  (cost=0.00..26.50 rows=1100 width=46)
         ->  Seq Scan on course  (cost=0.00..21.00 rows=1100 width=46)

planner前:
在这里插入图片描述

6 Query树

查询树,准备传入rewriter和planner进一步处理。

typedef struct Query
{
	NodeTag		type;

	CmdType		commandType;	/* select|insert|update|delete|merge|utility */

	QuerySource querySource;	/* where did I come from? */

	/*
	 * query identifier (can be set by plugins); ignored for equal, as it
	 * might not be set; also not stored
	 */
	uint64		queryId pg_node_attr(equal_ignore, read_write_ignore, read_as(0));

	bool		canSetTag;		/* do I set the command result tag? */

	Node	   *utilityStmt;	/* non-null if commandType == CMD_UTILITY */

	int			resultRelation; /* rtable index of target relation for
								 * INSERT/UPDATE/DELETE/MERGE; 0 for SELECT */

	bool		hasAggs;		/* has aggregates in tlist or havingQual */
	bool		hasWindowFuncs; /* has window functions in tlist */
	bool		hasTargetSRFs;	/* has set-returning functions in tlist */
	bool		hasSubLinks;	/* has subquery SubLink */
	bool		hasDistinctOn;	/* distinctClause is from DISTINCT ON */
	bool		hasRecursive;	/* WITH RECURSIVE was specified */
	bool		hasModifyingCTE;	/* has INSERT/UPDATE/DELETE in WITH */
	bool		hasForUpdate;	/* FOR [KEY] UPDATE/SHARE was specified */
	bool		hasRowSecurity; /* rewriter has applied some RLS policy */

	bool		isReturn;		/* is a RETURN statement */

	List	   *cteList;		/* WITH list (of CommonTableExpr's) */

	List	   *rtable;			/* list of range table entries */
	FromExpr   *jointree;		/* table join tree (FROM and WHERE clauses);
								 * also USING clause for MERGE */

	List	   *mergeActionList;	/* list of actions for MERGE (only) */
	bool		mergeUseOuterJoin;	/* whether to use outer join */

	List	   *targetList;		/* target list (of TargetEntry) */

	OverridingKind override;	/* OVERRIDING clause */

	OnConflictExpr *onConflict; /* ON CONFLICT DO [NOTHING | UPDATE] */

	List	   *returningList;	/* return-values list (of TargetEntry) */

	List	   *groupClause;	/* a list of SortGroupClause's */
	bool		groupDistinct;	/* is the group by clause distinct? */

	List	   *groupingSets;	/* a list of GroupingSet's if present */

	Node	   *havingQual;		/* qualifications applied to groups */

	List	   *windowClause;	/* a list of WindowClause's */

	List	   *distinctClause; /* a list of SortGroupClause's */

	List	   *sortClause;		/* a list of SortGroupClause's */

	Node	   *limitOffset;	/* # of result tuples to skip (int8 expr) */
	Node	   *limitCount;		/* # of result tuples to return (int8 expr) */
	LimitOption limitOption;	/* limit type */

	List	   *rowMarks;		/* a list of RowMarkClause's */

	Node	   *setOperations;	/* set-operation tree if this is top level of
								 * a UNION/INTERSECT/EXCEPT query */

	List	   *constraintDeps; /* a list of pg_constraint OIDs that the query
								 * depends on to be semantically valid */

	List	   *withCheckOptions;	/* a list of WithCheckOption's (added
									 * during rewrite) */

	/*
	 * The following two fields identify the portion of the source text string
	 * containing this query.  They are typically only populated in top-level
	 * Queries, not in sub-queries.  When not set, they might both be zero, or
	 * both be -1 meaning "unknown".
	 */
	int			stmt_location;	/* start location, or -1 if unknown */
	int			stmt_len;		/* length in bytes; 0 means "rest of string" */
} Query;
  • rtable:在查询中 FROM 子句后面会指出需要进行查询的范围表,可能是对单个范围表进行查询,也可能是对几个范围表做连接操作, rtable 中则记录了这些范围表。rtable 是一个 List 指针,所有要查询的范围表就记录在这个 List 中,每个表以 RangeTblEntry 结构体来表示,因此 rtable 是一个以 RangeTblEntry 为节点的 List链表 。

  • jointree: rtable 中列出了查询语句中的表,但没有明确指出各个表之间的连接关系,这个 连接的关系 则通过 jointree 来标明, jointree 是一个 FromExpr 类型 的结构体,它有 3 种类型的节点 : FromExpr、 JoinExpr 和 RangeTblRef。

  • targetlist: targetlist 中包含了需要投影( Project)的列,也就是 SFW 查询中的投影列 。

7 Query实例:SELECT * FROM STUDENT WHERE SNO=1;

在这里插入图片描述

8 Query实例:SELECT st.sname, sc.degree FROM STUDENT st, SCORE sc WHERE st.sno = sc.sno;

注意自然连接只有两个RTE,有joinexpr才需要连接RTE。看下面例子。
在这里插入图片描述

9 Query实例:SELECT st.sname, sc.degree FROM STUDENT st INNER JOIN SCORE sc ON st.sno = sc.sno;

注意这里面有3个RTE,因为存在joinexpr,必须有对应的链接RTE。
在这里插入图片描述

10 Query实例:SELECT st.sname, c.cname, sc.degree FROM STUDENT st,COURSE c INNER JOIN SCORE sc ON c.cno = sc.cno WHERE st.sno = sc.sno;

注意fromexpr的quals不是连接键,是外层的where条件。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/116312.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux的环境变量

目录 什么是环境变量? 那么如何添加自己的程序到命令行上,可以直接执行? 如何查看环境变量? 如何定义环境变量? C语言如何获取环境变量? 什么是环境变量? 在回答这个问题之前,可…

【Linux】之systemd与systemctl

文章目录一、systemd1. systemd 守护进程管理 Linux 的启动2. systemd 提供的功能:3. systemd 使用单元来管理不同类型的对象。4. 服务单元信息二、systemctl1. systemctl输出中的服务状态2. 列出servera上安装的所以服务单元3. 列出servera上所有活动和不活动的套接字单元4.1 …

存档鉴未来,新时代电子档案长期保存之道

(一)电子档案单套制是未来档案管理的趋势 在政府和企业端,办公体系的信息化,电子档案的单套制实施,极大地提高了事务办理的效率,同时节约了大量纸质文件的使用成本。 在政务领域,单套制的推行…

Day840.原子类-Java 并发编程实战

原子类 Hi,我是阿昌,今天学习记录的是关于原子类。 一个累加器的例子,示例代码如下: 在这个例子中,add10K() 这个方法不是线程安全的,问题就出在变量 count 的可见性和 count1 的原子性上。 可见性问题…

Java7的异常处理新特性addSuppressed()方法

学习使用Java7新语法try-with-resources,在查看编译文件时,接触到addSuppressed()方法。记录一下使用方式。 先来看一段代码: private static void testt() {try (InputStream is CatchTest.class.getClassLoader().getResourceAsStream(&…

ThinkPHP 多应用模式初探

还是很久以前用tp3.0开发过项目,之后就再没使用过,现在tp都更新到6了,与之前差距很大,需要重新练习掌握最新的tp框架使用及特性。 目录 1.安装框架 2.安装多应用模式扩展think-multi-app 3.目录结构修改并创建应用子目录 4.应…

年后市场将反弹?服装人做好这些准备,才能赚到2023年第一桶金!

目前,随着防疫政策精准落地、逐步放开,人们对疫情的科学认知不断更新,市场活跃度正逐步恢复。秦丝通过与数万服装老板沟通交流,发现新的模式也在渐渐兴起,国内服装市场将有望迎来反弹。 1、消费氛围活跃,市…

善网ESG周报(第六期)

ESG报告: 宁夏建投城运首份社会责任(ESG)报告正式发布 12月20日,宁夏建投城市运营管理有限公司发布首份ESG报告。报告显示,其公司将业务与环境保护、社会责任、公司治理相结合打造一条绿色发展道路。 国寿股权投资发…

滚动条基本样式设置

::-webkit-scrollbar 系列属性 详细使用说明 ::-webkit-scrollbar注意:如果没有设置滚动溢出的相关属性,滚动条样式系列属性不会生效(resize 除外)。属性 ::-webkit-scrollbar 整个滚动条。::-webkit-scrollbar-button 滚动条上的…

Vue3组件化开发(一)

文章目录p11 组件组件的拆分和嵌套组件的CSS作用域组件的通信父子组件的通信父组件传递给子组件props的对象用法非prop的attribute子组件传递给父组件案例p11 组件 组件的拆分和嵌套 推荐安装的VS Cdoe插件 组件的CSS作用域 组件的通信 父子组件的通信 父组件传递给子组件…

模型初始化

在深度学习模型训练中,权重初始值极为重要,一个好的初始值会使得模型收敛速度提高,使模型准确率更准确,一般情况下,我们不使用全零初始值训练网络,为了利于训练和减少收敛时间,我们需要对模型进…

从入门到项目实战 - Vue 计算属性用法解析

Vue 计算属性用法解析上一节:《Vue 监听器用法解析 》| 下一节:《Vue 样式绑定》jcLee95 邮箱 :291148484163.com CSDN 主页:https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 本文地址:https://blog.…

衣服、商品、商城网站模板首页,仿U袋网,vue+elementui简洁实现(二)

一.前言 接上一遍博客:《衣服、商品、商城网站模板首页,仿U袋网,vueelementui简洁实现》 在此基础上增加了和完善一些页面: 商品分类筛选页面登录、注册、找回密码共用页面U袋学堂(视频专区,视频播放&am…

编译原理——参数传递—传名、传地址、得结果、传值

1.传名(替换操作) 把这种方式理解为替换操作,把P函数参数X、Y、Z和P函数内部的Y、Z替换为A、B,然后P函数对Y、Z的操作,其实就是对A、B的操作;需要注意这和传地址一样,上面对A造成的变化&#x…

制品仓库 Nexus 安装、配置、备份、使用

目录 1.1 Nexus 优点 1.2 Nexus 仓库类型 2. 安装 Nexus 2.1 设置持久化目录 2.2 拉取 Nexus docker 镜像 2.3 运行并启动 Nexus 3. 系统配置 3.1 配置管理员密码 3.2 配置 LDAP 3.3 配置 Email 服务器 4. 配置 Repository 4.1 添加 Blob Stores 4.2 添加 Reposit…

软考高级考哪个好?

软考高级一共5个科目,含金量都差不多,每个人考证的需求各不相同,合适自己情况的才是最有用的证书。看你自己的工作、专业与哪个更相近,再来深入学习备考的,当然自己也要对考试取证有一定的信心。 高级科目介绍&#x…

【LeetCode每日一题】——剑指 Offer II 072.求平方根

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【题目注意】九【时间频度】十【代码实现】十一【提交结果】一【题目类别】 二分查找 二【题目难度】 简单 三【题目编号】 剑指 Offer II 072.求平方根 …

《图解TCP/IP》阅读笔记(第七章 7.5)—— OSPF 开放最短路径优先协议

7.5 OSPF OSPF(Open Shortest Path First,开放最短路径优先)是一种链路状态性的路由协议,即使网络中有环路,也可以进行稳定的路由控制。 另外,OSPF支持子网掩码,使得在RIP中无法实现的可变长度…

在简历上写了“精通自动化测试,阿里面试官跟我死磕后就给我发了高薪 offer

事情是这样的 前段时间面试了阿里,大家也都清楚,如果你在简历上面写着你精通 XX 技术,那面试官就会跟你死磕到底。 我就是在自己的简历上写了精通自动化测试,然后就开启了和阿里面试官的死磕之路,结果就是拿到了一份…

【Lilishop商城】No4-2.业务逻辑的代码开发,涉及到:会员B端第三方登录的开发-平台注册会员接口开发

仅涉及后端,全部目录看顶部专栏,代码、文档、接口路径在: 【Lilishop商城】记录一下B2B2C商城系统学习笔记~_清晨敲代码的博客-CSDN博客 全篇会结合业务介绍重点设计逻辑,其中重点包括接口类、业务类,具体的结合源代…