已更内容 · 18 15-445-Lec10-连表算法 Join/连表的本质是把割开的关系重组起来,比如说xxx在一班,一班在3楼,把这两条关系组合起来,就可以得到“xxx在3楼”这个关系 连表时,有个原则,要尽量把小表(所占页数较少的表)放在左侧(此时这个小表也叫驱动表),后面会讲到,这会减少硬盘IO次数 join算子的输出 ...
判断bucket_idx对应的局部深度是否等于全局深度,如果等于全局深度,接着执行步骤4,否则执行步骤6 判断directory是否已满,即Size()>=MaxSize(),若是directory已满,则直接返回false,directory未满,接着执行步骤5。 增加全局深度 分裂bucket,具体分裂流程参照后面详细步骤 回到步骤1重新尝试插入 调用bucket的Insert方法将键值...
Project 1 要我们实现一个 buffer pool,实验分为三个部分,我逐步说明。 LRU Replacement Policy 这个实验一开始主要是被方法名搞懵了,实际上其方法名是对应上层 BufferPool 来说的。LRU 管理的是 frame,存放 page 的那个 frame,而不是 page 本身。比如上层 BufferPool Pin() 了一个 page,然后上层找到该 page...
通过这个基本信息,可以获得一个新的数据信息,也就是选择基数(Selection Cardinality),定义一个 SC 函数,然后通过 tuple 数量除属性 A 下面的去重后的值的数量来计算出这个选择基数 当然,这里有一个非常重要的假设,那就是 **数据分布均匀** 那么通过这个选择基数,还能做哪些事情呢? 如果能弄清楚每个 operator 传给...
获取表堆中的元组,发现当前读取时间戳等于3,小于元组的时间戳5,那么表堆中的元组对于TX6是不可见的,需要扫描版本链表找到合适的版本。 扫描版本链表,链表中的第二个版本时间戳为3,小于等于TX6的读取时间戳,则该版本可见 获取所有的undo log, 根据表堆中的元组的值,构造出最终的结果即可 ...
而基于时间戳顺序的方案则是个乐观锁方案,因为它可以允许数据库在不获取锁的情况下对数据进行读和写。然后正确地调整出正确的 Serializable Schedule ## T/O 并发控制 数据库可以基于时间戳这种机制来对时间戳进行分配,以此来预定义这些事务的提交顺序 数据库要保证的是,如果事务 Ti 小于事务 Tj 的时间戳,那么在...
CMU15 445/645课程-Tree Based Indexes笔记 技术标签:B+Tree B+Tree 一种搜索,插入,删除都是log(n)的数据结构 a.节点可以有超过两个的子节点 b.适合顺序存取 两种访问叶子节点值得方法 1.Record IDs:指针指向元祖位置 2.Tuple Data:远足内容存在叶子节点中 B+ Tree Operations 插入 这时我们插入70 删除 首先...
一周前写完了15-445的lab3。 相比lab2,lab3的难度有所降低,但是工作量更大。主要难点在于理清各个类之间的交互方式。 可以说,这是一次面向对象编程的训练。 lab概述 这次lab需要我们实现: 1个catalog,以及下面9个executor: SEQUENTIAL SCAN INDEX SCANS ...
1. Multiple Buffer Pools 多缓冲池 优势: 可以减少多线程查询时对latch的竞争 提高数据库局部性查找能力, 比如 对表有单独的缓冲池可以定制化查询策略 2. Pre-Fetching 预取 基于查询计划预先将未用到的page取至缓冲池中, 以提高效率 pre-fetching 比如: select * from A where val between 100 AND 250 ...
执行引擎会告知Buffer Pool要什么,Buffer Pool把对应的page放入内存;内存不足时,使用替换策略进行替换。 如何构建一个Buffer Pool Manager(Buffer Cache): 需要在内存分配一块很大的区域(call malloc),由数据库自身控制。 将这块内存区域分成一个个固定大小的chunk,称作frame。内存就被组织成固定大小frame组成的array。