当前位置: 首页 > news >正文

【数据库】表的连接在执行时的算法解析,嵌套循环连接算法的几种实现,多表连接中表的数量会影响什么

嵌套循环连接

专栏内容

  • 手写数据库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通过年月获取当前月所有周(跨月),获取每周开始日期和结束日期

/*** 根据年月返回本月共几周&#xff0c;每周开始与结束日期*/public static List<Map<String, String>> queryWeek(String year, String month) throws ParseException {/** 周 **/final String[] weeks { "第一周", "第二周", "第…...

9.3 Windows驱动开发:内核解析PE结构节表

在笔者上一篇文章《内核解析PE结构导出表》介绍了如何解析内存导出表结构&#xff0c;本章将继续延申实现解析PE结构的PE头&#xff0c;PE节表等数据&#xff0c;总体而言内核中解析PE结构与应用层没什么不同&#xff0c;在上一篇文章中LyShark封装实现了KernelMapFile()内存映…...

Zephyr:Direct Distillation of LM Alignment

Zephyr&#xff1a;Direct Distillation ofLM Alignment IntroductionMethod Introduction dSFT已经被可以提升模型的指令遵循能力的准确性&#xff0c;但是student model 不会超过 teacher model。 作者认为 dSFT虽然可以让模型更好的理解用户意图&#xff0c;但是无法与人类…...

二叉树--算法题总结

1、利用层序遍历的产生的字符串来创建二叉树 /*** 使用层序遍历的字符串创建二叉树* param treeInfo* return*/public static TreeNode generateTreeNodeSecond(String treeInfo) {LinkedList<TreeNode> treeNodeLinkedList new LinkedList<>();if(StringUtils.is…...

PyQt6 QLabel标签控件

​锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计21条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话…...

即时通讯技术文集(第24期):音视频WebRTC好文合集 [共20篇]

为了更好地分类阅读 52im.net 总计1000多篇精编文章&#xff0c;我将在每周三推送新的一期技术文集&#xff0c;本次是第 24 期。 [- 1 -] 开源实时音视频技术WebRTC的现状 [链接] http://www.52im.net/article-126-1.html [摘要] 作为Google开源的技术&#xff0c;WebRTC并不…...

HTML+CSS+JS网页设计与制作摄影类个人网页

可以使用网页三剑客htmlcssjs实现网页设计与制作&#xff0c;页面排版布局高端大气。 使用HTMLCSS页面布局设计&#xff0c;HTMLCSSJS网页设计与制作摄影类个人网页&#xff0c;这是一个优质的个人网页制作。 凭借简约的设计风格、精湛的制作工艺&#xff0c;突破与创新的理念…...

U-boot(五):启动内核

本文主要探讨210的uboot启动内核过程。 嵌入式系统状态启动 未上电时bootloader、kernel、rootfs以镜像形式存储在启动介质中(X210为iNand/SD卡),运行时搬运到DDR中 未上电时u-boot.bin,zImage,rootfs在SD卡中各自对应的分区中,启动时去对应分区寻找(分区表一…...

tp8 使用rabbitMQ(2)工作队列

代码的参数说明在 第一小节的代码中&#xff0c;如果需要可移步到第一节中查看 工作队列 工作队列&#xff08;又称&#xff1a;任务队列——Task Queues&#xff09;是为了避免等待一些占用大量资源、时间的操作。当我们把任务&#xff08;Task&#xff09;当作消息发送到队列…...

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】公有云编译构建是否支持导入外部机器做执行机 答&#xff1a;参考链接&#xff1a;https://support.huaweicloud.com/usermanual-devcloud/devcloud_01_0017.html • 使用代理机功能&#xff0c;需要配备1台4U8G或以上规格、磁盘>80GB的主机。 • 安装代理的…...

009 OpenCV 二值化 threshold

一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、二值化算法 2.1、概述 在机器视觉应用中&#xff0c;OpenCV的二值化函数threshold具有不可忽视的作用。主要的功能是将一幅灰度图进行二值化处理&#xff0c;以此大幅降低图像的数…...

影墨·今颜集成微信小程序开发:打造个性化AI绘画工具

影墨今颜集成微信小程序开发&#xff1a;打造个性化AI绘画工具 想不想让用户动动手指&#xff0c;就能在微信里把脑海中的画面变成一幅画&#xff1f;或者上传一张照片&#xff0c;就能生成一张风格独特的艺术头像&#xff1f;这听起来像是未来应用&#xff0c;但其实用我们今…...

写算法咖啡拉花模板,一键成型,输出:咖啡师/家用都可用。

利用激光切割的高精度&#xff0c;制作出不锈钢或食品级亚克力的镂空模板&#xff08;Stencil&#xff09;&#xff0c;让即便是新手&#xff0c;也能一键复刻大师级的拿铁艺术。以下是完整的项目交付文档&#xff1a;项目名称&#xff1a;LatteArt-Stencil-Gen (咖啡拉花模板生…...

ADG732 32通道模拟多路复用器Arduino驱动详解

1. ADG732 32:1 模拟多路复用器 Arduino 驱动库深度解析ADG732 是 Analog Devices&#xff08;现属 Analog Devices, Inc.&#xff09;推出的高性能 CMOS 单刀三十二掷&#xff08;SP32T&#xff09;模拟开关芯片&#xff0c;专为低导通电阻、低电荷注入和高通道隔离度的精密信…...

避坑指南:为什么conda安装ipywidgets后tqdm进度条还是不显示?完整排查流程

深度排查&#xff1a;为什么conda安装ipywidgets后tqdm进度条依然消失&#xff1f; 当你满怀期待地在JupyterLab中运行数据分析脚本&#xff0c;却发现tqdm进度条只输出冷冰冰的HBox提示而非动态可视化效果时&#xff0c;这种挫败感就像等待下载进度条卡在99%。本文将从底层原理…...

**SSR渲染实战:从原理到高性能部署的完整流程与代码优化指南**在现

SSR渲染实战&#xff1a;从原理到高性能部署的完整流程与代码优化指南 在现代前端开发中&#xff0c;服务端渲染&#xff08;SSR&#xff09; 已成为提升首屏加载速度、SEO友好性和用户体验的核心技术之一。尤其在 Vue 3 Nuxt.js 或 React Next.js 等主流框架下&#xff0c;S…...

数据安全首选:Clawdbot+Qwen3:32B私有化AI平台部署全解析

数据安全首选&#xff1a;ClawdbotQwen3:32B私有化AI平台部署全解析 1. 为什么选择私有化AI平台 在金融、医疗、法律等对数据安全要求严格的行业&#xff0c;企业常常面临两难选择&#xff1a;既希望使用大语言模型提升效率&#xff0c;又担心敏感数据通过公有云API泄露。传统…...

同事.Skill出圈,打工的尽头是被AI蒸馏吗?

当你的技能被封装成一行行代码&#xff0c;你与AI同事之间&#xff0c;是竞争还是共生&#xff1f;最近职场圈最火的词&#xff1a;同事.Skill。简单说&#xff0c;就是把某个同事的核心工作能力——写周报、做PPT、处理数据、安排会议——变成一个可复用的AI技能包。其他同事安…...

OpenClaw 大结局——接入个人微信啬

本课概览 Microsoft Agent Framework (MAF) 提供了一套强大的 Workflow&#xff08;工作流&#xff09; 框架&#xff0c;用于编排和协调多个智能体&#xff08;Agent&#xff09;或处理组件的执行流程。 本课将以通俗易懂的方式&#xff0c;帮助你理解 MAF Workflow 的核心概念…...

从相亲角到星辰大海:大白话拆解数学建模四大聚类算法

目录 1. 开篇&#xff1a;为什么我们需要聚类&#xff1f;&#xff08;无监督学习的魅力&#xff09; 2. 聚类算法的“四大门派”速览 3. 第一派&#xff1a;K-Means 算法&#xff08;“物以类聚”的极简美学&#xff09; 3.1 大白话原理&#xff1a;一场快递柜的选址博弈 …...

DeepSeek-R1-Distill-Qwen-1.5B开箱即用:本地AI服务搭建全攻略

DeepSeek-R1-Distill-Qwen-1.5B开箱即用&#xff1a;本地AI服务搭建全攻略 1. 模型概述与核心优势 1.1 模型简介 DeepSeek-R1-Distill-Qwen-1.5B是DeepSeek团队基于Qwen2.5-Math-1.5B基础模型&#xff0c;通过知识蒸馏技术融合R1架构优势打造的轻量化版本。该模型专为本地部…...