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

news2024/12/27 0:47:50

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          1
         2          2          2
         3          3          3

ITMS5_1@hfzcdb> SELECT * FROM t02;

       ID1        ID4        ID5
---------- ---------- ----------
         1          4          4
         2          2          2
         4          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          4
         2          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          4
         2          2          2          2          2          2

自然连接

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

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

ITMS5_1@hfzcdb> SELECT * from t01 Natural JOIN t02;

       ID1        ID2        ID3        ID4        ID5
---------- ---------- ---------- ---------- ----------
         1          1          1          4          4
         2          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          4
         2          2          2          2          2          2
         3          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          4
         2          2          2          2          2          2
                                          4          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          4
         2          2          2          2          2          2
                                          4          6          6
         3          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          4
         1          1          1          2          2          2
         1          1          1          4          6          6
         2          2          2          1          4          4
         2          2          2          2          2          2
         2          2          2          4          6          6
         3          3          3          1          4          4
         3          3          3          2          2          2
         3          3          3          4          6          6
         
         
ITMS5_1@hfzcdb> select * from t01,t02;

       ID1        ID2        ID3        ID1        ID4        ID5
---------- ---------- ---------- ---------- ---------- ----------
         1          1          1          1          4          4
         1          1          1          2          2          2
         1          1          1          4          6          6
         2          2          2          1          4          4
         2          2          2          2          2          2
         2          2          2          4          6          6
         3          3          3          1          4          4
         3          3          3          2          2          2
         3          3          3          4          6          6

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

  • nestloop 适用于大小表关联 小表做外表(驱动表,放内存中),外表(被驱动表)每返回一行数据,内表需要做一次全表扫描,该场景下适合再内表的关联键上建立索引,避免内表的多次全表扫描
select * 
  from 
  t_vio_violation v1,  t_vio_white_vehicle v2
  where
  v1.plate_nbr=v2.plate_nbr   and  v1.violation_time > sysdate -100
 
  Plan 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 v2
    where
  v1.violation_time > sysdate -100
  and
   v1.plate_nbr=v2.plate_nbr
   
   
 Plan 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 v2
    where
  v1.violation_time > sysdate -100
  and
   v1.plate_nbr=v2.plate_nbr
   
   Plan 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.coloradmin.cn/o/2246814.html

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

相关文章

数据结构第一讲

数据结构定义 算法的定义 什么是好算法&#xff1f; 空间复杂度 时间复杂度 例子1 打印1到N之间的正整数 有递归和循环两种方法实现。 但是在数字变大后&#xff0c;递归的方法会导致内存占用过多而崩溃。 而循环则不会 例子2 写程序给定多项式在X处的值 从里往外算的算…

--- 文件IO java ---

文本文件和二进制文件 文件再底层其实就是以一段二进制数据的形式储存的&#xff0c;当我用记事本打开文件时&#xff0c;有些文件会出现乱码&#xff0c;这就是二进制文件&#xff0c;而有一些文件是特殊的&#xff0c;他以特定的编码方式&#xff08;比如ascll&#xff09;可…

洛谷 P1616 疯狂的采药 C语言 记忆化搜索

题目&#xff1a; https://www.luogu.com.cn/problem/P1616?contestId215526 完全背包问题&#xff0c;最后一个超出空间了。完全背包和就是无限次的拿&#xff0c;公式跟01背包差不多。 但是&#xff0c;只有当前能拿和拿不下&#xff0c;换下一个。注意要处理好边界条件。…

java基础概念37:正则表达式2-爬虫

一、定义 【回顾】正则表达式的作用 作用一&#xff1a;校验字符串是否满足规则作用二&#xff1a;在一段文本中查找满足要求的内容——爬虫 二、本地爬虫VS网络爬虫 2-1、本地爬虫 示例&#xff1a; 代码优化&#xff1a; public static void main(String[] args) {// 大…

多目标跟踪算法

文章目录 一、传统方法1. 基于卡尔曼滤波器的方法1.1 Kalman Filter(卡尔曼滤波器) 2. 基于数据关联的方法2.1 匈牙利算法 二、深度学习方法1. 基于检测的多目标跟踪1.1 SORT算法1.2 DeepSort1.3 BoT-SORT 2. 基于特征关联和增强的方法2.1 ByteTrack 3. 基于Transformer的方法3…

网络(TCP)

目录 TCP socket API 详解 bind(): 我们的程序中对myaddr参数是这样初始化的: listen(): accept(): 理解accecpt的返回值: 饭店拉客例子 connect tcp服务器和udp类似的部分代码 把套接字设置为监听状态&#xff08;listen&#xff09; 测试 查看端口号和IP地址&…

阿里云 DevOps 资源安全扫描实践

随着企业上云进程的加速&#xff0c;云资源的使用量日益增长&#xff0c;云环境中资源的安全性和稳定性成为了企业业务运营的关键要素 面对多样化的云资源和复杂的应用场景&#xff0c;传统的安全管理手段已无法完全满足企业日益严苛的安全需求。为了确保云上资源的安全性&…

WebGL进阶(十一)层次模型

