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,一经查实,立即删除!

相关文章

如何理解Lua 使用虚拟堆栈

虚拟堆栈的基本概念 Lua使用虚拟堆栈来实现Lua和C&#xff08;或其他宿主语言&#xff09;之间的交互。这个虚拟堆栈是一个数据结构&#xff0c;用于存储Lua的值&#xff0c;如数字、字符串、表、函数等。它在Lua状态机&#xff08;lua_State&#xff09;内部维护&#xff0c;为…

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

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

【大数据知识】ClickHouse入门

ClickHouse入门 概述一、主要应用场景二、技术特点三、性能表现四、限制与不足五、使用建议 分布式架构一、架构特点二、核心组件三、数据组织方式四、分布式查询原理五、优势与局限性 核心架构一、ClickHouse执行过程架构二、ClickHouse数据存储架构 为什么速度这么快存储层&a…

C# .Net Core通过StreamLoad向Doris写入CSV数据

以下代码可以只关注StreamLoad具体实现。 1.创建StreamLoad返回值Model public class StreamLoadResponse {public long TxnId { get; set; }public string Label { get; set; }public string Comment { get; set; }public string TwoPhaseCommit { get; set; }public string…

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 命令。 二、解决方…

CircuitBreaker机制详解:Elasticsearch中的资源管理

CircuitBreaker机制详解:Elasticsearch中的资源管理 在现代软件架构中,熔断器(CircuitBreaker)是一种重要的模式,用于防止系统过载并保护系统稳定性。在Elasticsearch中,熔断器机制尤其关键,因为它们帮助管理资源使用,防止节点因资源耗尽而崩溃。本文将深入探讨Elasti…

测试岗位应该学什么

以下是测试岗位需要学习的一些关键内容&#xff1a; 1. 测试理论和方法 - 了解不同类型的测试&#xff0c;如功能测试、性能测试、压力测试、安全测试、兼容性测试等。 - 掌握测试策略和测试计划的制定。 2. 编程语言 - 至少熟悉一种编程语言&#xff0c;如 Python、Java…

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

识别逻辑 深度学习 使用了端到端的学习策略&#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;是指第一个字节的最低位…

日常工作笔记: python3 windows命令行 print中文报错

由于工作需要&#xff0c;近期在写python。在测试py文件时&#xff0c;发现了一个问题&#xff1a; 在cmd窗口打印中文会报错。使用try catch也捕获不到异常&#xff0c;十分烦恼&#xff01; print(中文) 网上搜索了各类解决方案&#xff0c;有在代码文件头加编码格式的&…

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

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

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

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

aws服务(二)机密数据存储

在AWS&#xff08;Amazon Web Services&#xff09;中存储机密数据时&#xff0c;安全性和合规性是最重要的考虑因素。AWS 提供了多个服务和工具&#xff0c;帮助用户确保数据的安全性、机密性以及合规性。以下是一些推荐的存储机密数据的AWS服务和最佳实践&#xff1a; 一、A…

vscode 远程连接ssh 密钥方式

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

C++:设计模式-单例模式

单例模式&#xff08;Singleton Pattern&#xff09;是一种设计模式&#xff0c;确保一个类只有一个实例&#xff0c;并且提供全局访问点。实现单例模式的关键是防止类被多次实例化&#xff0c;且能够保证实例的唯一性。常见的实现手法包括懒汉式、饿汉式、线程安全的懒汉式等。…

《深入浅出HTTPS​​​​​​​​​》读书笔记(9):对称加密算法

在密码学中&#xff0c;用于数据加密的算法主要有两种&#xff0c;分别是对称加密算法&#xff08;Symmetric-key Algorithms&#xff09;和非对称加密算法&#xff08;Asymmetrical Cryptography&#xff09;。 对称加密算法一般是通过一个算法和一个密钥&#xff08;secret k…

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

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

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

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