SQL 语句执行计划中的连接方式

SQL 语句执行计划中的连接方式

join操作

join操作基本分为3大类:外连接(细分为:左连接(Left outer join/ left join)、右连接(right outer join/ right join)、全连接(full outer join/ full join))、自然连接(Natural join)、内连接(Inner Join/join)。

img

测试环境:

CREATE TABLE t01(id1 int,id2 int,id3 int);
CREATE TABLE t02(id1 int,id4 int,id5 int);
INSERT INTO t01 VALUES(1,1,1);
INSERT INTO t01 VALUES(2,2,2);
INSERT INTO t01 VALUES(3,3,3);INSERT INTO t02 VALUES(1,4,4);
INSERT INTO t02 VALUES(2,2,2);
INSERT INTO t02 VALUES(4,6,6);
commit;
SELECT * FROM t01;
SELECT * FROM t02;
ITMS5_1@hfzcdb> SELECT * FROM t01;ID1        ID2        ID3
---------- ---------- ----------1          1          12          2          23          3          3ITMS5_1@hfzcdb> SELECT * FROM t02;ID1        ID4        ID5
---------- ---------- ----------1          4          42          2          24          6          6

内连接:

ITMS5_1@hfzcdb> SELECT * from t01 INNER JOIN t02 ON t01.id1=t02.id1;ID1        ID2        ID3        ID1        ID4        ID5
---------- ---------- ---------- ---------- ---------- ----------1          1          1          1          4          42          2          2          2          2          2
#或者:
ITMS5_1@hfzcdb> SELECT * from t01  JOIN t02 ON t01.id1=t02.id1;ID1        ID2        ID3        ID1        ID4        ID5
---------- ---------- ---------- ---------- ---------- ----------1          1          1          1          4          42          2          2          2          2          2

自然连接

自然连接是在两张表中寻找那些数据类型和列名都相同的字段,然后自动地将他们连接起来,并返回所有符合条件按的结果。

我们也可以将自然连接理解为内连接的一种。

ITMS5_1@hfzcdb> SELECT * from t01 Natural JOIN t02;ID1        ID2        ID3        ID4        ID5
---------- ---------- ---------- ---------- ----------1          1          1          4          42          2          2          2          2

左外连接:

ITMS5_1@hfzcdb> SELECT * FROM t01 a LEFT OUTER JOIN t02 b ON a.id1=b.id1;ID1        ID2        ID3        ID1        ID4        ID5
---------- ---------- ---------- ---------- ---------- ----------1          1          1          1          4          42          2          2          2          2          23          3          3

右外连接

ITMS5_1@hfzcdb> SELECT * FROM t01 a RIGHT OUTER JOIN t02 b ON a.id1=b.id1;ID1        ID2        ID3        ID1        ID4        ID5
---------- ---------- ---------- ---------- ---------- ----------1          1          1          1          4          42          2          2          2          2          24          6          6

全外连接

ITMS5_1@hfzcdb> SELECT * FROM t01 a FULL OUTER JOIN t02 b ON a.id1=b.id1;   # outer可以省略ID1        ID2        ID3        ID1        ID4        ID5
---------- ---------- ---------- ---------- ---------- ----------1          1          1          1          4          42          2          2          2          2          24          6          63          3          3

交叉连接(笛卡尔积)

SELECT * FROM t01 CROSS JOIN t02;ITMS5_1@hfzcdb> SELECT * FROM t01 CROSS JOIN t02;ID1        ID2        ID3        ID1        ID4        ID5
---------- ---------- ---------- ---------- ---------- ----------1          1          1          1          4          41          1          1          2          2          21          1          1          4          6          62          2          2          1          4          42          2          2          2          2          22          2          2          4          6          63          3          3          1          4          43          3          3          2          2          23          3          3          4          6          6ITMS5_1@hfzcdb> select * from t01,t02;ID1        ID2        ID3        ID1        ID4        ID5
---------- ---------- ---------- ---------- ---------- ----------1          1          1          1          4          41          1          1          2          2          21          1          1          4          6          62          2          2          1          4          42          2          2          2          2          22          2          2          4          6          63          3          3          1          4          43          3          3          2          2          23          3          3          4          6          6

嵌套循环(Nested Loops):简称NL

  • nestloop 适用于大小表关联 小表做外表(驱动表,放内存中),外表(被驱动表)每返回一行数据,内表需要做一次全表扫描,该场景下适合再内表的关联键上建立索引,避免内表的多次全表扫描
