博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第08课:消除外连接
阅读量:4074 次
发布时间:2019-05-25

本文共 743 字,大约阅读时间需要 2 分钟。

外连接是查询优化中的搅屎棍,在查询优化器的实现过程中,很多时间都消耗在和外连接做斗争。我们从《第4课:谓词下推》和《第5课:连接顺序交换规则》可以看出,外连接的出现对提高优化器的实现难度“功不可没”。例如,对约束条件进行下推(谓词下推)时,如果连接操作是外连接,那么有些约束条件下推就可能会受到阻碍。在连接顺序交换时,内连接的表之间的连接顺序交换比较灵活,而外连接不能随意地交换连接表的顺序。因此,如果能将外连接转换成内连接,查询优化的过程就会大大地简化。

外连接消除示例

在介绍怎样才能消除一个外连接之前,让我们先来看一下内连接和外连接的区别。例如,两个表 STUDENT 和 SCORE 的数据如下,其中有一个学生 lisi 没有成绩。

postgres=# SELECT * FROM STUDENT; sno     |  sname    | ssex-----+----------+------   1     | zhangsan  |    1   2     | lisi      |    1(2 rows)postgres=# SELECT * FROM SCORE; sno     | cno   | degree-----+-----+--------   1     |   1   |     36(1 row)

如果要查询学生的姓名和成绩,可以对 STUDENT 和 SCORE 做连接。从查询结果可以看出,内连接只显示了有成绩的学生,而外连接则对没有成绩的学生补了 NULL 值,也就是说这个外连接是不能转换成内连接的。

postgres=# SELECT * FROM STUDENT LEFT JOIN SCORE ON STUDENT.sn

转载地址:http://uoyni.baihongyu.com/

你可能感兴趣的文章
企业云盘如何助力商业新发展
查看>>
医疗行业运用企业云盘可以带来什么样的提升
查看>>
媒体广告业如何运用云盘提升效率
查看>>
IOS开发的开源库
查看>>
Jenkins - sonarqube 代码审查
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成(一)
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成 - 单机部署(二)
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成 - 高可用集群部署(三)
查看>>
C#控件集DotNetBar安装及破解
查看>>
Winform皮肤控件IrisSkin4.dll使用
查看>>
Winform多线程
查看>>
C# 托管与非托管
查看>>
Node.js中的事件驱动编程详解
查看>>
mongodb管理与安全认证
查看>>
nodejs内存控制
查看>>
nodejs Stream使用中的陷阱
查看>>
MongoDB 数据文件备份与恢复
查看>>
MongoDB数据库插入、更新和删除操作详解
查看>>
MongoDB文档(Document)全局唯一ID的设计思路
查看>>
mongoDB简介
查看>>