【数据库】执行计划中二元操作对一趟扫描算法的应用,理解代价评估的应用和优化,除了磁盘代价还有CPU计算代价不容忽略

news2024/11/29 12:46:44

二元操作的一趟算法

专栏内容

  • 手写数据库toadb
    本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。
    本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上tag,方便阶段学习。

开源贡献

  • toadb开源库

个人主页:我的主页
管理社区:开源数据库
座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.

文章目录

  • 二元操作的一趟算法
  • 前言
  • 概述
  • 并集
    • 包的并集
    • 集合的并集
  • 交集
    • 包的交集
    • 集合的交集
  • 差集
    • 包的差集
    • 集合的差集
  • 连接
  • 总结
  • 结尾

在这里插入图片描述

前言

随着信息技术的飞速发展,数据已经渗透到各个领域,成为现代社会最重要的资产之一。在这个大数据时代,数据库理论在数据管理、存储和处理中发挥着至关重要的作用。然而,很多读者可能对数据库理论感到困惑,不知道如何选择合适的数据库,如何设计有效的数据库结构,以及如何处理和管理大量的数据。因此,本专栏旨在为读者提供一套全面、深入的数据库理论指南,帮助他们更好地理解和应用数据库技术。

数据库理论是研究如何有效地管理、存储和检索数据的学科。在现代信息化社会中,数据量呈指数级增长,如何高效地处理和管理这些数据成为一个重要的问题。同时,随着云计算、物联网、大数据等新兴技术的不断发展,数据库理论的重要性日益凸显。

因此,本专栏的分享希望可以提高大家对数据库理论的认识和理解,对于感兴趣的朋友带来帮助。

概述

前一篇博文分享了一趟算法的机制和在一元操作中的应用,代价评估。本文将分享一趟算法在二元操作中的应用,代价估算,以及存在的优化点。

在关系代数中,涉及到的二元操作主要是集合操作,如并集,交集,差集,积和连接。

同样对于适用一趟算法的限制,还是可分配的缓冲区大小M,如果表足够小,或者结果集能装入缓冲区,那么就可以使用一趟算法,否则需要二趟或更多趟,这在后续博文中会分享,敬请期待。

并集

这里的并集,要区分对集合的操作还是对于包的操作。

包的并集

如果是包的并集,那可以通过一种非常简单的一趟算法计算出来,我们先通过迭代器获取到表R的每一个元组,输出到结果,然后再获取表S的每一个元组,输出到结果。

集合的并集

而对于集合的并集操作,我们需要先将较小的表S先读取加载到缓冲区中,并使用一种便于查找的数据结构,如查找树或者hash表等;将表S的所有元组输出到结果;

然后将较大表R使用迭代器,每次获取一个元组,检查在表S中是否存在,如不存在,则将此元组输出结果,如果存在的话,则忽略。 直到表R所有元组处理完成。

对于包和集合的操作,在此过程中,只需要一个缓冲区块即可,而磁盘IO的数量为两表文件所占数据块的和。

交集

这里的交集,也是要区分对集合的操作还是对于包的操作。

包的交集

包的交集处理时,也是将较小的表S先加载到缓冲区中的查找结构中,但是对于表中的重复元组,不再重复保留多个副本,而是采用元组与和它的数量计数器。

然后将第二张表R使用迭代器,每次获取一个元组,检查在表S中是否存在。

  • 如不存在,则忽略;
  • 如果存在的话,将表S中对应的数据的计数减1;此时计数已经为负值,那么就删除表S中的对应元组;
    直到表R的所有元组处理完成,最后剩余的元组中,计数器结果为0的就是结果,输出,也就是两个包中元组及元组副本数相同的部分。

集合的交集

而对于集合的交集操作,我们需要先将较小的表S先读取加载到缓冲区中,并使用一种便于查找的数据结构,如查找树或者hash表等;将表S的所有元组存放在查找数据结构中;

然后将较大表R使用迭代器,每次获取一个元组,检查在表S中是否存在,如不存在,则忽略;如果存在的话,则将此元组输出结果,直到表R所有元组处理完成。

对于包和集合的操作,在此过程中,只需要的缓冲区块是较小表的数据块再加1个,当然对于包交时,副本越多需要的缓冲区越少,而磁盘IO的数量为两表文件所占数据块的和。

差集

这里的差集,也是要区分对集合的操作还是对于包的操作。

差集是一种不能交换的操作,表R-表S的差,和表S-表R的差,是两种差集。

包的差集

包的差集处理时,也是将第一个表S先加载到缓冲区中的查找结构中,但是对于表中的重复元组,不再重复保留多个副本,而是采用元组与和它的数量计数器。

然后将第二张表R使用迭代器,每次获取一个元组,检查在表S中是否存在。

  • 如不存在,则输出到结果;
  • 如果存在的话,此时计数已经为0,那么就输出结果;如果计数大于0,将表S中对应的数据的计数减1;
    直到表R的所有元组处理完成。

