CMU 15-445 -- SortingAggregations - 08

news2024/10/6 17:55:48

CMU 15-445 -- Sorting&Aggregations - 08

  • 引言
  • Sorting
    • 为什么需要排序
    • Algorithms
      • External Merge Sort
      • 2-Way External Merge Sort
      • General External Merge Sort
        • 实例:Sort 108 pages file with 5 buffer pages:N = 108, B = 5
    • Using B+ Trees
  • Aggregations
    • Sorting Aggregation
    • Hashing Aggregation
      • Cost Analysis
  • 小节


引言

本系列为 CMU 15-445 Fall 2022 Database Systems 数据库系统 [卡内基梅隆] 课程重点知识点摘录,附加个人拙见,同样借助CMU 15-445课程内容来完成MIT 6.830 lab内容。


Sorting

为什么需要排序

需要排序算法的原因:本质在于 tuples 在 table 中没有顺序,无论是用户还是 DBMS 本身,在处理某些任务时希望 tuples 能够按一定的顺序排列,如:

  • 若 tuples 已经排好序,去重操作将变得很容易(DISTINCT)
  • 批量将排好序的 tuples 插入到 B+ Tree index 中,速度更快
  • Aggregations (GROUP BY)

Algorithms

若数据能够放入内存中,我们可以使用标准排序算法搞定,如快排;若数据无法放入内存中,就得考虑数据在 disk 与 memory 中移动的成本,以及排序算法的适配。

External Merge Sort

外部排序通常有两个步骤:

  • Sorting Phase:将数据分成多个 chunks,每个 chunk 可以完全读入到 memory 中,在 memory 中排好序后再写回到 disk 中
  • Merge Phase:将多个子文件合并成一个大文件

2-Way External Merge Sort

以下是 2-way external merge sort 的一个简单例子,假设:

  • Files 本分成 N 个 pages
  • DBMS 有 B 个 fixed-size buffers

Pass #0

  • 从 table 中读入 B pages tuples
  • 将这些 tuples 排序后写会到 disk 中
  • 每一轮成为一个 run

Pass #1,2,3,…

  • 递归地将一对 runs 合并成一个两倍长度的 run
  • 这一操作值需要 3 个 buffer pages ( 2 个用于输入,1个用于输出)
    在这里插入图片描述
    完整过程如下图所示:
    在这里插入图片描述

归并排序再数据库中的玩法

复杂度:

  • number of passes:1+ceil(log2N)
  • cost/pass:I/O 成本为 2N ,系数 2 表示读入 + 写出。
  • total cost: 2N × (number of passes)

值得注意的是:

  • 这个算法只需要 3 个 buffer pages,B=3
  • 即使 DBMS 能够提供更多的 buffer pages(B>3),2-way external merge sort 也无法充分地利用它们

如何能够利用到更多的 buffer pages ?


General External Merge Sort

将以上的 2-way external merge sort 泛化成 N-Way 的形式:

Pass #0

  • 使用 B 个 buffer pages
  • 产生 ceil(N/B) 个大小为 B 的 sorted runs

Pass #1,2,3,…

  • 合并 B-1 runs

复杂度:

  • number of passes: 1+ceil(logB−1 ceil(N/B))
  • cost/pass: 2N
  • total cost: 2N × (number of passes)

实例:Sort 108 pages file with 5 buffer pages:N = 108, B = 5

  • Pass #0: ceil(108/5) = 22 sorted runs of 5 pages each
  • Pass #1: ceil(22/4) = 6 sorted runs of 20 pages each
  • Pass #2: ceil(6/4) = 2 sorted runs of 80 pages and 28 pages each
  • Pass #3: sorted file of 108 pages

一共有 1+ceil(logB−1 ceil(N/B)) = 1+ceil(log4 22) = 4 passes


Using B+ Trees

如果被排序的表在对应的 attribute(s) 上已经建有索引,我们就可以用它来加速排序的过程,按照目标顺序遍历 B+ Tree 的 leaf pages 即可,但这里要注意有两种情况:

  • Clustered B+ Tree
  • Unclustered B+ Tree

case 1: Clustered B+ Tree

在这里插入图片描述

这种情况永远由于 external sorting。

case 2: Unclustered B+ Tree

在这里插入图片描述
这是最糟糕的情况,因为获取每个 data record 的过程都可能需要一次 I/O。

其实就是聚集索引和非聚集索引的区别,非聚集索引涉及到回表查询,效率会低一些,但是占据空间大小少很多。


Aggregations

aggregation 就是对一组 tuples 的某些值做统计,转化成一个标量,如平均值、最大值、最小值等,aggregation 的实现通常有两种方案:

  • Sorting
  • Hashing

Sorting Aggregation

