【数据库】执行计划中的两趟算法机制原理,基于排序算法来分析,算法的限制,执行代价以及优化

基于排序的两趟算法

专栏内容

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

开源贡献

  • toadb开源库

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

文章目录

  • 基于排序的两趟算法
  • 前言
  • 概述
  • 基于排序的两趟算法原理
    • 算法流程
    • 算法限制
    • 算法代价估算
  • 总结
  • 结尾

在这里插入图片描述

前言

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

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

概述

前面几篇博客分享了一趟算法,但是对于较大的表或较大结果集时,一趟算法的限制比较明显。本文重点分享两趟算法,为什么是两趟算法呢?

首先它对于大多数情况下的表大小基本足够了;基次,在两趟算法的基础上扩展到多趟算法,也是很方便;下面我们就以排序为例,进行两趟算法的原理介绍,同时在基于排序的两趟算法基础上,也可以实现去重,分组聚集,并集,交,差,连接等操作的算法。

基于排序的两趟算法原理

对于表的数据块的数量B®大于可用缓冲区块的数量M时,我们就用到了两阶段的多路归并排序算法,这是一种外排算法。

这里同时会用到内排算法和外排算法,对于数据在内存中的排序,叫做内排算法,比如数据结构课本上的冒泡排序,选择排序等,不需要和磁盘进行交互。 而对于要排序的数据量非常大时,内存中都容纳不下时,就要采用外排算法,一部分数据暂进放到磁盘上,用时再加载进来。

算法流程

这里用到的算法叫做两阶段多路归并排序算法,它有两个阶段组成,可以对非常大的表进行排序操作。它的原理介绍如下:
首先假设我们有M个缓冲区块,表的数据块为B,而且是大于M;我们将表的数据块分成M-1组,每组的数据块就是B/(M-1);
为什么是M-1组呢,先别急,后面步骤会解答;

  • 阶段1, 不断的将表的数据块加载到M个缓冲区块中,利用内排算法进行排序,并将排好序的子表结果写到磁盘上;
  • 阶段2,将排好序的子表进行归并排序。先将M-1个子表的第一个数据块加载到M-1个缓冲区块上,第M个缓冲区块用于结果的输出。这里就限制了子表的数量,只能有M-1个子表,因为需要有一个缓冲区块记录最终排序的结果。第M个缓冲区块放满时,就将它写入磁盘,再清空,重复利用。

阶段二的主要步骤是这样的:

  • 找到所有子表中最小的元组;因为比较是在内存中完成,所以搜索的执行时间与子表的数量成线性关系。
  • 将最小的元组移到结果集缓中区块的第一个可用位置;
  • 重复执行上面两步骤;如果结果集缓冲区块满,则将它输出到磁盘,并清空后,重复利用;
  • 如果刚取出最小元组的子表,当前数据块已经空了,那么加载该子表的下一个数据块;
  • 重复上面的步骤,直到所有子表都处理完成;

算法限制

为了使两阶段多路归并排序算法,能够在两趟内完成,每个子表的数据块要最大为M,这样第一阶段就可以在内存中完成;

而第二阶段,要求子表的数量不大于M-1,每个子表的数据块为B/(M-1);

那么表的数据块总量不等式的运算得到 B <= M(M-1),也就是近似于表的块数B要小于可用缓冲区数量的平方。

这就是两趟算法的限制,不过它已经可以满足大多数情况了。

算法代价估算

在两阶段多路归并排序算法执行过程中,第一阶段读写IO次数为表的总数据块数量两倍;
在第二阶段中,需要将所有子表再读一次,然后结果集再写一遍,也是表的数据块数量的两倍;

所以两趟算法中,磁盘IO的代价是 4B,也就是表数据块数量的4倍。

总结

两趟算法被广泛使用,通过对排序应用两趟算法的机制的分享,将它的执行流程,以及存在的限制讲解清楚,同时在代价估算时,有一定衡量标准,有利于优化器的设计。

最后分享一段helloworld的代码