select * from t_vio_violation v1,  t_vio_white_vehicle v2wherev1.plate_nbr=v2.plate_nbr   and  v1.violation_time > sysdate -100Plan Hash Value  : 284138460 -----------------------------------------------------------------------------------------------
| Id  | Operation                      | Name                | Rows | Bytes | Cost | Time     |
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |                     |    1 |   886 |   15 | 00:00:01 |
|   1 |   NESTED LOOPS                 |                     |    1 |   886 |   15 | 00:00:01 |
|   2 |    NESTED LOOPS                |                     |   33 |   886 |   15 | 00:00:01 |
|   3 |     TABLE ACCESS FULL          | T_VIO_WHITE_VEHICLE |    1 |   359 |    2 | 00:00:01 |
| * 4 |     INDEX RANGE SCAN           | IDX_PLATE_NBR_01    |   33 |       |    2 | 00:00:01 |
| * 5 |    TABLE ACCESS BY INDEX ROWID | T_VIO_VIOLATION     |    8 |  4216 |   13 | 00:00:01 |
-----------------------------------------------------------------------------------------------Predicate Information (identified by operation id):
------------------------------------------
* 4 - access("V1"."PLATE_NBR"="V2"."PLATE_NBR")
* 5 - filter("V1"."VIOLATION_TIME">SYSDATE@!-100)

小表做外表(驱动表,放内存中)–T_VIO_WHITE_VEHICLE ,外表(被驱动表)–T_VIO_VIOLATION

遵循最上最右先执行的原则。

(归并)排序合并连接(Sort Merge Join):SMJ

merge join 因为要排序,因此性能要差于hash join,若关联键上有索性,性能也不错, 适用于关联键已有索引并且支持不等值连接 <= >=

【排序合并连接分为两个阶段】

1、Sort 阶段:两边集合按照连接字段进行排序。

2、Merge 阶段:排序好的两边集合进行相互合并(Merge)操作。

select  /*+ ordered use_merge(v2) */* from t_vio_violation v1,  t_vio_white_vehicle v2wherev1.violation_time > sysdate -100andv1.plate_nbr=v2.plate_nbrPlan Hash Value  : 3221625541 ------------------------------------------------------------------------------------------------
| Id  | Operation             | Name                | Rows    | Bytes      | Cost   | Time     |
------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |                     |       1 |        886 | 523280 | 00:00:41 |
|   1 |   MERGE JOIN          |                     |       1 |        886 | 523280 | 00:00:41 |
|   2 |    SORT JOIN          |                     | 6026069 | 3175738363 | 523277 | 00:00:41 |
| * 3 |     TABLE ACCESS FULL | T_VIO_VIOLATION     | 6026069 | 3175738363 | 103631 | 00:00:09 |
| * 4 |    SORT JOIN          |                     |       1 |        359 |      3 | 00:00:01 |
|   5 |     TABLE ACCESS FULL | T_VIO_WHITE_VEHICLE |       1 |        359 |      2 | 00:00:01 |
------------------------------------------------------------------------------------------------Predicate Information (identified by operation id):
------------------------------------------
* 3 - filter("V1"."VIOLATION_TIME">SYSDATE@!-100)
* 4 - access("V1"."PLATE_NBR"="V2"."PLATE_NBR")
* 4 - filter("V1"."PLATE_NBR"="V2"."PLATE_NBR")  

(散列)哈希连接(Hash Join):简称HJ

hash join 仅适用于等值关联,两表中较小的表的关联键放内存中做hash散列再去窥探大表,性能较好

【哈希连接分为两个阶段】

1、Build 阶段:读取小表(Build Input)生成Hash表。 —构造阶段

2、Probe 阶段:读取大表(Probe Input)探查Hash表并进行连接。 --探查阶段

select  /*+ ordered use_hash(v2) */* from t_vio_violation v1,  t_vio_white_vehicle v2wherev1.violation_time > sysdate -100andv1.plate_nbr=v2.plate_nbrPlan Hash Value  : 1360093866 -----------------------------------------------------------------------------------------------
| Id  | Operation            | Name                | Rows    | Bytes      | Cost   | Time     |
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |                     |       1 |        886 | 235876 | 00:00:19 |
| * 1 |   HASH JOIN          |                     |       1 |        886 | 235876 | 00:00:19 |
| * 2 |    TABLE ACCESS FULL | T_VIO_VIOLATION     | 6026027 | 3175716229 | 103631 | 00:00:09 |
|   3 |    TABLE ACCESS FULL | T_VIO_WHITE_VEHICLE |       1 |        359 |      2 | 00:00:01 |
-----------------------------------------------------------------------------------------------Predicate Information (identified by operation id):
------------------------------------------
* 1 - access("V1"."PLATE_NBR"="V2"."PLATE_NBR")
* 2 - filter("V1"."VIOLATION_TIME">SYSDATE@!-100)