在这里插入图片描述
但很多时候我们并不需要排好序的数据,如:

  • Forming groups in GROUP BY
  • Removing duplicates in DISTINCT

在这样的场景下 hashing 是更好的选择,它能有效减少排序所需的额外工作。


Hashing Aggregation

利用一个临时 (ephemeral) 的 hash table 来记录必要的信息,即检查 hash table 中是否存在已经记录过的元素并作出相应操作:

  • DISTINCT: Discard duplicate
  • GROUP BY: Perform aggregate computation

如果所有信息都能一次性读入内存,那事情就很简单了,但如若不然,我们就得变得更聪明。

hashing aggregation 同样分成两步:

  • Partition Phase: 将 tuples 根据 hash key 放入不同的 buckets
    • use a hash function h1 to split tuples into partitions on disk
      • all matches live in the same partition
      • partitions are “spilled” to disk via output buffers
    • 这里有个额外的假设,即每个 partition 能够被放到 memory 中
  • ReHash Phase: 在内存中针对每个 partition 利用 hash table 计算 aggregation 的结果

如下图所示:

在这里插入图片描述
在这里插入图片描述
在 ReHash phase 中,存着 的键值对,当我们需要向 hash table 中插入新的 tuple 时:

  • 如果我们发现相应的 GroupKey 已经在内存中,只需要更新 RunningVal 就可以
  • 反之,则插入新的 GroupKey 到 RunningVal 的键值对

在这里插入图片描述


Cost Analysis

使用 hashing aggregation 可以聚合多大的 table ?假设有 B 个 buffer pages

  • Phase #1:使用 1 个 page 读数据,B-1 个 page 写出 B-1 个 partition 的数据
  • 每个 partition 的数据应当小于 B 个 pages

因此能够聚合的 table 最大为 B×(B−1)

  • 通常一个大小为 N pages 的 table 需要大约根号N 个 buffer pages

小节

本节对应教材PDF

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

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

相关文章

JavaScript--修改 HTML 元素

这些是一些用于修改 HTML 元素的常见方法&#xff1a; 1、document.createElement(element)&#xff1a;创建 HTML 元素节点。可以使用这个方法创建一个新的 HTML 元素&#xff0c; 例如 document.createElement(div) 将创建一个 <div> 元素节点。 2、document.createA…

freemarker学习

一、Freemarker引入 二、环境搭建和测试 pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/m…

PyTorch: nn网络层-卷积层

文章和代码已经归档至【Github仓库&#xff1a;https://github.com/timerring/dive-into-AI 】或者公众号【AIShareLab】回复 pytorch教程 也可获取。 文章目录 nn网络层-卷积层1D/2D/3D 卷积一维卷积二维卷积三维卷积 二维卷积&#xff1a;nn.Conv2d()卷积尺寸计算简化版卷积尺…

华为路由器如何通过Console口进行基本配置

华为HCIA试听课程&#xff1a;不会传输层协议&#xff0c;HCIA都考不过https://mp.weixin.qq.com/s/oKAL8GvdrcHEb5O_8bEZZQ 思科CCNA试听课程&#xff1a;适合初学者&#xff1a;VLAN原理与配置https://mp.weixin.qq.com/s/toIJg1EVFImalrwzbTONTQ 组网图形 组网需求 通过Cons…

【2023,学点儿新Java-31】测试:整型和浮点型变量的使用 | 附:计算机存储单位(转换关系)| 企业真题:为什么0.1+0.2不等于0.3

前情提要&#xff1a; 【2023&#xff0c;学点儿新Java-30】变量的基本使用&#xff1a;变量的意义 | 变量的构成要素 | Java中变量的数据类型、变量的使用 | 附&#xff1a;Java中变量的作用域 | 数据类型、变量名和变量值哪个最重要&#xff1f;【2023&#xff0c;学点儿新J…

vue中使用v-for实现两次嵌套循环,判断某子元素是否显示,进行复杂表单校验

一、需求场景&#xff1a; 有以下一个使用场景&#xff0c;名称111、名称222、名称333&#xff0c;是放在一个大数组里的&#xff0c;然后通过第一层for循环显示出来的。名称333数组里又包含自己的子数组&#xff0c;子数组再通过第二次for循环展示出来。当我们选择发放方式的…

基于Javaweb实现ATM机系统开发实战(七)用户密码修改

接下来我们完成密码修改的功能&#xff0c;还是老规矩先看前端界面&#xff1a;这里我们先把需要的变量进行修改&#xff0c;然后把卡号变成不可修改&#xff1a; <% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-…

深度挖掘文物价值,VR博物馆讲好文物故事

