【数据库】物理操作的一趟扫描算法机制原理,理解关系代数据与物理计划的关系,以及代价评估的应用和算法优化

news2024/12/25 9:15:16

一趟扫描算法

专栏内容

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

开源贡献

  • toadb开源库

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

文章目录

  • 一趟扫描算法
  • 前言
  • 概述
  • 适用场景
  • 扫描迭代器
  • 扫描算法类型
  • 扫描操作应用类型
    • 一次一个元组的操作
    • 整个表的操作
      • 去重
      • 分组
  • 总结
  • 结尾

在这里插入图片描述

前言

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

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

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

概述

在前一篇博文中,我们介绍了操作符代价评估模型,根据代价来区分,在扫描操作中,如果对表的文件从磁盘只读取一遍,就叫做一趟扫描算法;并不是所有扫描能够在读取一遍时完成。

本文主要分享一趟扫描算法原理和机制,包括扫描迭代器的实现,对于一元操作和二元操作下的流程介绍。

适用场景

表扫描的操作,操作的数据块必须加载到缓冲区中,也就是在内存中使用,针对表的大小与缓存区的大小的关系,可以大致分为以下几种情况:

  • 读取一次磁盘,操作对象可以全部存放到缓冲区中,比如投影,选择操作;
  • 操作处理结果不能全部存放在缓冲区中,这就需要将中间结果的一部分再次写入磁盘,此时就需要多趟算法,比如去重等操作;

一趟算法适用于操作对象能装入缓冲区的操作,还有操作结果也能全部装入缓冲区的操作,此外就需要两趟,甚至更多趟算法。

扫描迭代器

在从基本表中获取数据时,我们并不会将整个表全部加载到缓冲区,因为数据库往往并发很多操作,分配给每个操作的缓冲区是有限的。因此,在扫描时,我们需要使用迭代器的模式,每次从迭代器中返回一个元组,然后进行处理,直到迭代器为空为止。

迭代器实现的接口主要有三个,打开表Open(), 获取一条元组GetNext(),关闭表Close();

用代码表示扫描如下:

void Open(relation r)
{
    r.Open(mode);
    curr = r;
}

tuple GetNext()
{
    t = curr.GetNext();

    return t;
}

void Close()
{
    curr.Close();
}

在GetNext调用时,会加一个数据块到缓冲区中,然后获取这个数据块上的一个元组之后返回,并迭代器中记录读取的位置,下次继续返回一个元组,直到一个块上的元组扫描完时,再加载下一个数据块。

这样就避够加载所有的数据到内存中。

扫描算法类型

一趟扫描算法根据采用的方法不同,主要有以下三种。

  • 基于排序的扫描方法;
  • 基于hash的扫描方法;
  • 基于索引的扫描方法;

在以后的扫描中,我们主要使用这三种路径进行扫描,当然索引分类也可以有好几种。

扫描操作应用类型

在物理操作中涉及到两类扫描流程,对于选择,投影可以使用一次一个元组的处理方法,而对于分组,去重操作,需要拿到全表数据之后才能处理。

下面我们看一下具体处理流程,对应的代价估计,以及可能的优化策略。

一次一个元组的操作

每次加载一个数据块到缓冲区中,然后使用迭代器的方法,一次获取一个元组,进行选择或投影操作,将得到的结果输出。

在这个流程中,缓冲区只要大于一个数据块的大小即可,操作的磁盘IO代价与表占用的数据块B相同,或者与使用hash,索引的块数相关。

如果缓冲区更多时,可以采用类似于文件系统缓存的预读策略进行优化,一次性顺序读M个数据块,这样顺序读的耗时小于随机读的。

另外,将一个数据块上的所有元组同时获取到本地缓冲区中,可以快速释放这个块,在多事务并发中,会大大降低数据块上的竞争。

整个表的操作

对于不能一条元组一条元组处理的操作,如去重和分组,主要流程描述如下:

去重

  • 从迭代器获取元组,将第一次见到的元组输出,同时将此元组保存到缓冲区块中;
  • 获取的元组,与保存在缓冲区块上的元组重复,则将它忽略;

从流程来看,为了得到唯一的元组,我们需要保存找到的元组,占用缓冲区与之前不同的时,除了一个加载表数据块外,另外的M-1个缓冲区块需要存放找到的元组的副本,每次拿到新元组时,都要在副本集中查找一遍。