集合的差集

而对于集合的差集操作,我们需要先将第一个表S先读取加载到缓冲区中,并使用一种便于查找的数据结构,如查找树或者hash表等;将表S的所有元组存放在查找数据结构中;

然后将第二张表R使用迭代器,每次获取一个元组,检查在表S中是否存在。

  • 如不存在,则忽略;
  • 如果存在的话,将表S中对应的数据删除;
    直到表R的所有元组处理完成,最后剩余的元组就是结果,输出。

对于包和集合的操作,在此过程中,只需要的缓冲区块是较小表的数据块再加1个,而磁盘IO的数量为两表文件所占数据块的和。

积操作时,将较小表S加载到缓冲区中,不需要查找结构;然后从迭代器中获取第二张表R的每一条元组,依次与表S中的每一个元组进行积的操作,并输出结果。

这个过程中,缓冲区也是需要表S的数据块数量+1个,磁盘IO是两表的数据块的和;而对于积操作时,需要元组数n平方的计算时间。

连接

这里我们以自然连接为例进行分享。
当表R(X,Y)与表S(Y,Z)进行连接时,连接属性为Y,是两表的公共属性。

先是将较小表S加载到缓中区中,建立属性Y上的查找表;
然后将第二张表R通过迭代器,获取每一条元组,检查在查找表中是否存在:

  • 如不存在,则忽略;
  • 如果存在的话,将表S中对应的元组与表R的元组组成新元组输出;
    直到表R的所有元组处理完成。

等值连接与自然连接的执行方式一样,当然我们需要考虑两个连接属性的名字不同的情况;

总结

经过上面对一趟算法在二元操作中应用的分享后,可以看到这一算法读取操作对象需要使用两表的数据块和的次数磁盘IO;需要的缓冲区数量近似于一张表的数据块数量;而在连接和积时,会额外考虑计算代价。

结尾

最后分享一段helloworld的代码
在GCC中,正确的析构函数应该使用 __attribute__((destructor))

__attribute__((destructor))  void aftermain() {  
    printf("Hello, World!\n");  
}  
  
int main() {  
    return 0;  
}

在这个示例中,aftermain 函数被设定为析构函数,这意味着当程序结束时,它将自动执行。所以,无论你的 main 函数是否返回 0aftermain 函数都会被调用并输出 “Hello, World!”。

非常感谢大家的支持,在浏览的同时别忘了留下您宝贵的评论,如果觉得值得鼓励,请点赞,收藏,我会更加努力!

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。

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

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

相关文章

makefile项目构建