文物不言&#xff0c;自有春秋。丝绸、字画、瓷器、古玩等&#xff0c;铺陈的是传奇&#xff0c;激荡的是灵魂。历史文物珍贵的莫过于其历史与文化的价值&#xff0c;倘若不能被更多的人欣赏、研究、传承&#xff0c;那么这些文物就很难实现“价值外溢”。 单纯的去读历史课本&…

分层解耦-三层架构

三层架构 在上篇文章的案例中写文章-CSDN创作中心 的Controller类承担了对于数据操作&#xff08;访问&#xff09;、对于对于数据的逻辑处理、以及接受请求响应数据的工作&#xff0c;对于类似的小项目来说冗杂程度还可以接收&#xff0c;但是如果项目更加复杂&#xff0c;就…

QT使用同一按钮实现打开/关闭新窗口

QT使用同一按钮实现【打开/关闭】新窗口&#xff0c;实现方案如下&#xff1a; 使用一个全局状态变量记录窗口打开状态通过该状态实现新窗口的show和close 实现代码如下&#xff1a; #include "mainwindow.h" #include "ui_mainwindow.h" #include "…

怎么用PDF24 Tools工具在线进行PDF文件合并

PDF文件是经常会被用到&#xff0c;它在我们的日常生活和工作中扮演着重要的角色。PDF文件合并是将多个PDF文件合并为单个文件&#xff0c;这个过程通常是为了方便管理多个PDF文件&#xff0c;或者将多个PDF文件合并为一个整体以便于共享或打印。既然如此&#xff0c;如何快速合…

达梦sql执行计划、HINT、索引简单应用

目录 收集统计信息. 3 1. 通过DBMS_STATS包中的方法. 3 2、删除指定表的统计信息. 3 执行计划. 3 常用执行计划操作符. 4 统计指定sql执行号的所有操作符的执行时间. 5 HINT 5 并行操作&#xff1a;. 6 查询计划重用、结果集重用. 7 示例. 8 1、收集统计信息&#x…

Comparable/Comparator

现在有一个自定义学生的学生类,里面有name属性,和age属性,我们如何去比较大小? class Student{public String name;public int age;public Student(String name, int age) {this.name name;this.age age;}Overridepublic String toString() {return "Student{" &…

路径规划算法:基于广义正态分布优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于广义正态分布优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于广义正态分布优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用…

关于博客更新的二三事

原文链接&#xff1a;关于博客更新的二三事 前言 很显然&#xff0c;正如大家所见到的&#xff0c;这一版本主题v4.7.0进行了大量的删减工作。可能正如 “大道至简” 吧&#xff0c;相比于前一版本 v3.7.1 &#xff0c;个人认为可能有点花哨&#xff08;仅个人认为&#xff09…

uni-app使用plus本地推送通知栏信息,不使用第三方个推实现消息在线统一推送、消息通知(MQTT、WebSocket、setInterval定时器)

plus.push.createMessage() 因项目一直是运行在内网&#xff0c;所以不支持使用uni-push等运行在公网的第三方个推渠道。 那就只能使用plus.push.createMessage()&#xff0c;示例代码如下&#xff1a; let content "您有一条新的消息~"; let options {"cov…

玩转CSS基础:CSS盒模型

CSS盒模型 什么是CSS盒模型&#xff1f; 完整的 CSS 盒模型应用于块级盒子&#xff0c;内联盒子只使用盒模型中定义的部分内容。模型定义了盒的每个部分 —— margin, border, padding, and content &#xff0c;合在一起就是在页面上看到的内容。为了增加一些额外的复杂性&a…

操作系统Linuxday04

Linux用户相关 Linux是多用户多任务&#xff0c;可以支持多个用户同时登录&#xff0c;并且多个用户可以执行不同的任务&#xff0c;互不影响。 不同的用户&#xff0c;有不同的权限&#xff0c;可以完成权限以内的不同的任务 用户组 如果一次性用户太多&#xff0c;分别给…

【嵌入式Linux项目】基于Linux的全志H616开发板智能垃圾桶项目

目录 一、功能需求 二、涵盖的知识点 1、wiringPi库下的相关硬件操作函数调用 2、线程&#xff08;未使用互斥锁和条件&#xff09; 3、父子进程 4、网络编程&#xff08;socket套接字&#xff09; 5、进程间通信&#xff08;共享内存和信号量&#xff09; 三、开发环境…

[MySQL]MySQL内置函数

[MySQL]MySQL内置函数 文章目录 [MySQL]MySQL内置函数1. 日期函数2. 字符串函数3. 数学函数4. 其他函数 1. 日期函数 常用日期函数如下&#xff1a; 函数名称描述current_date()获取当前日期current_time()获取当前时间current_timestamp()获取当前时间戳now()获取当前日期时…