首页 > 其他分享 >CaltechCS122 笔记:Assignment 1: NanoDB Set-Up and Storage Layer

CaltechCS122 笔记:Assignment 1: NanoDB Set-Up and Storage Layer

时间:2023-08-14 09:14:04浏览次数:42  
标签:NanoDB Set tuple Assignment update 空间 datapage null page

Assignment 1: NanoDB Set-Up and Storage Layer

NanoDB 是加州理工大学 Caltech CS122 课程使用的教学数据库系统

buffer pool manager

lab1 的第二部分是实现充分利用空间的 bpm,当前所给出的 bpm 代码 pin/unpin 的调用存在问题,当进行大规模数据的 insert 操作时,会出现空间不够用的问题。

getFirstTuple 方法:在文件中找出第一个 tuple,并构造 HeapFilePageTuple 对象。

需要 unpin 的几个部分

  1. HeaderPage
  2. QueryPlan 处理完的 tuple
  3. 在 SelectNode 中不满足 predicate 的 tuple

修改

  1. HeapFileManager
  2. HeaderPage
  3. DataPage

Insert 性能优化

当前 Insert 的执行流程

  1. 从 PageNo = 1 的 page 开始寻找能容纳当前 tupleSize 的 datapage
  2. 在 datapage 中,从 slot0 开始,寻找合适的插入位置。

由上述流程可知,其 insert 操作的时间复杂度为 O(n^2)

storageManager.loadDBPage()

使用这个方法,可以得到给定 PageNode 的 dbPage,因此我们可以在 loadDBPage 方法的外面来设计数据结构,让其能够直接找到拥有空闲空间的 dbPage。

DataPage 在文件中的结构

img

File and Offset

File.Seek(pageNo)

当我们拥有了 pageNo 后,用过 seek 方法,可以定位到 pageNode 后,通过 seek 方法,可以定位到 pageNo 在文件中的位置。

dataPage address = pageNo * pageSize;

DataStruct

img

如图所示,我们可以在每个 datapage 的结尾预留 2 个 bytes 的空间来存储当前 dataPage 的 freeSpace 的大小。

  1. 因此,每个 page 的 getTupleEnd 的值要 -2
  2. 与此同时,当我们插入 tuple 时,还要更新此 DataPage 的空闲空间记录区域的值。
  3. 当删除 tuple 时,也要更新空闲空间记录区域的值。
  4. 当初始化一个 datapage 时,空闲空间记录区域的值也要进行初始化。

所以当初始化一个 DataPage 时,其大小初始化为 8192 - 4,即每个 page 的前后 2 个 byte 都不需要使用。

Find DataPage

现在即使存储了每个 page 的空闲空间的大小,在 insert 的过程中,还是会要遍历每个 page 到内存,所以为了提高 insert 的执行效率,应尽量减少从磁盘读 page 的次数。

为了加速 insert 的速度, side 中给出了 2 种方法 :1. List of Non-Fill Blocks 2. Free-Space Bitmap

img

img

实现 SQL 中的 update语句和 delete 语句

首先进行 update 语句代码的调试

  1. update 语句
update tablename set column=value
where clause

value 值可以是 NULL,也可以是 int,float 这样的定长数据类型,或者 varchar 这样的变长数据类型。

从单元测试入手,在 TestHeapFileFormat.java 文件的 TestUpdate 方法开始调试。

img

由代码可以看出,对 value 值,null 和非 null 是分开处理的:

Page 的结构如下图所示:

img

update value 为 null

  1. 对 column_idx 所指定的 column 设置 null 值

如果该 column 本身就是 null 值,直接返回,如果本身的 column 不为 null 值。需要进行如下的处理:

  1. 将 tuple 中的 bitmap 中该列的标识置为空。
  2. 删除该列的数据(会对数据进行移动)
  3. 更新 valueOffset 的内容

update value 为非 null

当进行 update 时,如果 set 的值为非 null,需要考虑以下几个方面:

  1. 原来的列是一个空值,和原来的列是一个变长值
  2. 原来的列是一个非空值,且是一个定长的数据类型

对于第一种情况,处理流程如下:

  1. 分配一块空间在 datapage 中
  2. 调用 writeNonNullValue 方法
  3. 更新相关的数据结构