makefile项目构建 OVERVIEW makefile项目构建1.概念2.make选项3.makefile语法(1)基本语法(2)系统与自定变量(3)常用函数(4)模式匹配与伪目标 4.makefile编译流程(1&#…

机器学习---贝叶斯网络与朴素贝叶斯

1. 贝叶斯法则 如何判定一个人是好人还是坏人? 当你无法准确的熟悉一个事物的本质时,你可以依靠与事物特定本质相关的事件出现的次数来判断 其本质属性的概率。如果你看到一个人总是做一些好事,那这个人就越可能是一个好人。 数学语言表达…

C# APS.NET CORE 6.0 WEB API IIS部署

1.创建 APS.NET CORE6.0 WEB API项目 默认选项即可 源代码: 项目文件展开: launchSettings.json {"$schema": "https://json.schemastore.org/launchsettings.json","iisSettings": {"windowsAuthentication"…

记录华为云服务器(Linux 可视化 宝塔面板)-- Nginx篇

文章目录 配置Nginx服务器1、添加CentOS 7系统的Nginx yum资源库2、安装Nignx服务 设置Nginx安全级别(感觉可以先不设置)步骤一步骤二如有启发,可点赞收藏哟~ 配置Nginx服务器 1、添加CentOS 7系统的Nginx yum资源库 先安装rpm apt instal…

Linux 中的 ls 命令使用教程

目录 前言 如何运用 ls 命令 1、列出带有所有权的文件和目录 2、获取以人类可读的方式显示的信息 3、列出隐藏文件 4、递归列出文件 5、在使用 ls 时对文件和目录做区分 6、列出指定扩展名的文件 7、基于大小对输出内容排序 8、根据日期和时间排序文件 让我们来总结…

Nginx:配置文件详解

一、Nginx配置文件 main配置段:全局配置 events段:定义event工作模式 http {}:定义http协议配置 支持使用变量: 内置变量:模块会提供内建变脸定义 自定义变量:set var_name value 二、 主…

动态规划学习——斐波那契数列

目录 最长的斐波那契数列子序列的长度 1.题目 2.题目接口 3.解题思路及其代码 最长的斐波那契数列子序列的长度 1.题目 如果序列x_1&#xff0c;X_2&#xff0c;...&#xff0c;x_n 满足下列条件&#xff0c;就说它是斐波那契式的: 1.n > 3 2.对于所有i2 <n&a…

中间件介绍

一、中间件介绍 官方的说法&#xff1a;中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统&#xff0c;用于在全局范围内改变Django的输入和输出。每个中间件组件都负责做一些特定的功能。 但是由于其影响的是全局&#xff0c;所以需…

HashMap的实现原;HashMap的工作原理;HashMap存储结构; HashMap 构造函数

文章目录 说一下HashMap的实现原理(非常重要)①HashMap的工作原理HashMap存储结构常用的变量HashMap 构造函数tableSizeFor() put()方法详解hash()计算原理resize() 扩容机制get()方法为什么HashMap链表会形成死循环 HashMap是我们在工作中使用到存储数据特别频繁的数据结构&am…

韵达快递查询,韵达快递单号查询,一键筛选出单号中的退回件

批量查询韵达快递单号的物流信息&#xff0c;并将其中的退回件一键筛选出来。 所需工具&#xff1a; 一个【快递批量查询高手】软件 韵达快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;第一次使用的朋友记得先注册&#xff…

短期的规划

大方向&#xff1a; 学习编程的前期 大二上学期&#xff1a; 前期追求知识点的广度&#xff1a; 对各类数据结构的了解 熟悉数据库的各类操作&#xff0c;JDBC熟练使用 与此同时&#xff0c;提高写作能力&#xff0c;学习沉淀&#xff0c;提高技术影响力 大二的寒假&…

Java中的异常语法知识居然这么好玩!后悔没有早点学习

学习异常后&#xff0c;发现异常的知识是多么的吸引人&#xff01;不仅可以用来标记错误&#xff0c;还可以自己定义一个异常&#xff0c;用来实现自己想完成的业务逻辑&#xff0c;接下来一起去学习吧 目录 一、异常的概念及体系结构 1.异常的概念 2.异常的体系结构 3.异常…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《前景导向的主动配电网智能储能软开关规划方法》

这个标题涉及到电力系统中的主动配电网&#xff08;Active Distribution Network&#xff09;以及与之相关的智能储能软开关的规划方法。下面是对标题中各个关键词的解释&#xff1a; 前景导向的&#xff08;Future-oriented&#xff09;&#xff1a; 这表明该方法是以未来发展…

2022年全国硕士研究生入学统一考试管理类专业学位联考数学试题——解析版

文章目录 2022 年全国硕士研究生入学统一考试管理类专业学位联考数学试题一、问题求解&#xff1a;第 1∼15 小题&#xff0c;每小题 3 分&#xff0c;共 45 分。下列每题给出的 A、B、C、D、E 五个选项中&#xff0c;只有一项是符合试题要求的&#xff0c;请在答&#xff0e;题…

strlen和sizeof练习题(以64位机器为例)

例一 一般情况下&#xff0c;数组名表示首元素地址&#xff0c;只有在以下的情况中数组名表示整个数组的地址&#xff1a; 1.sizeof&#xff08;数组名&#xff09;&#xff1a;这里的数组名表示整个数组&#xff0c;计算的是整个数组的大小 2.&数组名&#xff1a;这里的…

五种多目标优化算法(MOPSO、MOAHA、NSGA2、NSGA3、MOGWO)求解微电网多目标优化调度(MATLAB)

一、多目标优化算法简介 &#xff08;1&#xff09;多目标粒子群优化算法MOPSO 多目标应用&#xff1a;基于多目标粒子群优化算法MOPSO求解微电网多目标优化调度&#xff08;MATLAB代码&#xff09;-CSDN博客 &#xff08;2&#xff09;多目标人工蜂鸟算法&#xff08;MOAHA…

C语言进阶之笔试题详解(1)

引言&#xff1a; 对指针知识进行简单的回顾&#xff0c;然后再完成笔试题。 ✨ 猪巴戒&#xff1a;个人主页✨ 所属专栏&#xff1a;《C语言进阶》 &#x1f388;跟着猪巴戒&#xff0c;一起学习C语言&#x1f388; 目录 引言&#xff1a; 知识简单回顾 指针是什么 指针变…

分布式篇---第七篇

系列文章目录 文章目录 系列文章目录前言一、如何将长链接转换成短链接,并发送短信?二、长链接和短链接如何互相转换?三、长链接和短链接的对应关系如何存储?四、如何提高系统的并发能力?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一…

航天宏图——宏图1号样例数据0.5米-5米分辨率(上海部分)

简介&#xff1a; 作为航天宏图“女娲星座”建设计划的首发卫星&#xff0c;航天宏图-1号可获取0.5米-5米的分辨率影像&#xff0c;具备高精度地形测绘、高精度形变检测、高分辨率宽幅成像以及三维立体成像等能力&#xff0c;在自然资源、应急管理、水利等行业与领域具有极高的…

【开源】基于Vue和SpringBoot的数字化社区网格管理系统

项目编号&#xff1a; S 042 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S042&#xff0c;文末获取源码。} 项目编号&#xff1a;S042&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、开发背景四、系统展示五、核心源码5…