在C语言中,实现单例模式通常是为了确保一个类只有一个实例,并提供一个全局访问点。然而,C语言没有内置的类或对象的概念,因此我们将使用结构体和函数来模拟单例模式。

下面是一个使用单例模式的 “Hello World” 程序:

#include <stdio.h>
#include <stdlib.h>typedef struct Singleton {void (*printHello)(void);
} Singleton;void printHello(void) {printf("Hello, World!\n");
}Singleton* getInstance(void) {static Singleton instance = { .printHello = printHello };return &instance;
}int main(void) {Singleton* singleton = getInstance();singleton->printHello();return 0;
}

在这个程序中,我们定义了一个 Singleton 结构体,它包含一个 printHello 函数指针。printHello 函数用于输出 “Hello, World!”。getInstance 函数返回 Singleton 实例的指针。我们使用 static 关键字来确保 instance 只在程序运行期间被创建一次。最后,在 main 函数中,我们通过调用 getInstance 函数获取单例,并调用 printHello 函数输出 “Hello, World!”。

结尾

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

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

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

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

相关文章

Java计算二叉树从根节点到叶子结点的最大路径和

要求从根节点到叶子结点的最大路径和&#xff0c;可以通过递归遍历二叉树来实现。对于二叉树中的每个节点&#xff0c;我们都可以考虑包含该节点的最大路径和。在递归的过程中&#xff0c;我们需要不断更新全局最大路径和。 具体的思路如下&#xff1a; 递归函数设计&#xff1…

服务化通信OPC实操

实操也是基于视频进行一些笔记&#xff0c;没得写就少写了 准备 Nuget包准备&#xff1a;OPCfoundation 一般都是使用Ua&#xff0c;当然也是有&#xff1a; 客户端链接服务器参数&#xff1a;IP Port 认证 登录用户名 Session 的实例化创建 进行使用&#xff1a; 因为Ses…

数据中台具体是怎么解决数据孤岛的?_光点科技

在数字化时代&#xff0c;数据已成为企业的核心资产。然而&#xff0c;由于历史遗留问题、部门壁垒等因素&#xff0c;很多企业面临着“数据孤岛”的问题。数据孤岛是指在一个组织内&#xff0c;数据被分散在不同的系统中&#xff0c;彼此隔离&#xff0c;不能有效整合和利用。…

【版本管理 | Git 】Git最佳实践系列(一) —— LFS .gitignore 最佳实践,确定不来看看?

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

python subprocess

查看python官方文档&#xff1a;最全 p subprocess.Popen([rpng2bdf.exe,[r-o .\tst\myfont.bdf -f myfont -e 65 tst\*.png]],stdoutsubprocess.PIPE,stderr subprocess.PIPE) out,err p.communicate() print(out) 注意&#xff0c;如何将shell命令分解为参数序列可能并…

【文末送书】程序员如何化解35岁危机?

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

报表生成器Stimulsoft用户手册:深入报告

Stimulsoft Reports 是一款报告编写器&#xff0c;主要用于在桌面和Web上从头开始创建任何复杂的报告。可以在大多数平台上轻松实现部署&#xff0c;如ASP.NET, WinForms, .NET Core, JavaScript, WPF, Angular, Blazor, PHP, Java等&#xff0c;在你的应用程序中嵌入报告设计器…

canvas基础:绘制线段,绘制多边形

canvas实例应用100 专栏提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。 canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重要的帮助。 文章目录 使用…

【Linux】第二十一站:文件(一)

文章目录 一、共识原理二、C系列文件接口三、从C过渡到系统&#xff1a;文件系统调用四、访问文件的本质 一、共识原理 文件 内容 属性 文件分为打开的文件 和 没打开的文件 打开的文件&#xff1a;是谁打开的&#xff1f;是进程&#xff01;----所以研究打开的文件本质是研…

使用群晖Synology Office提升生产力:如何多人同时编辑一个文件

使用群晖Synology Office提升生产力&#xff1a;多人同时编辑一个文件 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 文章目录 使用群晖Synol…

