CMU15-445-Spring-2023-Project #2 - 前置知识(lec07-010)

Lecture #07_ Hash Tables

Data Structures

image.png

Hash Table

哈希表将键映射到值。它提供平均 O (1) 的操作复杂度(最坏情况下为 O (n))和 O (n) 的存储复杂度。
由两部分组成: Hash Function和Hashing Scheme(发生冲突后的处理)

Hash Functions

DBMS 一般只关注散列速度和冲突率,不考虑安全性
SOTA:Facebook XXHash3

Static Hashing Schemes

静态散列方案是一种散列表大小固定的方案。

  • Linear Probe Hashing
    • 线性探针
    • 散列函数将键映射到槽。当发生碰撞时,线性搜索相邻的插槽,直到找到一个打开的插槽。删除时设置一个删除标记而不是真正的删除。
  • Robin Hood Hashing
    • 线性探针散列的一种扩展,旨在减少每个key与其在散列表中的原本位置之间的最大距离(距离记为dis)。
    • 线性探测过程中,若插入的key的dis比当前slot记录的dis大,就将其替换,并将旧key重新向后插入。
  • Cuckoo Hashing
    • 使用具有不同哈希函数种子的多个哈希表;
    • 插入时,检查每个表,挑选有空闲位置的表;
    • 如果没有空闲的位置,则将随机一个表中冲突位置的旧元素驱逐出去,然后重新哈希找到新的位置;

Dynamic Hashing Schemes

动态散列方案能够根据需要调整哈希表的大小,而无需重建整个表。

  • Chained Hashing
    • 链表法
  • Extendible Hashing
    • hash7.12.pnghash81.png
  • Linear Hashing
    • 这种方案不会在数据桶溢出时立即拆分,而是维护一个拆分指针,跟踪下一个要拆分的数据桶。无论该指针是否指向已溢出的数据桶,数据库管理系统都会进行拆分

Lecture #08_ Tree Indexes

Table Indexes

表索引是表列子集的复制,通过对这些属性的子集进行组织或排序,以实现高效访问。因此,DBMS可以对表索引进行查找,以更快地找到某些图元,而不是执行顺序扫描。DBMS 确保表和索引的内容在逻辑上始终保持同步。

B+Tree

B+Tree 是一种自平衡树形数据结构,它能保持数据排序,并允许在 O(log(n))内进行搜索、顺序访问、插入和删除。
B-Trees 在所有节点中存储键和值,而 B+ 树只在叶子节点中存储值。现代的 B+Tree 实现结合了其他 B-Tree 变体的特征,例如 B link-Tree 中使用的同胞指针。
image.png
B+Tree 是一棵 M 向搜索树(其中 M 代表一个节点可拥有的最大子节点数),具有以下属性:

  • 它是完全平衡的(即每个叶节点的深度相同);
  • 除根节点外,每个内部节点至少有一半(M/2 <= 键数 <= M - 1);
  • 每个有 k 个键的内部节点都有 k+1 个非空子节点;

对于叶节点,键来自索引所基于的属性。每个节点上的k/v数组几乎都是按键排序的。叶节点值的两种方法是记录 ID 和元组数据。记录 ID 指的是元组位置的指针,通常是主键。拥有元组数据的叶子节点会在每个节点中存储元组的实际内容。
对于内部节点来说,值包含指向其他节点的指针,而键可以被看作是引导桩。 它们引导着树的遍历,但并不代表叶子节点上的键(以及它们的值)。内部节点只拥有叶子节点中的键
对于重复的key,一种方法是增加记录id作为key的一部分,另一种方法是允许叶节点溢出到包含重复密钥的溢出节点中。
表按照主键指定的排序顺序,以堆栈或索引组织的存储方式存储。 由于有些 DBMS 总是使用聚类索引,因此如果表没有显式主键,它们就会自动将隐藏行 id 作为主键。如果使用聚类索引的属性访问图tuple,DBMS可以直接跳转到页面。
由于直接从非聚类索引中检索tuple的效率很低,因此 DBMS 可以先找出它需要的所有tuple,然后根据它们的页面 id 对它们进行排序。

B+Tree Design Choices

Node Size一般取决于存储介质或者workload。
删除后立即合并叶子节点可能会导致混乱,大量连续的删除和插入操作会导致不断的拆分和合并。可以设置分批合并,即多个合并操作同时进行,从而减少在树上进行昂贵的写入延迟的时间。
支持可变长度的键:

  • 不直接存储键,而是存储一个指向键的指针。由于必须为每个键追逐一个指针的效率很低,在生产中使用这种方法的只有嵌入式设备,因为其微小的寄存器和高速缓存可以从这种空间节省中受益;
  • 我们可以将每个密钥的大小设置为最大密钥的大小,然后将所有较短的密钥填充,而不是改变密钥的大小。在大多数情况下,这样做会极大地浪费内存;
  • 最常用的方法是在单独的字典中用k/v索引来代替键。嵌入一个指针数组,该指针映射到节点内的键 + 值列表。