三种连接方式比较

NL连接sort Merge连接Hash连接
海量数据连接慢海量数据连接比较快海量数据连接很快
特别依赖索引不太依赖索引,有索引排序会快不是太依赖索引,索引快速过滤出结果
随机方式扫描数据不全是随机方式扫描数据不全是随机方式扫描数据
从SGA的buffer cache读取数据从PGA读取排序后的数据从PGA读取Hash表数据
被驱动表需要扫描多次outer表与inner表都只扫描一次outer表与inner表都只扫描一次
不需要排序需要排序的数据也是从buffer cache读取,不可避免需要构建的数据也是从buffer cache读取,不可避免
两个表都要排序不需要排序
两个表都要放到PGA,使用大量PGA 空间只把小表放在PGA中

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

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

相关文章

FileProvider高版本使用,跨进程传输文件

高版本的android对文件权限的管控抓的很严格,理论上两个应用之间的文件传递现在都应该是用FileProvider去实现,这篇博客来一起了解下它的实现原理。 首先我们要明确一点,FileProvider就是一个ContentProvider,所以需要在AndroidManifest.xml里面对它进行声明: <provideran…

golang 嵌入式armv7l压缩编译打包

编译 Go 应用程序 go build -ldflags"-s -w" -o myapp.exe . 使用 UPX 压缩可执行文件&#xff08;window下载并设置环境变量&#xff09; upx --best --lzma myapp.exe 可从10M压缩到1M 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 …

45.坑王驾到第九期:Mac安装typescript后tsc命令无效的问题

点赞收藏加关注&#xff0c;你也能主打别墅&#xff01; 一、问题描述 Mac上终端运行如下命令&#xff1a; sudo npm install typescript -g //全局安装ts提示成功安装后&#xff0c;我测试tsc -v这个命令时出现如下错误&#xff1a; 也就是说找不到 tsc 命令。 二、解决方…

【图像检测】深度学习与传统算法的区别(识别逻辑、学习能力、泛化能力)

识别逻辑 深度学习 使用了端到端的学习策略&#xff0c;直接学习从图像到检测结果的映射关系&#xff0c;自动提取特征&#xff0c;并且根据特征与特征之间的关系&#xff0c;计算出检测结果。 传统算法 则是人工提取特征&#xff0c;比如边缘特征&#xff0c;直线特征&#x…

sysbench压测DM的高可用切换测试

一、配置集群 1. 配置svc.conf [rootlocalhost dm]# cat /etc/dm_svc.conf TIME_ZONE(480) LANGUAGE(CN)DM(192.168.112.139:5236,192.168.112.140:5236) [DM] LOGIN_MODE(1) SWITCH_TIME(300) SWITCH_INTERVAL(200)二、编译sysbench 2.1 配置环境变量 [dmdba~]# vi ~/.bas…

【网络】网络抓包与协议分析

网络抓包与协议分析 一. 以太网帧格式分析 这是以太网数据帧的基本格式&#xff0c;包含目的地址(6 Byte)、源地址(6 Byte)、类型(2 Byte)、数据(46~1500 Byte)、FCS(4 Byte)。 Mac 地址类型 分为单播地址、组播地址、广播地址。 单播地址&#xff1a;是指第一个字节的最低位…

安宝特方案 | AR助力紧急救援,科技守卫生命每一刻!

在生死时速的紧急救援战场上&#xff0c;每一秒都至关重要&#xff01;随着科技的发展&#xff0c;增强现实&#xff08;AR&#xff09;技术正在逐步渗透到医疗健康领域&#xff0c;改变着传统的医疗服务模式。 安宝特AR远程协助解决方案&#xff0c;凭借其先进的技术支持和创新…

2025职业院校技能大赛信息安全管理与评估(河北省) 任务书

2025职业院校技能大赛信息安全管理与评估--河北省 任务书 模块一网络平台搭建与设备安全防护任务1&#xff1a;网络平台搭建 &#xff08;50分&#xff09;任务2&#xff1a;网络安全设备配置与防护&#xff08;250分&#xff09; 模块二网络安全事件响应、数字取证调查、应用程…

