整体架构
输入一个SQL语句,通过SQL语句,走到解析层
走到binder,执行查询重写
走到planner,生成一个执行计划
到optimizer,执行一个优化
到查询执行这一层
后面就是并发控制和存储层等,先不介绍
信息介绍schema模式注意到,在解释计划节点时,每个节点后面都有一长串列描述。它是这个计划节点的预期输出模式。考虑下面的例子:
1Projection { exprs=[#0.0, #0.1] } | (__mock_table_1.colA:INTEGER, __mock_table_1.colB:INTEGER)
这表示代表此计划节点的执行器将生成两列。它们都是整数类型。输出模式是在规划器中推断的。对于这个项目,您的执行器实现必须按计划节点中指定的模式精确地生成元组,否则它将无法通过检查输出的测试。
Catalog系统表/元数据/数据字典数据库维护一个内部目录以跟踪关于数据库的元数据信息。在这个项目中,可以与系统目录进行交互,以查询关于表、索引及其模式的信息。
Index Updates 索引更新对于表修改执行器(InsertExecuto ...
整体结构
父页面的内部结构
内部结构固定24B
内部页面(索引页面)除了有header,还有data字段
数据存储在KV键值对上,这里要小于4K大小
value都是指针 指向另一个页面
b+树的叶子页面
相比于非叶子页面,页面头多了一个字段NextPageId b+树的特点
树查找 getValue核心流程
从根节点开始查找
内部节点中:使用二分查找,找到大于等于key的value指针PageId,通过PageId获取到新的节点,如果是内部节点则继续这个步骤,如果是叶子节点则执行对应的查找规则。
叶子节点中:使用二分查找,找到恰好等于key的value获取RID
节点分为 internal page 和 leaf page,每个 page 上的 key 有序排列。当拿到一个 key 需要查找对应的 value 时,首先需要经由 internal page 递归地向下查找,最终找到 key 所在的 leaf page。这个过程可以简化为一个函数 Findleaf()。
Findleaf() 从 root page 开始查找。在查找到 leaf page 时直接返回,否则根据 ...
缓冲池管理器
可扩展哈希表
LRU-K淘汰算法
缓冲池
可扩展哈希 extendible hashing是一种动态哈希方法,其中目录和桶被用于哈希数据。可扩展哈希是一个有力的灵活的方法,其中哈希函数也经历动态的改变。
目录 directories
目录在指针中存储桶的地址,每个目录被分配一个id,每次目录扩张时,id可能会发生变化
桶 buckets
被用于哈希真实数据
基本结构
目录: 这个容器存储指向桶的指针。每个目录给定一个唯一的id,当扩张发生时id可能随之改变。哈希函数返回这个目录的id,这个id被用来指向合适的桶。目录的数量 = 2^{全局深度}
桶: 它们存储哈希键。目录指向桶。如果局部深度小于全局深度时,一个桶可能包含不止一个指针指向它。
全局深度:它跟目录相关联。它们表示哈希函数使用的比特位数目去分类这些键。全局深度=目录id的比特位数。
局部深度:和全局深度类似,除了局部深度是跟桶关联,而不是跟目录。当桶溢出发生时,局部深度根据全局深度去决定执行的行为。局部深度通常小于等于全局深度。
桶分裂:当桶的元素超过了特定的大小,那么桶分裂成两个部分。 ...
之前做的项目,我就把总结相关的东西复制过来,偏面试向
字典树原理
leetcode简单的字典树实现Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。
请你实现 Trie 类:
Trie() 初始化前缀树对象。
void insert(String word) 向前缀树中插入字符串 word 。
boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。
boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true ;否则,返回 false 。
示例:
1234567891011121314输入["Trie", "insert", "search", "search", "startsWith&qu ...
bomblab的背景很有趣。Dr. Evil把“二进制炸弹”装在了教室的机子里。想要拆掉炸弹,你必须反编译“炸弹”,通过其中的汇编指令推测出可以拆掉炸弹的phrase。
phase11234567890000000000400ee0 <phase_1>: 400ee0: 48 83 ec 08 sub $0x8,%rsp 400ee4: be 00 24 40 00 mov $0x402400,%esi 400ee9: e8 4a 04 00 00 callq 401338 <strings_not_equal> 400eee: 85 c0 test %eax,%eax 400ef0: 74 05 je 400ef7 <phase_1+0x17> 400ef2: e8 43 05 00 00 callq 40143a <explode_bomb> 400ef7: 48 83 ...
如何解决[conversion to 'unsigned char' from 'int' may alter its value]
The compiler is warning you that an int can contain values that doesn’t fit in an unsigned char.
If you are absolutely sure that in this case it will always fit, you can tell that to the compiler by using a static_cast
1c = static_cast<unsigned char>(i);
The the compiler will trust you on that (and it is your fault if it isn’t true).
修改文件或文件夹的权限:如果你想使用某个文件或文件夹,却因为权限不足而报权限被拒绝的错误,可以使用以下命令修改文件或文件夹的权限:
chmod +x filename # 给该文件加上可执行权限chmod +r filename # 给该文件加上可读权限chmod +w filename # 给该文件加上可写权限chmod +rw filename # 给该文件加上可读可写权限chmod -R 777 foldername # 给该文件夹以及其中的所有文件和子文件夹都赋予最高权限(慎用)
如果只想下载一个文件,可以使用gitzip工具。有一个在线网站可以直接进行下载。http://kinolien.github.io/gitzip/
将链接复制到框框里,点击download就可以下载了。
ssh互信的情况下一直报错,确定安全的情况下,可以在客户机.ssh的config文件下加一行:
StrictHostKeyChecking no
也是连虚拟机连不上
Could not establish connection to “workspace”: Port forwarding is disabled.
我遇到的问题是,远程主机的ssh key可能被修改过,但是在.ssh/known_hosts中依然缓存着旧的key,导致登入失败。
解决方法:删除known_hosts中对应的行即可,刷新缓存。
经典书籍学习
未读程序编码假设有一个C程序,有两个文件p1.c和p2.c。我们用Unix命令行编译这些代码:
Linux> gcc -Og -o p p1.c p2.c
实际上gcc命令调用了一整套的程序,将源代码转化成可执行代码:
C预处理器扩展源代码,插入所有用#include命定指定的文件,扩展所有用#define声明指定的宏。
编译器产生两个源文件的汇编代码,名字分别为p1.s和p2.s。
汇编器将汇编代码转化成二进制目标代码文件p1.o和p2.o。
链接器将两个目标代码文件与实现库函数(例printf)的代码合并,并产生最终的可执行代码文件p。
机器级代码计算机系统使用了多种不同的抽象,利用更简单的抽象模型来隐藏实现的细节:
由指令集体系结构或指令集架构来定义机器级程序的格式和行为,它定义了处理器状态、指令的格式、以及每条指令对状态的影响。
机器级程序使用的内存地址是虚拟地址,提供的内存模型看上去是一个很大的、按字节寻址的数组
代码示例12345long mult2(long, long);void multstore(long x, long y, long *dest) ...