能适用于一趟算法时,符合的副本全部必须能在缓冲区中存放。

这里的代价除了磁盘IO,与表的数据块有关外,如果副本数据较大时,查找的CPU耗时也是一个很大的开销,最差时能达到N平方。
所以副本存放时,可以采用查找树或者hash表的形式,减少查找开销,当然这会占用更多的缓冲区。

分组

分组操作一般配合聚合函数使用,开始扫描时,我们需要建立一个记录每个分组信息的结构,每个分组信息一个元组。当我们从迭代器中得到元组后,根据分组列的判断是旧分区还是新分区,如果是新分区,新建分组信息元组,并计算聚合数据,比如分组的count,那么就每个分组得到找到表元组时,count加1即可。

分组信息可以在迭代器开始时就全部创建,也可以在过程中扩展;最后再根据分组信息,生成输出结果。

总结

通过一趟查询算法,我们可以体会到不同操作下查询的流程,以及操作对应的代价计算,对查询优化有进一步的了解。

结尾

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

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

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

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

相关文章

【OpenGauss源码学习 —— 执行算子(Merge Join 算子)】

执行算子(Merge Join 算子) 连接算子Merge Join 算子ExecInitMergeJoin 函数MergeJoin 结构体 ExecMergeJoin 函数MergeJoinState 结构体 ExecEndMergeJoin 函数 总结 声明:本文的部分内容参考了他人的文章。在编写过程中,我们尊重…

【Linux】vim-多模式的文本编辑器

