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

二元操作的一趟算法

专栏内容

  • 手写数据库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.mzph.cn/news/170884.shtml

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

相关文章

C#,《小白学程序》第十九课:随机数(Random)第六,随机生成任意长度的大数(BigInteger)

1 文本格式 using System; using System.Linq; using System.Text; using System.Collections.Generic; /// <summary> /// 大数的&#xff08;加减乘除&#xff09;四则运算、阶乘运算 /// 乘法计算包括小学生算法、Karatsuba和Toom-Cook3算法 /// 除法运算为 Truffer…

Leetcode—167.两数之和 II - 输入有序数组【中等】

2023每日刷题&#xff08;四十一&#xff09; Leetcode—167.两数之和 II - 输入有序数组 实现代码 /*** Note: The returned array must be malloced, assume caller calls free().*/ int* twoSum(int* numbers, int numbersSize, int target, int* returnSize) {*returnSiz…

小程序中的大道理之四--单元测试

在讨论领域模型之前, 先继续说下关于测试方面的内容, 前面为了集中讨论相应主题而对此作了推迟, 下面先补上关于测试方面的. 测试覆盖(Coverage) 先回到之前的一些步骤上, 假设我们现在写好了 getPattern 方法, 而 getLineContent 还处于 TODO 状态, 如下: public String ge…

网络视频播放卡顿原因分析

一、问题描述 某项目通过拉摄像机rtsp流转rtmp/http-flv/ws-flv的方案&#xff0c;使用户可以在网页中观看摄像机的视频画面。在 观看视频时偶发出现卡顿现象。 二、卡顿现象分析和解决 此问题涉及的原因较多&#xff0c;所以得考虑各环节的问题可能性&#xff0c;并根据现场实…

在CentOS 7.9上搭建高性能的FastDFS+Nginx文件服务器集群并实现外部远程访问

文章目录 引言第一部分&#xff1a;FastDFS介绍与安装1.1 FastDFS简介1.2 FastDFS安装1.2.1 安装Tracker Server1.2.2 安装Storage Server 1.3 FastDFS配置1.3.1 配置Tracker Server1.3.2 配置Storage Server1.3.3 启动FastDFS服务 第二部分&#xff1a;Nginx配置2.1 Nginx安装…

Docker容器化部署若依微服务ruoyi-cloud项目

系统环境 接下来的内容以 Ubuntu 22.04.1 操作系统为例。 下载安装Docker Ubuntu hihi-IdeaCentre-GeekPro-15ICK:~$ sudo su [sudo] hi 的密码&#xff1a; roothi-IdeaCentre-GeekPro-15ICK:/home/hi# docker ps 找不到命令 “docker”&#xff0c;但可以通过以下软件包安…

Visual Studio 使用MFC 单文档工程绘制单一颜色直线和绘制渐变颜色的直线(实例分析)

Visual Studio 使用MFC 单文档工程从创建到实现绘制单一颜色直线和绘制渐变颜色的直线 本文主要从零开始创建一个MFC单文档工程然后逐步实现添加按键&#xff08;事件响应函数&#xff09;&#xff0c;最后实现单一颜色直线的绘制与渐变色直线的绘制o(&#xffe3;▽&#xffe…

【云原生】什么是 Kubernetes ?

什么是 Kubernetes &#xff1f; Kubernetes 是一个开源容器编排平台&#xff0c;管理着一系列的 主机 或者 服务器&#xff0c;它们被称作是 节点&#xff08;Node&#xff09;。 每一个节点运行了若干个相互独立的 Pod。 Pod 是 Kubernetes 中可以部署的 最小执行单元&#x…

2、Burp使用

文章目录 一、为Firefox浏览器安装数字证书二、利用Intruder模块进行暴力破解 一、为Firefox浏览器安装数字证书 &#xff08;1&#xff09;利用Firefox浏览器访问http://burp或127.0.0.1:<监听端口>&#xff0c;点击页面右上侧的“CA Certificate”处下载CA证书&#xf…

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

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

float和double(浮点型数据)在内存中的储存方法