image.png
节点内搜索:

  • O(n) 线性搜索;
  • 更有效的搜索方案是对每个节点进行排序,并使用二分搜索来查找键。每次搜索的复杂度只有 O(ln(n))。不过,由于我们必须维护每个节点的排序,因此插入的成本会更高;
  • 利用插值法来找到关键字。这种方法会利用节点存储的元数据(如最大元素、最小元素、平均值等),并利用这些元数据生成关键字的大致位置;

Optimizations

由于 B+Tree 的每个节点都存储在缓冲池中的一个页面中,因此每次加载一个新页面时,都需要从缓冲池中获取该页面。为了完全跳过这一步,可以存储实际的原始指针来代替页面 ID。与手动获取整个树并手动放置指针相比,我们只需在正常遍历索引时存储页面查找产生的指针即可。需要注意的是,我们必须跟踪哪些指针被转换,并在指针指向的页面被unpin和驱逐时,将指针转换回页面 ID。
在 B+Tree 的初始构建过程中,按照常规方法插入每个键会导致不断的拆分操作。由于我们已经给叶子提供了同级指针,所以如果我们构建一个叶子节点的排序链表,然后使用每个叶子节点的第一个键自下而上地建立索引,那么初始插入数据的效率就会高得多。
前缀压缩。
对于非唯一key,只存储一次key。
只存储将查找正确路由到叶子节点所需的最小前缀。

Lecture #09_ Index Concurrency Control

Index Concurrency Control

逻辑正确性:这意味着线程能够读取它应该读取的值,例如,线程应该读回它之前写入的值。
物理正确性:这意味着对象的内部表示是正确的,例如,数据结构中不存在会导致线程读取无效内存位置的指针。

Locks vs. Latches

image.png

Latch Implementations

实现latch的基本原理是现代 CPU 提供的原子比较和交换(compare-and-swap,CAS)指令。通过该指令,线程可以检查内存位置的内容,查看其是否具有特定值。如果有,CPU 就会将旧值换成新值。否则,内存位置将保持不变。

  • Blocking OS Mutex
    • image.png
  • Test-and-Set Spin Latch (TAS)
    • image.png
  • Reader-Writer Latches
    • image.png

Hash Table Latching

在动态哈希表上相对更复杂。

  • page latch:每个页面都有自己的读写锁,保护其全部内容。线程在访问页面前会获得一个读写锁。这降低了并行性,因为每次可能只有一个线程能访问一个页面,但访问页面中的多个插槽对单个线程来说速度很快,因为它只需获取一个锁存器。
  • slot latch:每个插槽都有自己的锁存器。这增加了并行性,因为两个线程可以访问同一页面上的不同插槽。但这会增加访问表的存储和计算开销,因为线程必须为访问的每个槽获取一个锁存器,而且每个槽都必须为锁存器存储数据。DBMS 可以使用单模式锁存器(即spin latch)来减少元数据和计算开销,但代价是一定的并行性。

利用CAS也是一种方法。

B+Tree Latching

image.png
Basic:
image.png
Improved:
image.png
B+树代码必须能应对失败的锁存器获取。由于latch的持有时间(相对)较短,如果线程试图获取叶节点上的latch,但该latch不可用,那么它应迅速中止操作(释放持有的任何latch),然后重新开始操作。

Lecture #10_ Sorting & Aggregation Algorithms

Query Plan

数据库系统会将 SQL 编译成查询计划。查询计划是一棵运算符树。

Sorting

DBMS 需要对数据进行排序,因为根据关系模型,表中的tuple没有特定的顺序。排序使用 ORDER BY、GROUP BY、JOIN 和 DISTINCT 操作符。如果需要排序的数据适合内存,那么 DBMS 可以使用标准排序算法(如快排)。如果数据不适合在内存中进行排序,那么 DBMS 就需要使用外部排序,这种排序可以根据需要溢出到磁盘,并且优先选择顺序 I/O,而不是随机 I/O。
如果查询包含一个带 LIMIT 的 ORDER BY,那么 DBMS 只需扫描一次数据就能找到前 N 个元素。这就是 top-n 堆排序。堆排序的理想情况是前 N 个元素都在内存中,这样 DBMS 只需在扫描数据时维护一个内存中的优先队列即可。
外部合并排序是对大到内存无法容纳的数据进行排序的标准算法。这是一种 "分而治之 "的排序算法,它将数据分割然后分别进行排序。
image.png
外部合并排序的一种优化方法是在后台预取下一次运行,并在系统处理当前运行时将其存储在第二个缓冲区中。这样可以持续利用磁盘,减少每一步 I/O 请求的等待时间。
对于 DBMS 来说,使用现有的 B+tree 索引辅助排序有时比使用外部合并排序算法更有优势。特别是,如果索引是聚簇索引,DBMS 就可以直接遍历 B+tree 索引。由于索引是聚类的,数据将以正确的顺序存储,因此 I/O 访问将是顺序的。