vscode 远程连接ssh 密钥方式

目录 1. powershell 生成key&#xff1a; 2. 在服务器上安装公钥 3).为了确保连接成功&#xff0c;输入如下指令以保证以下文件权限正确&#xff1a; 3 开启 ssh 密钥登录 vscode 远程连接配置 python连接 python实现 1. powershell 生成key&#xff1a; 在命令行执行s…

【数据库入门】关系型数据库入门及SQL语句的编写

1.数据库的类型&#xff1a; 数据库分为网状数据库&#xff0c;层次数据库&#xff0c;关系型数据库和非关系型数据库四种。 目前市场上比较主流的是&#xff1a;关系型数据库和非关系型数据库。 关系型数据库使用结构化查询语句&#xff08;SQL&#xff09;对关系型数据库进行…

【通俗理解】ELBO(证据下界)——机器学习中的“情感纽带”

【通俗理解】ELBO&#xff08;证据下界&#xff09;——机器学习中的“情感纽带” 关键词提炼 #ELBO #证据下界 #变分推断 #机器学习 #潜变量模型 #KL散度 #期望 #对数似然 第一节&#xff1a;ELBO的类比与核心概念【尽可能通俗】 ELBO&#xff0c;即证据下界&#xff0c;在…

react后台管理系统(二)

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;React篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来React篇专栏内容:react后台管理系统(二) 前言 本文档旨在详细说明如何在一个基于React的应用程序中实现左侧菜单…

【学习笔记】AD智能PDF导出(装配文件)

2.下一步“NEXT” 3.选择文件名称&#xff0c;下一步“NEXT” 4.可选导出原材料的BOM表 右键选择装配图“Create Assembly Drawings” 5.可以双击下图方框&#xff0c;或者右键需要编辑的标题&#xff0c;选择“Properties”&#xff0c;勾选如下图 6.装配文件&#xff0c;添加…

在win10环境部署opengauss数据库(包含各种可能遇到的问题解决)

适用于windows环境下通过docker desktop实现opengauss部署&#xff0c;请审题。 文章目录 前言一、部署适合deskdocker的环境二、安装opengauss数据库1.配置docker镜像源2.拉取镜像源 总结 前言 注意事项&#xff1a;后面docker拉取镜像源最好电脑有科学上网工具如果没有科学上…

如何构建高效的接口自动化测试框架?

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 在选择接口测试自动化框架时&#xff0c;需要根据团队的技术栈和项目需求来综合考虑。对于测试团队来说&#xff0c;使用Python相关的测试框架更为便捷。无论选…

AI Prompt Engineering

AI Prompt Engineering 简介 Prompt Engineering, 提示工程&#xff0c;是人工智能领域的一项技术&#xff0c;它旨在通过设计高效的提示词&#xff08;prompts&#xff09;来优化生成式 AI&#xff08;如 GPT、DALLE 等&#xff09;的输出。提示词是用户与生成式 AI 交互的核…

【bug】使用transformers训练二分类任务时,训练损失异常大

使用transformers训练二分类任务时&#xff0c;训练损失异常大 问题分析 问题 training_loss异常大&#xff0c;在二分类损失中&#xff0c;收敛在1~2附近&#xff0c;而eval_loss却正常&#xff08;小于0.5&#xff09; 分析 参考&#xff1a; Bug in gradient accumulation…

基于SpringBoot实现的城镇保障性住房管理系统(代码+论文)

&#x1f389;博主介绍&#xff1a;Java领域优质创作者&#xff0c;阿里云博客专家&#xff0c;计算机毕设实战导师。专注Java项目实战、毕设定制/协助 &#x1f4e2;主要服务内容&#xff1a;选题定题、开题报告、任务书、程序开发、项目定制、论文辅导 &#x1f496;精彩专栏…

springboot基于SpringBoot的社区居民诊疗健康管理系统

摘 要 社区居民诊疗健康管理系统的建设强化了社区医疗服务与居民之间的联系&#xff0c;优化了健康服务供给&#xff0c;提高了医疗资源的利用效率。它不仅有助于提升居民的健康素养和自我管理能力&#xff0c;也是推动实现全民健康信息化、构建以人为本的健康服务体系的重要步…

VSCode 间距太小

setting->font family 使用&#xff1a;Consolas, Courier New, monospace 字体