理论基础&#xff1a; 效果&#xff1a; 源码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"vie…

vscode下面python调试报错ImportError: cannot import name ‘Literal‘ from ‘typing‘

1 问题描述 我在vscode下面编写python程序&#xff0c;这个程序是在一个英伟达anoconda环境下的项目。之前能运行能调试&#xff0c;最近发现只能运行ctlf5&#xff0c;但是使用f5进行调试时&#xff0c;报错“File “c:\Users\86137.vscode\extensions\ms-python.debugpy-202…

(免费送源码)计算机毕业设计原创定制:Java+JSP+HTML+JQUERY+AJAX+MySQL springboot计算机类专业考研学习网站管理系统

摘 要 大数据时代下&#xff0c;数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求&#xff0c;利用互联网服务于其他行业&#xff0c;促进生产&#xff0c;已经是成为一种势不可挡的趋势。在大学生在线计算机类专业考研学习网站管理的要求下&#xff0c;开发一…

Android 常用命令和工具解析之GPU相关

目录 1、GPU基本信息 1.1 获取GPU基本信息 1.2 伪造GPU基本信息 2、GPU内存信息 3、经典案例 案例1&#xff1a;GPU伪造信息方案 案例2&#xff1a;GPU内存统计算法 GPU 指的是 Graphics Processing Unit&#xff0c;即图形处理单元。GPU 是一种专门用于处理图形和图像相…

day03(单片机高级)RTOS

目录 RTOS(实时操作系统) 裸机开发模式 轮询方式 前后台&#xff08;中断方式&#xff09; 改进&#xff08;前后台&#xff08;中断&#xff09;&#xff09;定时器 裸机进一步优化 裸机的其他问题 RTOS的概念 什么是RTOS 为什么要使用 RTOS RTOS的应用场景 RTOS的…

cookie反爬----普通服务器,阿里系

目录 一.常见COOKIE反爬 普通&#xff1a; 1. 简介 2. 加密原理 二.实战案例 1. 服务器响应cookie信息 1. 逆向目标 2. 逆向分析 2. 阿里系cookie逆向 1. 逆向目标 2. 逆向分析 实战&#xff1a; 无限debugger原理 1. Function("debugger").call() 2. …

C++中的erase()函数用法总结

在 C 中&#xff0c;erase() 是 std::string 和 std::vector 等容器中的成员函数&#xff0c;用于删除容器中的元素。erase可以删去容器中指定位置的元素&#xff0c;容器的size&#xff08;大小&#xff09;会改变&#xff0c;但是容器的容量不变。 常用用法&#xff1a; 1.…

全面解析:HTML页面的加载全过程(四)--浏览器渲染之样式计算

主线程遍历得到的 DOM 树&#xff0c;依次为树中的每个节点计算出它最终的样式&#xff0c;称之为 Computed Style。 通过前面生成的DOM 树和 CSSOM 树&#xff0c;遍历 DOM 树&#xff0c;为每一个 DOM 节点&#xff0c;计算它的所有 CSS 属性&#xff0c;最后会得到一棵带有…

Linux|内存级文件原理

目录 进程与文件 Linux下的文件系统 文件操作&#xff0c;及文件流 C语言函数 文件流 文件描述符 系统调用操作 系统调用参数 重定向与文件描述符 输出重定向 输入重定向 文件内容属性 Linux下一切皆文件 进程与文件 当我们对文件进行操作时&#xff0c;文件必须…

40分钟学 Go 语言高并发:Context包与并发控制

Context包与并发控制 学习目标 知识点掌握程度应用场景context原理深入理解实现机制并发控制和请求链路追踪超时控制掌握超时设置和处理API请求超时、任务限时控制取消信号传播理解取消机制和传播链优雅退出、资源释放context最佳实践掌握使用规范和技巧工程实践中的常见场景…

【SpringMVC - 1】基本介绍+快速入门+图文解析SpringMVC执行流程

目录 1.Spring MVC的基本介绍 2.大致分析SpringMVC工作流程 3.SpringMVC的快速入门 首先大家先自行配置一个Tomcat 文件的配置 配置 WEB-INF/web.xml 创建web/login.jsp 创建com.ygd.web.UserServlet控制类 创建src下的applicationContext.xml文件 重点的注意事项和说明…

neo4j图数据库community-5.50创建多个数据库————————————————

1.找到neo4J中的conf文件&#xff0c;我的路径是&#xff1a;D:\Program Files\neo4j-community-5.5.0-windows\neo4j-community-5.5.0\conf 这里找自己的安装路径&#xff0c; 2.用管理员模式打开conf文件&#xff0c;右键管理员&#xff0c;记事本或者not 3.选中的一行新建一…

如何最简单、通俗地理解Python的迭代器?

我们知道迭代器&#xff08;iterator&#xff09;可以用for循环去取数&#xff0c;这和列表取数有什么区别呢&#xff1f; 想理解Python迭起器的差异&#xff0c;有个很简单的例子 打个比方&#xff0c;你去玩街头投篮机&#xff0c;可以投5个球&#xff0c;这里有两种方式&a…