Aggregations

实现聚合有两种方法:排序和散列。
排序:DBMS 首先根据 GROUP BY 键对图元进行排序。如果所有数据都在缓冲池中(如 quicksort),可以使用内存内排序算法;如果数据大小超出内存,可以使用外部合并排序算法。然后,DBMS 会对排序后的数据执行顺序扫描,以计算聚合。运算符的输出将按键排序。在执行排序聚合时,必须对查询操作进行排序,以最大限度地提高效率。 例如,如果查询需要过滤,最好先执行过滤,然后对过滤后的数据进行排序,以减少需要排序的数据量。
哈希:

  1. Partition:使用哈希函数 h1,根据目标哈希键将tuple分组到磁盘上的分区。这将把所有匹配的元组放入同一个bucket。假设共有 B 个缓冲区,我们将有 B-1 个输出缓冲区和 1 个输入缓冲区。如果任何分区已满,数据库管理系统就会将其溢出到磁盘。
  2. ReHash:对于磁盘上的每个分区,将其页面读入内存,并根据第二个哈希函数 h2 建立一个内存哈希表。然后遍历哈希表中的每个桶,将匹配的tuple集中起来计算聚合。假设每个分区都适合内存。

image.png

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python】使用tkinter设计开发Windows桌面程序记事本(2)

上一篇&#xff1a;【Python】使用tkinter设计开发Windows桌面程序记事本&#xff08;1&#xff09;-CSDN博客 下一篇&#xff1a; 作者发炎 此代码模块是继承上一篇文章的代码模块的基础上开始设计开发的。 如果不知道怎么新建"记事本项目"文件夹&#xff0c;请参…

【高等数学之泰勒公式】

一、从零开始 1.1、泰勒中值定理1 什么是泰勒公式?我们先看看权威解读: 那么我们从古至今到底是如何创造出泰勒公式的呢? 由上图可知&#xff0c;任一无穷小数均可以表示成用一系列数字的求和而得出的结果&#xff0c;我们称之为“无穷算法”。 那么同理我们想对任一曲线来…

C2-4.2.2 决策树-纯度+信息熵+信息增益

C2-4.2.2 决策树-纯度信息熵信息增益 1、首先了解他的应用背景——决策树 其实说白了&#xff0c;就是一个二叉树 2、纯度 我们举一个买黄金的例子吧&#xff01;黄金有999 和 9999 。 他们是有区别的&#xff0c;代表着黄金的纯度&#xff08;相对杂质而言&#xff09;&…

JMS消息发送

目录 概述1.搭建 JMS 环境2.使用JmsTemplate 发送消息3.接收JMS 消息 概述 JMS是一个Java标准&#xff0c;定义了使用消息代理(message broker)的通用API,在2001年提出。长期以来&#xff0c;JMS一直是Java 中实现异步消息的首选方案。在JMS 出现之前每个消息代理都有其私有的…

MongoDB 启动提示错误code=killed, signal=ABRT

1.停止MongoDB sudo systemctl stop mongod 2.检查数据损坏 sudo mongod --repair --dbpath /var/lib/mongodb 3.赋权限 chown -R mongodb:mongodb /var/lib/mongodb chown mongodb:mongodb /tmp/mongodb-27017.sock 如果不赋权限&#xff0c;启动的时候则会提示 4.启动Mo…

python 工作目录 与 脚本所在目录不一致

工作目录&#xff1a;执行脚本的地方 我以为工作目录会是当前执行脚本的目录位置&#xff0c;但其实不是&#xff0c;例如&#xff1a; 图中红色文件为我执行的脚本文件&#xff0c;但是实际的工作目录是PYTHON LEARNING 可以用如下代码查询当前工作目录&#xff1a; import os…

2024年甘肃省职业院校技能大赛 “信息安全管理与评估”赛项样题卷①

2024年甘肃省职业院校技能大赛 高职学生组电子与信息大类信息安全管理与评估赛项样题 第一阶段&#xff1a;第二阶段&#xff1a;模块二 网络安全事件响应、数字取证调查、应用程序安全第二阶段 网络安全事件响应第一部分 网络安全事件响应第二部分 数字取证调查第三部分 应用程…

redis可视化工具 RedisInsight

redis可视化工具 RedisInsight 1、RedisInsight是什么2、下载RedisInsight3、使用RedisInsight4、其他redsi可视化工具 1、RedisInsight是什么 RedisInsight 是一个用于管理和监控 Redis 数据库的图形用户界面&#xff08;GUI&#xff09;工具。它是由 Redis Labs 开发的&…