【腾讯云云上实验室】探索向量数据库背后的安全监控机制

当今数字化时代&#xff0c;数据安全成为了企业和个人最为关注的重要议题之一。随着数据规模的不断增长和数据应用的广泛普及&#xff0c;如何保护数据的安全性和隐私性成为了迫切的需求。 今天&#xff0c;我将带领大家一起探索腾讯云云上实验室所推出的向量数据库&#xff0c…

《微信小程序开发从入门到实战》学习三十二

3.5 开发我的投票页面与使用tab栏切换页面 实现很简单&#xff0c;简单的列表页面&#xff0c;但是需要加在tabBar那里&#xff0c;加油。 3.5.1 开发我的投票页面 在app.js里的pages的数组里加上"pages/myVote/myVote"&#xff0c;保存了后出现了myVote文件夹。 …

Apache Doris 整合 FLINK 、 Hudi 构建湖仓一体的联邦查询入门

1.概览 多源数据目录&#xff08;Multi-Catalog&#xff09;功能&#xff0c;旨在能够更方便对接外部数据目录&#xff0c;以增强Doris的数据湖分析和联邦数据查询能力。 在之前的 Doris 版本中&#xff0c;用户数据只有两个层级&#xff1a;Database 和 Table。当我们需要连…

新能源钠离子电池污废水如何处理

钠离子电池作为一种新能源电池&#xff0c;已经展示出了广阔的应用前景。然而&#xff0c;随着其生产和使用规模的不断扩大&#xff0c;对其产生的污废水问题也变得越来越重要。如何处理新能源钠离子电池的污废水&#xff0c;已经成为一个必须解决的问题。 首先&#xff0c;我…

数字图像处理(实践篇)八 Harris角点检测

目录 1 涉及的OpenCV函数 2 实践 在图像中每个方向变化都很大的区域就是角点&#xff0c;一个早期的尝试是由 Chris Harris & Mike Stephens 在1998年的论文 A Combined Corner and Edge Detector 完成的。所以现在称之为 Harris角点检测。 1 涉及的OpenCV函数 cornerHa…

【深入剖析K8s】容器技术基础(三):深入理解容器镜像 文件角度

容器里的进程‘看到’’的文件系统 可能你立刻就能想到,这应该是一个关于MountNamespace的问题:容器里的应用进程理应‘看到”一套完全独立的文件系统这样它就可以在自己的容器目录&#xff08;比如 /tmp&#xff09;下进行操作’而完全不会受宿主机以及其他容器的影响。 容器…

充电桩绝缘检测原理与示例

1、背景 充电桩绝缘检测是保证电动车充电安全的重要环节&#xff0c;通过对充电桩绝缘检测单租的测量和评估&#xff0c;来判断充电桩是否存在漏电等安全隐患&#xff0c;从而保证用户及周围环境的电器安全。 绝缘电阻&#xff1a;是指在特定的条件下&#xff0c;电气设备与接…

VR全景技术助力政务服务大厅数字化,打造全新政务服务体验

引言&#xff1a; 随着科技的飞速发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术逐渐走进人们的视野。VR全景技术作为VR领域的一项重要应用&#xff0c;以其沉浸式、交互式的特点&#xff0c;正逐渐渗透到各行各业。政务服务大厅作为相关部门与民众之间的桥梁&#…

83基于matlab 的时钟时间识别GUI

基于matlab 的时钟时间识别GUI。图像去除背景-转化为二值化图像-找出对应的直线边缘-找到秒针、分针、时针对应的直线&#xff0c;并算出斜率、角度-判断时间&#xff0c;分针与时针 &#xff08;度数&#xff09;。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运…

网易云音频数据如何爬取?

在当今数字化时代&#xff0c;音频数据的获取和处理变得越来越重要。本文将详细介绍如何使用Objective-C语言构建音频爬虫程序&#xff0c;以爬取网易云音乐为案例。我们将从Objective-C的基础知识开始&#xff0c;逐步深入到爬取思路分析、构建爬虫框架、完整爬取代码等方面&a…