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

一趟扫描算法

专栏内容

  • 手写数据库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.hqwc.cn/news/217728.html

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

相关文章

红外遥控实验

本章,我们将介绍 STM32F103 对红外遥控器的信号解码。STM32 板子上标配的红外接收 头和一个小巧的红外遥控器。我们将利用 STM32 的输入捕获功能,解码开发板标配的红外遥控 器的编码信号,并将编码后的键值在 LCD 模块中显示出来。 红外遥控技…

BTC 复兴:Ordinals 带来创新活力,BitVM 与 BitStream 相继问世

除了备受瞩目的 ETF,今年 Bitcoin 生态迎来全新的发展活力和机遇。Ordinals 协议的横空出世,以此为基础诞生的 BRC20 协议给整个比特币生态带去了一波新的能量,迎来铭文热度高涨。而诸如 BitVM、BitStream 等新技术甫一问世,便引发…

MT6893_天玑 1200芯片规格参数介绍_datasheet规格书

天玑 1200(MT6893)是一款专为旗舰级全新5G芯片,它融合了先进的AI、相机和多媒体技术,为用户带来令人惊叹的体验。采用先进的6纳米制程设计,内置各种先进技术。该芯片采用旗舰级的八核CPU架构设计,支持16GB强大的四通道内存以及双通…

重庆数字孪生技术推进制造业升级,工业物联网可视化应用加速

重庆数字孪生、5G、人工智能、物联网、大数据等新一代信息技术的出现及终端计算设备的发展,带来了研发模式、生产模式、消费模式、体制机制的系统性变革,企业应该建设适应工业4.0时代发展要求的新型生产体系。巨蟹数科数字孪生智能工厂通过部署多样化用例…

初出茅庐的小李博客之C语言必备知识共用体

C语言必备知识共用体 共用体是一种构造数据类型,有时候也称之为联合体。 它的用途: 使几个不同类型的变量共占一段内存。 共用体举例 union 共用体名 { 类型标识符 成员名;类型标识符 成员名; };union data //共用体名字是data{ int i; …

leetcode刷题:17.电话号码的字母组合

leetcode原题网页 题目描述:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 思路:使用vector&#x…

Guitar Pro软件8.0官方最新版本下载

Guitar Pro 8是一款由法国Arobas Music公司开发的吉他学习与MIDI音序制作辅助软件,它具有丰富的功能,包括吉他谱、六线谱、四线谱绘制、打印、查看、试听等方面,能够帮助音乐爱好者更方便地进行音乐学习和创作。Guitar Pro 8拥有独特的gtp格式…

遥遥领先!TinyEngine 低代码引擎更新升级!AI 已成功部署!

官网更新 1. 协议规范优化更新 协议规范交互优化,能够在一页里面自由切换,提高用户体验,后端SDK文档字段描述补齐,助力开发者自助进行服务端开发。 2.使用手册全新改版 去掉之前的学院课程,新设计新分类让结构一目了…

【cf 158 c】

给你一个整数数组 a1,a2,…,an ( )。在一次操作中,你可以选择一个整数 x ( ),并用 ⌊⌋ 替换 ai ( ⌊y⌋ 表示将 y 舍入为最接近的整数)。 来替换从 1 到 n 的所有 i。请注意,每次操作都会影响数组中的所有元素。打印使数组中所有元素相等所…

可验证随机函数(VRF)

文章目录 一、背景以及场景共识发展第一代 POW “以力取胜”第二代 POS/DPOS “民主投票”第三代 VRF “运气抽签” 二、可验证随机函数(VRF)快速开始1. VRF是什么?2. MD5 hash函数和VRF(Verifiable Random Function)区别3. VRF-…

【阿里云】图像识别 智能分类识别 项目开发(一)

语音模块和阿里云图像识别结合 环境准备 代码实现 编译运行 写个shell脚本用于杀死运行的进程 语音模块和阿里云图像识别结合 使用语音模块和摄像头在香橙派上做垃圾智能分类识别 语音控制摄像下载上传阿里云解析功能点实现 环境准备 将语音模块接在UART5的位置 在orange…

KVM虚拟机的NAT网络模式原理及过程展示

NAT的方式及原理 NAT方式是KVM安装后的默认方式。 它支持主机与虚拟机的互访,同时也支持虚拟机访问互联网,但不支持外界访问虚拟机。 default是宿主机安装虚拟机支持模块的时候自动安装的。 其中 virbr0是由宿主机虚拟机支持模块安装时产生的虚拟网络接…