Linux驱动学习—输入子系统

1、什么是输入子系统&#xff1f; 输入子系统是Linux专门做的一套框架来处理输入事件的&#xff0c;像鼠标&#xff0c;键盘&#xff0c;触摸屏这些都是输入设备&#xff0c;但是这邪恶输入设备的类型又都不是一样的&#xff0c;所以为了统一这些输入设备驱动标准应运而生的。…

CHS_01.2.1.1+2.1.3+进程的概念、组成、特征

CHS_01.2.1.12.1.3进程的概念、组成、特征 进程进程的概念 进程的组成——PCB进程的组成——PCB进程的组成——程序段、数据段知识滚雪球&#xff1a;程序是如何运行的&#xff1f;进程的组成进程的特征 知识回顾与重要考点 从这个小节开始 我们会正式进入第二章处理机管理相关…

【前端】使用javascript开发一个在线RGB颜色转换

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是是《前端》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌…

领英Linkedin自动跳转中国站点的解决方案

linkedin放弃中国市场后&#xff0c;在国内打开linkedin.com&#xff0c;会自动跳转到 linkedin.cn&#xff0c;无法与国际友人在同一个平台上联系。 按照搜到的方法尝试解决&#xff0c;包括修改浏览器默认语言、清除浏览数据、使用软路由上的插件给 linkedin.com设置从国外线…

CentOS本地部署SQL Server数据库无公网ip环境实现远程访问

文章目录 前言1.安装GeoServer2. windows 安装 cpolar3. 创建公网访问地址4. 公网访问Geo Servcer服务5. 固定公网HTTP地址 前言 GeoServer是OGC Web服务器规范的J2EE实现&#xff0c;利用GeoServer可以方便地发布地图数据&#xff0c;允许用户对要素数据进行更新、删除、插入…

使用 CMake 和 Ninja 构建 C/C++ 项目的教程

使用 CMake 和 Ninja 构建 C/C 项目的教程 CMake 是一个跨平台的开源构建工具&#xff0c;它简化了项目的构建过程。而 Ninja 是一个快速、轻量级的构建系统&#xff0c;与 CMake 配合使用可以提高项目的构建效率。本教程将向你介绍如何使用 CMake 和 Ninja 来构建你的 C/C 项…

版本控制背景知识

版本控制背景知识 本文是关于 Git 系列文章的导读&#xff0c;我们先介绍一下版本控制的背景知识。 什么是版本控制 版本控制是一种记录一个或若干文件内容变化&#xff0c;以便将来查阅特定版本修订情况的系统。它将什么时候、什么人更改了文件的什么内容等信息如实记录下来…

代码随想录算法训练营第一天|数组理论基础、704二分查找、27移除元素

数组理论基础 一维数组 数组中的元素在内存空间中是连续的数组名与数组中第一个元素的地址相同&#xff08;一维数组&#xff09;数组的下标从0开始删除数组的元素其实是用后面的元素覆盖掉要删除的元素数组的长度不能改变 二维数组 二维数组是按照行存储的&#xff0c;也是…

Vue入门四(组件介绍与定义|组件之间的通信)

文章目录 一、组件介绍与定义介绍定义1&#xff09;全局组件2&#xff09;局部组件 二、组件之间的通信1&#xff09;父组件向子组件传递数据2&#xff09;子传父通信 一、组件介绍与定义 介绍 组件(Component)是Vue.js 最强大的功能之一&#xff0c;它是html、css、js等的一个…

STK 特定问题建模(五)频谱分析(第二部分)

文章目录 简介三、链路分析3.1 星地链路干扰分析3.2 频谱分析 简介 本篇对卫星通信中的频谱利用率、潜在干扰对频谱的影响进行分析&#xff0c;以LEO卫星信号对GEO通信链路影响为例&#xff0c;分析星地链路频谱。 建模将从以下几个部分开展&#xff1a; 1、GEO星地通信收发机…

稀疏矩阵的三元组表示----(算法详解)

目录 基本算法包括&#xff1a;&#xff08;解释都在代码里&#xff09; 1.创建 2.对三元组元素赋值 3.将三元组元素赋值给变量 4.输出三元组 5.转置&#xff08;附加的有兴趣可以看看&#xff09; 稀疏矩阵的概念&#xff1a;矩阵的非零元素相较零元素非常小时&#xff…

极少数据就能微调大模型,一文详解LoRA等方法的运作原理

原文&#xff1a;极少数据就能微调大模型&#xff0c;一文详解LoRA等方法的运作原理 最近和大模型一起爆火的&#xff0c;还有大模型的微调方法。 这类方法只用很少的数据&#xff0c;就能让大模型在原本表现没那么好的下游任务中“脱颖而出”&#xff0c;成为这个任务的专家…