作者&#xff1a;元清加油 主页&#xff1a;主页 编译环境&#xff1a;visual studio 2022 (x86) 相信大家都知道数据在内存中是以二进制储存的 整数的储存方法是首位是符号位&#xff0c;后面便是数值位 那么浮点数在内存中是怎么储存的呢&#xff1f;我们先来看一个例子&am…

Android WiFi的断开分析

1.wifi断开大体流程&#xff1a; 1.wifi断开 wlan-driver最先知道。 2.wlan-driver在与路由器连接的时候(未断开时), 会有周期性的beacon帧来维持连接&#xff0c;AP端一旦遇到突发事情&#xff0c;会立刻通过802.11协议的 deauth 帧/ reject 帧等 通知到 driver。 3. wlan-…

【Java程序员面试专栏 专业技能篇 】Java SE核心面试指引(四):Java新特性

关于Java SE部分的核心知识进行一网打尽,包括四部分:基础知识考察、面向对象思想、核心机制策略、Java新特性,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 本篇Blog为第四部分:Java新特性,子节点表示追问或同级提问 Java8新特性…

【部署运维】docker:入门到进阶

0 前言 部署运维博客系列一共有三篇&#xff1a; 拥抱开源&#xff0c;将工作中的经验分享出来&#xff0c;尽量避免新手踩坑。 【部署运维】docker&#xff1a;入门到进阶 【部署运维】kubernetes&#xff1a;容器集群管理掌握这些就够了 【部署运维】pythonredisceleryd…

快速、精确仿真高频电磁场的工具CST Studio Suite 2024版本下载与安装配置

目录 前言一、CST 2024 安装二、使用配置总结 前言 CST Studio Suite是一个集成的仿真工具套件&#xff0c;用于模拟和优化电子系统的性能。它包括多个工具和模块&#xff0c;如电磁仿真、结构仿真、热仿真、电路分析等&#xff0c;以支持从概念设计到生产部署的整个开发周期。…

Vue19 列表过滤

直接上代码 以下代码使用了两种实现方式&#xff0c;监视属性和计算属性 当能用计算属性实现时&#xff0c;推荐使用计算属性 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>列表过滤</title><script type&q…

阿里元境亮相第八届世界物联网大会,分享元计算对数字文旅的创新赋能

2023&#xff08;第八届&#xff09;世界物联网大会于11月20日在中国北京隆重开幕。联合国秘书长安东尼奥古特雷斯在开幕式发表书面致辞时特别提到&#xff1a;“在一个相互连接的世界&#xff0c;你们的主题‘新物联、新经济、新时代’是数字技术影响力的见证”。 11月21日上午…

Linux系统常用指令大全(图文详解)

目录 前言 一、UNIX的登录与退出 1、登录 &#xff08;1&#xff09;执行格式&#xff1a; &#xff08;2&#xff09;步骤 2、退出 二、UNIX命令格式 三、常用命令 1、目录操作 &#xff08;1&#xff09;显示目录文件 ls &#xff08;2&#xff09;建新目录 …

Android仿 美团 / 饿了么,店铺详情页功能

前言 UI有所不同&#xff0c;但功能差不多&#xff0c;商品添加购物车功能 正在写&#xff0c;写完会提交仓库。 页面主要由&#xff1a;MagicIndicator ViewPager2 Fragment CoordinatorLayout NestedScrollView RecyclerView实现。 效果图一&#xff1a;左右RecyclerV…

微机课设--汇编语言在51单片机上写一个四位十进制加法器

代码如下 KEYVAL EQU 30HKEYTM EQU 31HKEYSCAN EQU 32HDAT EQU 33HSCANLED EQU 37HS_DAT EQU 38HD_DAT EQU 39HR_DATL EQU 3AHR_DATH EQU 3BH CALFLAG EQU 3CHFLAG BIT 00HORG 0000HLJMP MAINORG 000BHLJMP T0ISRORG 0030HMAIN:MOV SP,#5FHMOV TMOD,#01HMOV TH0,#0D8HMOV TL0,…