对于第二种情况,直接调用 writeNonNullValue 即可。

对于空间的开辟

  1. 当原值为 NULL 时需要开辟新的空间
  2. 当原值为 varchar 且空间不够时需要开辟新的空间,当空间多出来的时候,需要回收空间。

标签:NanoDB,Set,tuple,Assignment,update,空间,datapage,null,page
From: https://www.cnblogs.com/qwerty-ll/p/17479833.html

相关文章

  • nacos 使用 MySQL8.x 出现 Nacos No DataSource set异常解决
    http://www.taodudu.cc/news/show-6345954.html?action=onClick nacos使用MySQL8.x出现NacosNoDataSourceset异常解决注:当前版本nacos2.1.0 1、nacos默认室mysql5.7当链接mysql8.x,会出现异常【NacosNoDataSourceset】解决:在nacos安装目录下新建plugins/mysql文......
  • local variable referenced before assignment
    在函数内部更改全局变量就会出现此错误。对于全局变量的修改如果全局变量是int或者str,那么如果想要在函数中对函数变量进行修改,则需要先在函数内,声明其为global,再进行修改如果是list或者dict则可以直接修改摘选:https://blog.csdn.net/weixin_48419914/article/details/12200......
  • Unity的AssetPostprocessor之Model之动画:深入解析与实用案例 3
    UnityAssetPostprocessor的Model的动画相关的函数修改实际应用在Unity中,AssetPostprocessor是一个非常有用的工具,它可以在导入资源时自动执行一些操作。其中,Model的动画相关的函数修改可以帮助我们在导入模型时自动修改动画相关的函数,从而提高我们的工作效率。本文将介绍如何使......
  • LeetCode 7022——熟悉TreeSet数据结构及常用方法的使用
    LeetCode7022.限制条件下元素之间的最小绝对差题目描述:给你一个下标从 0 开始的整数数组 nums 和一个整数 x 。请你找到数组中下标距离至少为 x 的两个元素的 差值绝对值 的 最小值 。换言之,请你找到两个下标 i 和 j ,满足 abs(i-j)>=x 且 abs(nums[i......
  • C++STL库 二分查找,以及对set集合进行二分查找,来源于”leetcode7022. 限制条件下元素之
    C++的头文件<algorithm>中有用于二分查找的函数,lower_bound()、upper_bound()以及binary_search():lower_bound():返回大于等于目标值的第一个位置upper_bound():返回大于目标值的第一个位置,binary_search():若目标值存在则返回true,否则返回false参数列表:(起始位置,结束位置,目标值) ......
  • 制作catvsdog_path_dataset.tfrecords的代码 数据集制作完成路径为: E:\catanddog\t
    #-*-coding:utf-8-*--##PROJECT_NAME:081200#Name:01#Author:GG#Date:2023/8/12importtensorflowastfimportosimportnumpyasnpimportcv2file_dir="E:\\catanddog\\train0"save_dir="E:\\catanddog\\train1"images=[]#每张图片的路径......
  • How to set z-index order in Canvas using javascript All In One
    Howtosetz-indexorderinCanvasusingjavascriptAllInOne如何使用javascript在Canvas中设置z-index顺序globalCompositeOperation//全局作用域globalscopeconstcvs=document.querySelector("#canvas");constctx=canvas.ge......
  • setup的执行时机
    setup是在beforeCreate之前执行的,也就是vue实例还未被创建,因为setup中并没有this指针<script>exportdefault{setup(){console.log('setup......')},beforeCreate(){console.log('beforeCreate....')},}</script>......
  • Superset基于Windows在线及离线搭建
    Superset简介:官网这么说:Supersetisfast,lightweight,intuitive,andloadedwithoptionsthatmakeiteasyforusersofallskillsetstoexploreandvisualizetheirdata,fromsimplelinechartstohighlydetailedgeospatialcharts.一款轻量级的BI工具,从数据......
  • PostgreSQL - limit offset SQL优化
    这个案例来自项目组最近一直在做性能优化的一个案列,我们项目每周都有通过Kibana(EFLK)导出性能周报,最近一周出现一个分页查询的API出现了slowcall(响应大于1秒),我们对代码和SQL进行了review,Code部分这里省略掉,讲下SQL的部分,下面是SQLselectt.id,t.xxfromxx_tabletwhe......