本篇文章内容和干货较多,希望对大家有所帮助👍 目录 一、vim的介绍 1.1 vi 与 vim的概念1.2 Vim 和 Vi 的一些对比 二、vim 模式之间的切换 2.1 进入vim2.2 [正常模式]切换到[插入模式]2.3 [插入模式]切换至[正常模式]2.4 [正常模式]切换至[底行模式…

【仿写实现move函数】

仿写实现move函数 一、值的类型 1.左值 描述:能够取地址的值成为左值 int a 10; const int b 15; int *pa &a; const int *pb &b;2.纯右值 描述:赤裸裸的字面值 eg(false , 3 , 12.23等) int a 13; int *p &a; //取a的地址 int …

AVD黑屏

启动android studio的AVD后,无法开启,一直处于黑屏状态 【解决方案】 1.点击 Android Virtual Device Manager中avd后面的编辑按钮 2.点击Show Advanced Settings按钮 3.找到Boot option中的Cold boot并选中 4.重启AVD

企业文件管理软件推荐:2023年5款国内外软件比较

文件管理是现代企业中一项重要而不可避免的任务,不断增长的数据量和不断变化的管理需求使得选择适合自己企业的文件管理软件尤为重要。那么哪些企业文件管理软件值得我们关注呢?本文将为您介绍几款备受好评的企业文件管理软件,帮助您做出明智…

【DevOps】一张图带你了解 DevOps 生态工具

一张图带你了解 DevOps 生态工具 ✅ 协作(Collaborate):JIRA、Confluence 大家肯定不陌生了,我之前也写过利用 Jekyll 搭建个人博客的帖子。✅ 构建(Build):常用的 SCM(Software Con…

一致性 Hash 算法 Hash 环发生偏移怎么解决

本篇是对文章《一文彻底读懂一致性哈希算法》的重写,图文并茂,篇幅较长,欢迎阅读完提供宝贵的建议,一起提升文章质量。如果感觉不错不要忘记点赞、关注、转发哦。原文链接: 《一文彻底读懂一致性Hash 算法》 通过阅读本…

4、LED闪烁

LED亮灭 使用STC-ISP软件的延时计算器自动生成延迟子函数 #include <REGX52.H> #include <INTRINS.H>//延迟函数 void Delay500ms() //12.000MHz {unsigned char i, j, k;//_nop_()需要导入<INTRINS.H>包_nop_();i 4;j 205;k 187;do{do{while (--k);}…

burp suite 2023.10 Intruder模块详解)

burp suite 2023 Intruder模块详解 Intruder 模块是Burp suite的一个重要功能&#xff0c;用于自动化攻击和对目标应用程序进行大规模的攻击测试。 其主要功能包括&#xff1a; Payloads 设置&#xff1a; 用户可以定义不同类型的 payload&#xff0c;例如字典、数字范围、定…

Python 前后端分离项目Vue部署应用

一、视图创建 from django.http import JsonResponse from django.shortcuts import render# Create your views here. from django.views import Viewclass IndexView(View):def get(self,request):# 前后端分离 &#xff08;前端JS代码渲染数据&#xff09;return JsonRespo…

用Python进行数据分析:探索性数据分析的实践与技巧(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

Elasticsearch集群部署 head监控插件 Kibana部署 Nginx反向代理 Logstash部署

一、组件介绍1、Elasticsearch&#xff1a;2 、Logstash3、Kibana4、Kafka&#xff1a;5、Filebeat: 二、 Elasticsearch集群部署服务器创建用户安装ES修改配置文件创建数据和日志目录设置JVM堆大小 #7.0默认为4G修改安装目录及存储目录权限系统优化&#xff08;1&#xff09;增…

DGL的图数据处理管道

DGL在 dgl.data 里实现了很多常用的图数据集。它们遵循了由 dgl.data.DGLDataset 类定义的标准的数据处理管道。 DGL推荐用户将图数据处理为 dgl.data.DGLDataset 的子类。该类为导入、处理和保存图数据提供了简单而干净的解决方案。 DGL中的Dataset类 它是处理、导入以及保存…

BTP-K710自定义纸张大小

进入控制面板 输入 control 打开打印机 点击查看设备和打印机 打开打印机属性 鼠标右击 -> 点击打开打印机属性 如果上面没有你想要的尺寸 点标签库 -> 选中Custom Paper-BPLZ -> 然后修改宽度和高度 -> 点击应用 选择Custom Paper-BPLZ 最后点击确定 这样…

计数问题+约瑟夫问题(map)

目录 一、计数问题 二、约瑟夫问题 一、计数问题 #include<iostream> #include<map> using namespace std; int main() {int n,x;cin>>n>>x;map<int,int>m;for(int i1;i<n;i){if(i>1 && i<10){m[i];}else{int temp i;while (…

Task.Run为什么会存在内存泄漏的风险?

由于值类型是拷贝方式的赋值&#xff0c;捕获的本地变量和类成员是指向各自的值&#xff0c;对本地变量的捕获不会影响到整个类。但如果把类中的值类型改为引用类型&#xff0c;那这两者最终指向的是同一个对象值&#xff0c;这是否意味着使用本地变量还是无法避免内存泄漏&…

1.如何修改seruat对象的行名 2.FeaturePlot如何把所有阳性表达的spot放到图的前面

本有解决标题中的两个问题 1.答案是修改不了&#xff0c;不如重新制作一个seurat对象。 试图使用rownames&#xff08;obj&#xff09;featurenames是不成功的 记录 客户需求遇到一个问题&#xff1a;作者提供的rds文件行名为ensemble id&#xff0c;如何改成gene symbol。 …

解决hbuilder使用android studio模拟器不能热更新

hbuilder使用android studio模拟器编&#xff0c;在编写代码时&#xff0c;不能热更新&#xff0c;总是需要重启虚拟机中的程序&#xff0c;hbuilderx的版本是3.1.22&#xff0c;android studio的版本是4.2.2 同时在hbuilderx中出现如下报错信息&#xff1a; 报错信息&#x…

ASP产品通过网络安全专用产品安全认证

什么是网络安全专用产品安全检测&#xff1f; 网络安全专用产品安全检测是指对网络关键设备和网络安全专用产品进行安全性评估和检测&#xff0c;以确保其符合相关标准和法规的要求&#xff0c;能够有效地抵御网络攻击和威胁。该检测由具备资格的机构进行&#xff0c;采用认证…

禁止指定电脑程序运行的2种方法

你可能要问了&#xff0c;为什么要禁止电脑程序运行呢&#xff0c;因为有的公司要净化公司的工作环境&#xff0c;防止某些刺头员工在公司电脑上瞎搞。也有部分家长&#xff0c;是为了防止自己家的孩子利用电脑乱下载东西。 今天就分享2种禁止指定电脑程序运行的方法&#xff1…