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

这篇具有很好参考价值的文章主要介绍了【数据库】执行计划中的两趟算法机制原理,基于排序算法来分析,算法的限制,执行代价以及优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基于排序的两趟算法

专栏内容

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

开源贡献

  • toadb开源库

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


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

前言

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

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

概述

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

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

基于排序的两趟算法原理

对于表的数据块的数量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
如有错误或者疏漏欢迎指出,互相学习。文章来源地址https://www.toymoban.com/news/detail-754265.html

到了这里,关于【数据库】执行计划中的两趟算法机制原理,基于排序算法来分析,算法的限制,执行代价以及优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 分布式天梯图算法在 Redis 图数据库中的应用

    Redis是一个高性能的键值对数据库,支持常用的数据结构和分布式操作,被广泛应用于缓存、消息队列和排行榜等场景。除了基本的数据结构,Redis还支持图数据结构并提供了一些算法支持。 天梯图算法是一种基于贪心的图搜索算法,在寻找最短路径问题中具有很高的效率。

    2024年02月14日
    浏览(34)
  • Jmeter(七) - 从入门到精通 - 建立数据库测试计划实战<MySQL数据库>(详解教程)

    1.简介   在实际工作中,我们经常会听到数据库的性能和稳定性等等,这些有时候也需要测试工程师去评估和测试,上一篇文章主要介绍了jmeter连接和创建数据库测试计划的过程,在文中通过示例和代码非常详细地介绍给大家,希望对各位小伙伴和童鞋们的学习或者工作具有一

    2024年02月13日
    浏览(57)
  • 达梦数据库表导出的两种方法

      然后用sql查询出来所有的数据  然后右键选择结果集窗口第一行数据  -- 导出所有  然后选择你需要的类型   右键新建工程  填写你得工程名称和工程描述(随便写)  然后就会有一个工程出来 -- 在迁移那里新建一个迁移 然后接着创建名称(自己理解你这个迁移是干啥就

    2024年02月12日
    浏览(42)
  • Jmeter(六) - 从入门到精通 - 建立数据库测试计划(详解教程)

    1.简介   在实际工作中,我们经常会听到数据库的性能和稳定性等等,这些有时候也需要测试工程师去评估和测试,因此这篇文章主要介绍了jmeter连接和创建数据库测试计划的过程,在文中通过示例和代码非常详细地介绍给大家,希望对各位小伙伴和童鞋们的学习或者工作具有

    2024年02月13日
    浏览(75)
  • 【Redis,Java】Redis的两种序列化方式—nosql数据库

    redis和mysql的区别: redis是属于nosql的数据库,而mysql是属于sql数据库,redis是属于nosql数据库。mysql是存储在磁盘中的,redis是存储在内存中的,所以redis的读取书读快。这里所说的redis代表nosql,而mysql代表sql。 redis的数据库是以键值对为基础存储在内存中的,而mysql为代表的关

    2024年02月21日
    浏览(57)
  • [Vue]从数据库中动态加载阿里巴巴矢量图标的两种方式

    记录一次在Vue中动态使用阿里巴巴矢量图标库 这是本人第一次使用阿里巴巴的矢量图标库,简单的导入和使用的话网上的教程很多,这里不多赘述,本人的需求是从数据库中加载出来并且显示到页面上,接下来简述一下如何实现。 以下代码均是本人实际推敲、测试可用后写

    2024年01月20日
    浏览(53)
  • python里面将接口返回的json格式数据写入到数据库的两种方案及其局限性

    方案一: 使用MySQLdb或pymysql等Python MySQL数据库连接库将数据插入到MySQL数据库 方案二: 使用pandas库将JSON数据转换为DataFrame对象,然后使用to_sql()方法将数据存入MySQL数据库** 对整体的数据格式支持自定义处理,能处理较为复杂的数据格式 首先,我们使用json.load()函数将\\\"data.

    2024年02月14日
    浏览(44)
  • 四种数据库执行脚本文件导入数据的方式

    mysql执行sql脚本文件的方法: 1、在命令行输入mysql -uroot -h10.235.5.55 -p’123456’ -P3306 F:helloniuzi.sql 2、在命令行输入【source F:helloniuzi.sql】 mysql -uroot -h10.235.5.55 -p’123456’ -P3306 -e \\\"source test.sql \\\" test.log psql -Upostgres -dzxin -h10.235.5.55 -p6789 -f test.sql upgrade.log isql -Uzxin_smap -P’123456’

    2024年02月04日
    浏览(49)
  • sql在数据库执行正常在mybatis中执行很慢

    最近项目组压力测试发现一个BUG,某个分页查询sql在数据量变大之后,在数据库执行正常,在mybatis执行很慢。 代码如下(示例): 这样替换之后,确实变快了,但是${}的写法不能防sql注入。 代码如下(示例): 以上就是本次BUG的解决过程,原因猜测可能是数据量增长后,

    2024年02月13日
    浏览(38)
  • PHP中如何连接数据库并执行查询?

    在 PHP 中,连接数据库并执行查询通常需要使用数据库扩展库。在大多数情况下,你可以使用以下两个扩展库: MySQLi(MySQL Improved): MySQLi 是 MySQL 官方推荐的扩展库,提供了面向对象和面向过程两种方式。 面向对象方式: 面向过程方式: PDO(PHP Data Objects): PDO 是一种通

    2024年02月04日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包