【数据库】表的连接在执行时的算法解析,嵌套循环连接算法的几种实现,多表连接中表的数量会影响什么
嵌套循环连接
专栏内容:
- 手写数据库toadb
本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。
本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上tag,方便阶段学习。
开源贡献:
- toadb开源库
个人主页:我的主页
管理社区:开源数据库
座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.
文章目录
- 嵌套循环连接
- 前言
- 概述
- 原理介绍
- 基于元组的嵌套循环连接算法
- 基于元组的循环迭代器
- 代价分析
- 基于块的嵌套循环连接算法
- 嵌套循环优化
- 总结
- 结尾
前言
随着信息技术的飞速发展,数据已经渗透到各个领域,成为现代社会最重要的资产之一。在这个大数据时代,数据库理论在数据管理、存储和处理中发挥着至关重要的作用。然而,很多读者可能对数据库理论感到困惑,不知道如何选择合适的数据库,如何设计有效的数据库结构,以及如何处理和管理大量的数据。因此,本专栏旨在为读者提供一套全面、深入的数据库理论指南,帮助他们更好地理解和应用数据库技术。
数据库理论是研究如何有效地管理、存储和检索数据的学科。在现代信息化社会中,数据量呈指数级增长,如何高效地处理和管理这些数据成为一个重要的问题。同时,随着云计算、物联网、大数据等新兴技术的不断发展,数据库理论的重要性日益凸显。
因此,本专栏的分享希望可以提高大家对数据库理论的认识和理解,对于感兴趣的朋友带来帮助。
概述
前面几篇博客介绍了查询执行中,最基本的表扫描操作中的一趟算法的应用。
本文继续介绍查询执行中,经常碰到的连接操作,涉及到两张以上表的数据,表越多效率越低,所以在实际应用中,我们要尽量减少连接当中涉及到的表的数量,下面的分享中可以找到答案。
原理介绍
对于连接操作,最通用的算法就是采用嵌套循环方式来实现,它不用区分表的大小,都可以适应。之前我们分享了一趟扫描算法,但对于嵌套循环连接来讲,它不是严格意义上的一趟算法,可以叫它一趟半算法,因为它在扫描的过程中,会重复多次读取其中一张表的数据。
这也是它通用的原因所在,占用空间只需要两个数据块的缓冲区大小。
在实际实现算法时,我们会分为两个形式,一种是基于元组的嵌套循环算法,一种是基于块的嵌套循环算法,下面就让我们看看它们的流程。
基于元组的嵌套循环连接算法
嵌套循环连接最直接的方式,就是对所涉及表的各个元组进行处理,每次从表中得到一个元组,然后遍历另一张的表的元组进行连接,再从第一张表中得到下一条元组,又重新遍历第二张表的所有元组,直到第一张表的元组遍历完。
假定表R(X,Y)与表S(Y,X)进行连接,用伪代码表示如下:
for S中的每条元组 s DOfor R中的每条元组 r DOif r 与 s 连接形成元组 t Thenoutput t;
基于元组的循环迭代器
嵌套循环连接的一个最大优点是它非常适合用于迭代器结构,这样可以避免有很多中间数据,假定关系R和S都是非空的,可以实现嵌套循环连接的三个迭代函数,示意如下:
Open()
{R.Open();S.Open();s = S.GetNext();
}GetNext()
{for(;;){r = R.GetNext();if(r == notFound){/* R是内循环表,已经遍历完 */R.Close();s = S.GetNext();if(s == notFound){/* 外层循环表 S,已经遍历完,整个结束 */return ;}/* 重新从头扫描R表 */R.Open();r = R.GetNex(); }if(r与s 能连接)break;}return r与s的连接;
}Close()
{R.Close();S.Close();
}
代价分析
这一算法需要的磁盘I/O数量,可能最多与两张表的元组行数的乘积,也就是一个双层循环的循环次数。
当连接的表数量多时,每增加一张表,就会多一层循环,可想而知,磁盘I/O数量是惊人的。
基于块的嵌套循环连接算法
对于基于元组的嵌套循环连接算法带来的I/O数量非常大,如果我们尽可能将两表更多的装入缓存当中,虽然它们都不能全部装入缓存,这样在内存中处理时,将它们一次处理多个元组的连接。
假设有缓冲区块M个,R表与S连接时,S表是较小的表,那么可以将S表的数据块加载到M-1个缓冲区块中,将连接属性建立查找表,再读取R表的一个数据块到第M个缓冲区中。
这样从R表的这个数据块上遍历元组,分别与M-1缓中区块中的S表的所有元组进行连接处理,接着再读取R表的下一个数据块,直到R表遍历一次;
然后再更新M-1个缓冲为下一批S表的数据块,重复上面的处理,直到S表遍历完成。
这样可以减少磁盘I/O的次数,每次读更多的数据块,将随机访问转为顺序访顺。
嵌套循环优化
当然,也可以通过连接属性列上的索引,找到对应的表数据块,减少访问的表数据块,当然也需要与基于块的嵌套循环算法结合。
总结
通过本文的分享,让我们对表的连接有了更深的理解,在平常编写SQL时,常听前辈们说起,连接不能超过多少张表,为什么呢?要记住,每多一张表,类似于多了一层嵌套循环,虽然有索引,代价也是相当大的。
结尾
非常感谢大家的支持,在浏览的同时别忘了留下您宝贵的评论,如果觉得值得鼓励,请点赞,收藏,我会更加努力!
作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。
相关文章:
【数据库】表的连接在执行时的算法解析,嵌套循环连接算法的几种实现,多表连接中表的数量会影响什么
嵌套循环连接 专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定期更新…...
【刷新:重新发现商业与未来】书笔记
收获 同理心:站在他人角度考虑他人感受,他人需要什么,我能提供什么;他人可以是员工,家人等;对于员工来讲核心四件事:1、薪水;2、有结果;3、有成长;4、工作开…...
Lua实现面向对象三大特性
面向对象是基于table实现的 封装 :(冒号) 自动将调用该函数的对象作为第一个参数传入 --Object就是第一参数 function Object:new() self:代表默认传入的第一个参数 _index:当自己的变量中找不到时,会默认找原表中_index指向的内容 Obj…...
竞赛python区块链实现 - proof of work工作量证明共识算法
文章目录 0 前言1 区块链基础1.1 比特币内部结构1.2 实现的区块链数据结构1.3 注意点1.4 区块链的核心-工作量证明算法1.4.1 拜占庭将军问题1.4.2 解决办法1.4.3 代码实现 2 快速实现一个区块链2.1 什么是区块链2.2 一个完整的快包含什么2.3 什么是挖矿2.4 工作量证明算法&…...
C#结合JavaScript实现上传视频到腾讯云点播平台
目录 需求 关键代码 界面元素布局 C# 实现服务端的签名类 上传视频的JS实现 视频演示 小结 需求 在云培训系统里,制作视频课件是我们的主要工作之一,制作完成后如果将这些素材存储到服务器并进行分发播放,是摆在我们面前的一个问题。…...
简单介绍一下js中的构造函数、原型对象prototype、对象原型__proto__、原型链
构造函数 function Star (uname, age){this.uname unamethis.age agethis.sing function(){ log(唱歌~) }}let xzq new Star(薛之谦, 30)let ldh new Star(刘德华, 20)log(ldh) // { uname: 刘德华, age: 20, sing: f }ldh.sing() // 唱歌~log(ldh.sing xzq.sing) // fal…...
Java基于springboot+vue开发服装商城小程序
演示视频: 小程序 https://www.bilibili.com/video/BV1rM411o7m4/?share_sourcecopy_web&vd_source11344bb73ef9b33550b8202d07ae139b 管理员 https://www.bilibili.com/video/BV1fc411D7V3/?share_sourcecopy_web&vd_source11344bb73ef9b33550b8202d07ae…...
设计模式之十二:复合模式
模式通常被一起使用,并被组合在同一个解决方案中。 复合模式在一个解决方案中结合两个或多个模式,以解决一般或重复发生的问题。 首先重新构建鸭子模拟器: package headfirst.designpatterns.combining.ducks;public interface Quackable …...
java通过年月获取当前月所有周(跨月),获取每周开始日期和结束日期
/*** 根据年月返回本月共几周,每周开始与结束日期*/public static List<Map<String, String>> queryWeek(String year, String month) throws ParseException {/** 周 **/final String[] weeks { "第一周", "第二周", "第…...
9.3 Windows驱动开发:内核解析PE结构节表
在笔者上一篇文章《内核解析PE结构导出表》介绍了如何解析内存导出表结构,本章将继续延申实现解析PE结构的PE头,PE节表等数据,总体而言内核中解析PE结构与应用层没什么不同,在上一篇文章中LyShark封装实现了KernelMapFile()内存映…...
Zephyr:Direct Distillation of LM Alignment
Zephyr:Direct Distillation ofLM Alignment IntroductionMethod Introduction dSFT已经被可以提升模型的指令遵循能力的准确性,但是student model 不会超过 teacher model。 作者认为 dSFT虽然可以让模型更好的理解用户意图,但是无法与人类…...
二叉树--算法题总结
1、利用层序遍历的产生的字符串来创建二叉树 /*** 使用层序遍历的字符串创建二叉树* param treeInfo* return*/public static TreeNode generateTreeNodeSecond(String treeInfo) {LinkedList<TreeNode> treeNodeLinkedList new LinkedList<>();if(StringUtils.is…...
PyQt6 QLabel标签控件
锋哥原创的PyQt6视频教程: 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计21条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话…...
即时通讯技术文集(第24期):音视频WebRTC好文合集 [共20篇]
为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第 24 期。 [- 1 -] 开源实时音视频技术WebRTC的现状 [链接] http://www.52im.net/article-126-1.html [摘要] 作为Google开源的技术,WebRTC并不…...
HTML+CSS+JS网页设计与制作摄影类个人网页
可以使用网页三剑客htmlcssjs实现网页设计与制作,页面排版布局高端大气。 使用HTMLCSS页面布局设计,HTMLCSSJS网页设计与制作摄影类个人网页,这是一个优质的个人网页制作。 凭借简约的设计风格、精湛的制作工艺,突破与创新的理念…...
U-boot(五):启动内核
本文主要探讨210的uboot启动内核过程。 嵌入式系统状态启动 未上电时bootloader、kernel、rootfs以镜像形式存储在启动介质中(X210为iNand/SD卡),运行时搬运到DDR中 未上电时u-boot.bin,zImage,rootfs在SD卡中各自对应的分区中,启动时去对应分区寻找(分区表一…...
tp8 使用rabbitMQ(2)工作队列
代码的参数说明在 第一小节的代码中,如果需要可移步到第一节中查看 工作队列 工作队列(又称:任务队列——Task Queues)是为了避免等待一些占用大量资源、时间的操作。当我们把任务(Task)当作消息发送到队列…...
ZKP11.4 Use CI to instantiate Fiat-Shamir
ZKP学习笔记 ZK-Learning MOOC课程笔记 Lecture 11: From Practice to Theory (Guest Lecturer: Alex Lombardi) 11.4 Use CI to instantiate Fiat-Shamir Avoid Bad Challenges Def: Given false claim x x x and a first message α \alpha α, a challenge β \beta …...
华为云编译构建CodeArts Build常见问答汇总
1.【Build】公有云编译构建是否支持导入外部机器做执行机 答:参考链接:https://support.huaweicloud.com/usermanual-devcloud/devcloud_01_0017.html • 使用代理机功能,需要配备1台4U8G或以上规格、磁盘>80GB的主机。 • 安装代理的…...
009 OpenCV 二值化 threshold
一、环境 本文使用环境为: Windows10Python 3.9.17opencv-python 4.8.0.74 二、二值化算法 2.1、概述 在机器视觉应用中,OpenCV的二值化函数threshold具有不可忽视的作用。主要的功能是将一幅灰度图进行二值化处理,以此大幅降低图像的数…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...
DAY 26 函数专题1
函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...
2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案
一、延迟敏感行业面临的DDoS攻击新挑战 2025年,金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征: AI驱动的自适应攻击:攻击流量模拟真实用户行为,差异率低至0.5%,传统规则引…...
