CMU 15-445/645-Note4-执行篇-Sort
0.写在前面
based on CMU 15-445/645 2020fall, Lecture #10.
在关系型数据库中,我们通过声明式(Declarative)的语言SQL暴露统一的接口,屏蔽底层的实现。
SQL语句在底层是通过执行器来进行执行的。
1:数据库中的算法-Sort
面向磁盘的数据库的主要特征就是其数据不能全部装入内存(如果能够全部装入内存,很多排序算法都可能应用),这时候我们需要溢出到磁盘的外部排序。
order by、建立索引、去重(DISTINCT)等等操作都需要Sort算法的支持。
1.1外部排序
在所有的排序算法中,归并排序思想是最适合外部排序的:
1)将数据分为多个块,对每个块排序(每个块都能装入内存)
2)将多个块合并
假设总的数据大小为 N N N,BufferPool的大小为 B B B,具体的流程如下:
pass #0:首先我们可以将数据分为 N B \frac{N}{B} BN个block,即每次读 B B B 个page的数据进入内存排序。
pass #k:递归合并 B − 1 B-1 B−1 个block数据(B个BufferPool中有需要需要写,剩下的是读)。
来看一个二路归并排序的例子:
优化:如果有B+树索引,可以利用B+树索引中的元素了,因为B+树是有序的(这种方法比外部排序要好,因为它没有额外的计算。不需要进行sort、归并,而且所有的磁盘访问都是顺序的)。但这只限定聚簇索引,如果非聚簇索引可能会导致更多page I/O,最坏时可能每个record都要一次I/O。
2:数据库中的算法-Aggregation
Aggregation 包括sum/min/max/avg等操作。需要对一组tuple进行统计,所以在aggregations时需要将相同的tuple放到一起(group by)。
其实现方案有两种,Sorting和Hash。
2.1 Sorting
首先对GROUP BY键上的元组进行排序。 如果内存足够,则放入缓冲池,使用内存排序算法(例如,快速排序),如果数据大小超过内存,外部合并排序算法。
排序之后相同的元素就会在排在一起。这样就可以去除冗余元素。
2.2 Hash
但是如果我们不要求数据是有序的,hashing会一个更好的选择。
假设我们有 B B B 个buffer Pools。其中 B − 1 B - 1 B−1个Buffer Pools用来partitions而1个Buffer Pool用来存储输出data。
阶段#1:分区
使用散列函数h1将元组拆分为基于目标散列键的磁盘上的分区。 这会将匹配的所有元组放入同一个分区。 DBMS通过输出缓冲区将分区溢出到磁盘。
阶段#2:ReHash
对于磁盘上的每个分区,将其页面读入内存并基于第二个散列函数h2(其中h1 != h2)构建内存中的散列表。 然后遍历此哈希表的每个桶,将匹配的元组汇集在一起以计算聚合。
请注意,这假设每个分区都适合内存。
参考:
链接:https://www.jianshu.com/p/eb7cfa57602f
https://www.cnblogs.com/JayL-zxl/p/14432559.html
CMU 15-445/645-Note4-执行篇-Sort相关推荐
- 2021年秋季版 CMU数据库15-445/645 Note1~4
2021年秋季版 CMU数据库15-445/645 Note翻译 NOTE 这也就是说这并不是一门教你如何使用数据库去构建应用程序.网站或者其他东西课,也不是一门教你如何去管理和部署数据库的课. 我们 ...
- 第二篇:个案管理师之执行篇-台湾最佳医院信息化及管理实践
曾志仁原著,袁永福编辑整理 前言 很荣幸能向各位医疗行业的同仁介绍台湾医院的一些管理经验和实践.客观的讲,台湾更好的继承和保留了中华民族传统文化,同时台湾深受美国和日本的影响,这样台湾文化是中西方文化 ...
- JVM执行篇:使用HSDIS插件分析JVM代码执行细节--转
http://www.kuqin.com/java/20111031/314144.html 在<Java虚拟机规范>之中,详细描述了虚拟机指令集中每条指令的执行过程.执行前后对操作数栈. ...
- 手把手带你阅读Mybatis源码(二)执行篇
点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 前言 上一篇文章提到了MyBatis是如何构建配置类的,也说了MyBatis在运行过程中主 ...
- deepin系统15.6版本安装执行那个exe文件_deepin深度操作系统中常用命令、系统命令、Vi命令...
本篇文章主要介绍了深度操作系统中常用命令.系统命令.Vi命令等,您可以通过终端来输入命 令来完成相关操作. 基本命令 您可以通过以下命令来查看系统的信息,其他系统相关命令操作可自行搜索查询. 查看系统 ...
- 在线支付系列【15】微信支付实战篇之集成查询订单、支付通知API
有道无术,术尚可求,有术无道,止于术. 文章目录 前言 主动调用 商户订单号查询 回调通知 1. 添加通知回调地址 2. 通知处理 3. 通知接口 4. 测试 前言 在上篇文档中,我们简单实现了Nat ...
- 1.15运行命令直至执行成功
在日常工作中使用shell时,有时候命令只有满足某些条件或是某种外部事件,操作才能够成功执行,这种情况下,你可能系统重复执行命令,直至成功为止. 1.按照以下方式定义函数: repeat() { wh ...
- deepin系统15.6版本安装执行那个exe文件_深度系统(Deepin Linux)U盘安装教程
深度系统(Deepin Linux)U盘安装教程 同其他操作系统的安装一样,深度系统(Deepin Linux)同样可支持光盘安装.U盘安装和硬盘安装.只是目前,光盘已逐渐不再使用,组装电脑的时候光驱 ...
- deepin系统15.6版本安装执行那个exe文件_深度操作系统 deepin 20(1003)正式版发布:计算器支持科学计算,新增邮件、相机等应用...
原标题:深度操作系统 deepin 20(1003)正式版发布:计算器支持科学计算,新增邮件.相机等应用 IT之家10月22日消息 deepin 20 正式版发布一个月后,社区版本迎来了第一次更新 ( ...
最新文章
- 保存ip地址和计算机名称,批量设置IP地址和计算机名
- 用AfxExtractSubString()解析复合串
- Openstack在dashboard界面登录提示无效证书
- Linux下远程桌面连接windows
- vue-cli安装教程
- LeetCode 402. 移掉K位数字(贪心,单调栈)
- 测试工程师---笔试面试题
- 安卓中的布局属性详解
- zabbix--自动注册
- 新一代 FlinkSQL 平台,重新定义 Apache Flink 开发
- 微信小程序websocket实现即时聊天功能
- HDOJ--1162--Eddy's picture
- 付费资源不能上传了?!
- POI操作EXCEL删除行
- 常见的shell介绍(与bash功能类似的应用程序有哪些)
- linux经验总结(持续更新)
- 【接口篇 / Wan】(7.0) ❀ 02. 配置路由器上网 ❀ FortiGate 防火墙
- PS 开启GPU加速图片处理
- 换国产FPGA!!!国内哪些公司比较牛?
- 你是否还记得?那些年我们一起追过的(FIDL:Flutter界的AIDL)